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

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

Введение

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

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

В рамках этой лабораторной работы вы создадите PersistentVolume и используете его для хранения данных простого веб-приложения. Затем вы измените приложение, чтобы оно обращалось к PersistentVolume через PersistentVolumeClaim (PVC). Наконец, вы измените 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.

Примените развертывание к вашему кластеру с помощью следующей команды:

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

Пример изменения хранилища 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, развернули простое веб-приложение, использующее этот PersistentVolume, создали PersistentVolumeClaim для запроса хранилища и изменили PVC для получения определенного объема ресурсов. Вы также убедились, что данные сохраняются на PersistentVolume даже после завершения работы контейнера или его переноса на другой узел.