Хранение данных приложения с помощью PersistentVolumes

KubernetesBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь хранить данные приложений с помощью PersistentVolumes в Kubernetes.

PersistentVolumes (PV) — это ресурсы Kubernetes, представляющие собой сегмент сетевого хранилища в кластере. Они позволяют хранить данные приложения независимо от жизненного цикла контейнера. Это означает, что данные сохраняются даже в том случае, если контейнер будет завершен или перемещен на другой узел.

В ходе работы вы создадите PersistentVolume и используете его для хранения данных простого веб-приложения. Затем вы измените приложение так, чтобы оно использовало PersistentVolumeClaim (PVC) для доступа к PersistentVolume. В завершение вы измените PVC, чтобы запросить определенные ресурсы хранилища.

Запуск кластера Minikube

Перед созданием ресурсов вам потребуется запущенный кластер Kubernetes. Minikube — это легковесная среда Kubernetes, которая работает на вашей локальной машине.

  1. Перейдите в рабочую директорию:

    Откройте терминал и перейдите в папку проекта по умолчанию:

    cd /home/labex/project
    
  2. Запустите Minikube:

    Запустите Minikube для инициализации кластера Kubernetes:

    minikube start
    
    • Эта команда развернет одноузловой кластер Kubernetes на вашей локальной машине.
    • Запуск Minikube может занять несколько минут в зависимости от производительности вашей системы.
  3. Проверьте работу 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

Пример изменения хранилища PVC

Примените обновленный 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 даже после завершения работы контейнера или его перемещения на другой узел.