Введение
В этой лабораторной работе вы узнаете, как сохранять данные приложений с помощью PersistentVolumes в Kubernetes.
PersistentVolumes (PV) — это ресурсы Kubernetes, представляющие собой сетевое хранилище в кластере. Они могут использоваться для хранения данных приложений независимо от жизненного цикла контейнера. Это означает, что данные сохраняются даже в том случае, если контейнер завершает работу или переносится на другой узел.
В рамках этой лабораторной работы вы создадите PersistentVolume и используете его для хранения данных простого веб-приложения. Затем вы измените приложение, чтобы оно обращалось к PersistentVolume через PersistentVolumeClaim (PVC). Наконец, вы измените 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.
Примените развертывание к вашему кластеру с помощью следующей команды:
kubectl apply -f web-app.yaml
Создание PersistentVolumeClaim
На этом шаге вы создадите PersistentVolumeClaim, который будет использоваться для запроса хранилища из PersistentVolume, созданного на первом шаге. Создайте 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, развернули простое веб-приложение, использующее этот PersistentVolume, создали PersistentVolumeClaim для запроса хранилища и изменили PVC для получения определенного объема ресурсов. Вы также убедились, что данные сохраняются на PersistentVolume даже после завершения работы контейнера или его переноса на другой узел.


