Введение
В этой лабораторной работе вы научитесь хранить данные приложений с помощью PersistentVolumes в Kubernetes.
PersistentVolumes (PV) — это ресурсы Kubernetes, представляющие собой сегмент сетевого хранилища в кластере. Они позволяют хранить данные приложения независимо от жизненного цикла контейнера. Это означает, что данные сохраняются даже в том случае, если контейнер будет завершен или перемещен на другой узел.
В ходе работы вы создадите PersistentVolume и используете его для хранения данных простого веб-приложения. Затем вы измените приложение так, чтобы оно использовало PersistentVolumeClaim (PVC) для доступа к PersistentVolume. В завершение вы измените PVC, чтобы запросить определенные ресурсы хранилища.
Запуск кластера Minikube
Перед созданием ресурсов вам потребуется запущенный кластер Kubernetes. Minikube — это легковесная среда Kubernetes, которая работает на вашей локальной машине.
Перейдите в рабочую директорию:
Откройте терминал и перейдите в папку проекта по умолчанию:
cd /home/labex/projectЗапустите Minikube:
Запустите Minikube для инициализации кластера Kubernetes:
minikube start- Эта команда развернет одноузловой кластер Kubernetes на вашей локальной машине.
- Запуск Minikube может занять несколько минут в зависимости от производительности вашей системы.
Проверьте работу Minikube:
Проверьте статус кластера Minikube:
minikube status- Убедитесь, что такие компоненты, как
kubeletиapiserver, имеют статусRunning. - Если кластер не запущен, выполните
minikube startповторно.
- Убедитесь, что такие компоненты, как
Если при запуске Minikube возникли проблемы, при необходимости используйте minikube delete для сброса среды.
Создание PersistentVolume
На этом этапе вы создадите PersistentVolume, который можно использовать для хранения данных. Создайте YAML-файл с именем pv.yaml со следующим содержимым:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/data
Этот файл создает PersistentVolume емкостью 1Gi с режимом доступа ReadWriteOnce. Поле hostPath указывает, что данные будут храниться на хост-машине по пути /mnt/data. Поле persistentVolumeReclaimPolicy установлено в значение Retain, что означает сохранение данных даже после удаления PersistentVolume.
Примените конфигурацию PersistentVolume к вашему кластеру с помощью следующей команды:
kubectl apply -f pv.yaml
Развертывание простого веб-приложения
На этом этапе вы развернете простое веб-приложение, которое будет хранить данные на созданном вами в предыдущем шаге PersistentVolume. Создайте YAML-файл с именем web-app.yaml со следующим содержимым:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 1
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html/data
volumes:
- name: data
persistentVolumeClaim:
claimName: my-pvc
Этот файл создает Deployment с одной репликой и контейнером, использующим образ nginx. Поле volumeMounts указывает, что контейнер должен монтировать PersistentVolume по пути /usr/share/nginx/html/data. Поле volumes указывает, что контейнер должен использовать PersistentVolumeClaim с именем my-pvc.
Примените Deployment к вашему кластеру с помощью следующей команды:
kubectl apply -f web-app.yaml
Создание PersistentVolumeClaim
На этом этапе вы создадите PersistentVolumeClaim, который будет использоваться для запроса хранилища из PersistentVolume, созданного на шаге 2. Создайте YAML-файл с именем pvc.yaml со следующим содержимым:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
Этот файл создает PersistentVolumeClaim с режимом доступа ReadWriteOnce и запросом на 500Mi хранилища из PersistentVolume.
Примените PersistentVolumeClaim к вашему кластеру с помощью следующей команды:
kubectl apply -f pvc.yaml
Проверка сохранности данных
На этом этапе вы убедитесь, что данные сохраняются на PersistentVolume. Вы получите доступ к веб-приложению, работающему в контейнере, и запишете данные на PersistentVolume.
Сначала найдите имя пода, в котором запущено ваше приложение, выполнив следующую команду:
kubectl get pods -l app=web-app
Вы должны увидеть один под, работающий с вашим приложением. Запомните имя этого пода.
Затем выполните следующую команду, чтобы открыть сессию оболочки (shell) внутри контейнера:
kubectl exec -it pod-name -- /bin/sh
Замените pod-name на имя пода, которое вы узнали ранее.
Находясь в сессии оболочки, выполните следующую команду для создания файла test.txt:
echo "This is a test file." > /usr/share/nginx/html/data/test.txt
Эта команда создает файл test.txt с текстом "This is a test file." в директории данных PersistentVolume.
Удалите веб-приложение с помощью следующей команды:
kubectl delete deployment web-app
Заново создайте веб-приложение с помощью следующей команды:
kubectl apply -f web-app.yaml
Убедитесь, что файл, созданный вами в директории данных, по-прежнему существует, выполнив следующие команды:
kubectl get pods -l app=web-app
kubectl exec pod-name -- cat /usr/share/nginx/html/data/test.txt
Замените pod-name на имя пода, которое вы узнали ранее.
Изменение ресурсов хранилища PVC
На этом этапе вы измените PVC, чтобы запросить определенные ресурсы хранилища из PersistentVolume. Измените файл pvc.yaml, чтобы запросить 1Gi хранилища вместо 500Mi.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Добавьте поле allowVolumeExpansion: true в StorageClass в последней строке.
kubectl edit storageclass standard

Примените обновленный PersistentVolumeClaim к вашему кластеру с помощью следующих команд:
kubectl delete deployment web-app
kubectl delete pvc my-pvc
kubectl apply -f web-app.yaml
kubectl apply -f pvc.yaml
Резюме
В этой лабораторной работе вы узнали, как хранить данные приложений с помощью PersistentVolumes в Kubernetes. Вы создали PersistentVolume, развернули простое веб-приложение, использующее этот том, создали PersistentVolumeClaim для запроса хранилища и изменили его для запроса конкретных ресурсов. Вы также убедились, что данные сохраняются на PersistentVolume даже после завершения работы контейнера или его перемещения на другой узел.


