VK Cloud logo
Обновлена 15 апреля 2024 г. в 08:50

Работа с постоянными томами

Постоянные тома (persistent volumes) можно подключать к простым демо-приложениям различными способами. Далее для подключения будут использованы Persistent Volume Claims (PVC). Для проверки работоспособности приложений и подключенных к ним томов будет создан ресурс Ingress.

1. Подготовительные шаги

  1. Создайте кластер Kubernetes самой актуальной версии.

    При создании кластера:

    • Выберите опцию Назначить внешний IP.

    • Создайте одну группу узлов с типом виртуальной машины STD3-2-8 в зоне доступности MS1 с суммарными вычислительными ресурсами: 2 vCPU, 8 ГБ RAM (или можно выбрать более производительный тип). Это необходимо, чтобы можно было разместить все создаваемые далее объекты.

      Например, можно создать одну группу узлов с типом виртуальной машины STD3-2-8.

    Прочие параметры кластера выберите на свое усмотрение.

  2. Убедитесь, что аддон NGINX Ingress (ingress-nginx) установлен в кластере с параметрами по умолчанию. Он потребуется для обеспечения доступа к демо-приложениям.

  3. Убедитесь, что вы можете подключиться к кластеру с помощью kubectl.

  4. Установите curl, если утилита еще не установлена.

2. Создайте демо-приложения и подключите к ним постоянные тома

Далее будет продемонстрировано, как создать несколько веб-приложений на базе NGINX для отображения веб-страниц, записанных на подключенные к этим приложениям постоянные тома. Используется образ NGINX nginxdemos/nginx-hello, который отображает веб-страницы из каталога /usr/share/nginx/html, поэтому все постоянные тома будут монтироваться в поды приложений именно по этому пути.

Можно создать одно или несколько демо-приложений, в зависимости от того, с какими способами подключения постоянных томов нужно познакомиться.

Подключение блочных хранилищ

Блочные хранилища подключаются к кластеру с помощью Cinder CSI.

При использовании хранилищ такого типа:

  • только один под может иметь доступ к хранилищу (несколько подов не смогут одновременно использовать блочное хранилище);
  • как следствие, для доступа к хранилищу должен использоваться режим ReadWriteOnce.

В этом примере будут созданы:

  1. Диск в разделе Облачные вычисления платформы VK Cloud.

  2. Постоянный том, соответствующий этому диску.

  3. Статический PVC, использующий уже созданный постоянный том.

  4. Приложение tea в виде развертывания (deployment) из одного пода и соответствующего ему сервиса (service).

    Для этого приложения также будет создан контейнер инициализации (initContainer), который запишет веб-страницу на постоянный том.

Чтобы подключить постоянный том с помощью статического PVC:

  1. Создайте сетевой HDD-диск.

    При создании укажите:

    • Название диска: любое, например, disk-tea.
    • Источник: пустой диск.
    • Тип диска: сетевой HDD-диск (ceph-hdd).
    • Зону доступности: MS1.
    • Размер: 1 ГБ.

    Прочие опции и параметры оставьте без изменений.

  2. Скопируйте идентификатор созданного диска, например f6d8bf3b-aaaa-bbbb-cccc-4ece8e353246.

  3. Изучите особенности подключения:

    1. Размеры хранилища, указываемые в параметрах spec.capacity.storage для ресурса PersistentVolume и spec.resources.requests.storage для ресурса PersistentVolumeClaim, должны совпадать с размером соответствующего диска. В данном примере — 1 ГБ.
    2. Для ресурса PersistentVolumeClaim используйте пустое значение в параметре класса хранения storageClassName.
    3. Режим доступа к хранилищу задается в параметре spec.accessModes для ресурса PersistentVolume.
    4. Зоны доступности диска и worker-узла, на котором будет располагаться под приложения, должны совпадать. В противном случае попытка подключить к поду на этом узле постоянный том, соответствующий диску, завершится неудачей. В данном примере под будет размещен на группе worker-узлов в зоне доступности MS1 и использовать диск из этой же зоны.
    5. Используется ReclaimPolicy Retain для постоянного тома. Политика Delete не используется, чтобы можно было контролировать состояние диска вручную и случайно не удалить его.
  4. Создайте манифест для приложения tea.

    Для ресурса PersistentVolume укажите идентификатор созданного диска в параметре spec.cinder.volumeID.

  5. Примените этот манифест в кластере для создания всех необходимых ресурсов:

    kubectl apply -f ./tea.yaml

Подключение файловых хранилищ

Файловые хранилища подключаются к кластеру с помощью постоянного тома, который настроен на использование существующего хранилища по нужному протоколу, например, NFS.

При использовании хранилищ такого типа:

  • сразу несколько подов могут иметь доступ к хранилищу;
  • как следствие, для доступа к хранилищу должен использоваться режим ReadWriteMany.

В этом примере будут созданы:

  1. Файловое NFS-хранилище в разделе Облачные вычисления платформы VK Cloud.
  2. Постоянный том, соответствующий этому хранилищу.
  3. Статический PVC, использующий уже созданный постоянный том.
  4. Приложение milkshake в виде StatefulSet из двух подов, а также соответствующие сервисы (service).

Чтобы подключить постоянный том NFS с помощью статического PVC:

  1. Создайте файловое хранилище.

    При создании укажите:

    • Имя файлового хранилища: любое, например, storage-milkshake.
    • Размер хранилища: 10 ГБ.
    • Протокол: NFS.
    • Cеть: сеть и подсеть, в которых размещен кластер Kubernetes. Эту информацию можно узнать на странице кластера.
    • Cеть файлового хранилища: существующая сеть. Если подходящей сети нет в списке, выберите пункт Создать новую сеть.
  2. Посмотрите информацию о созданном файловом хранилище.

    Сохраните значение параметра Точка подключения.

  3. Изучите особенности подключения:

    1. Размеры хранилища, указываемые в параметрах spec.capacity.storage и spec.resources.requests.storage для ресурса PersistentVolumeClaim, должны совпадать с размером созданного файлового хранилища. В данном примере — 10 ГБ.

    2. Для ресурса PersistentVolumeClaim используйте пустое значение в параметре класса хранения storageClassName.

    3. Для ресурса PersistentVolume:

      1. Режим доступа к хранилищу задается в параметре spec.accessModes для ресурса PersistentVolume.
      2. В наборе параметров spec.mountOptions должна присутствовать запись nfsvers с версией 4.0.
    4. Вместо контейнера инициализации для записи веб-страницы на постоянный том используется однократно запускаемое задание Kubernetes (job). Такой подход работает, потому что в этом случае все поды будут иметь доступ к одному и тому же постоянному тому.

    5. Используется ReclaimPolicy Retain для постоянного тома, т.к. политика Recycle не позволит мгновенно удалить том, когда он станет не нужен. Очистка тома от данных занимает длительное время. Политика Delete не используется, чтобы можно было контролировать состояние хранилища вручную и случайно не удалить его.

  4. Создайте манифест для приложения milkshake.

    Для ресурса PersistentVolume укажите:

    • IP-адрес из параметра Точка подключения файлового хранилища в качестве значения параметра spec.nfs.server.
    • Данные после IP-адреса (/shares/...) в качестве значения параметра spec.nfs.path.
  5. Примените этот манифест в кластере для создания всех необходимых ресурсов:

    kubectl apply -f ./milkshake.yaml

3. Проверьте работоспособность демо-приложений и постоянных томов

  1. Создайте манифест для ресурса Ingress, через который будут проходить запросы к приложениям.

  2. Примените этот манифест в кластере для создания всех необходимых ресурсов:

    kubectl apply -f ./cafe-ingress.yaml
  3. Определите публичный IP-адрес Ingress-контроллера.

  4. Проверьте доступность приложений с помощью curl, используя IP-адрес Ingress-контроллера.

    Выполните команду:

    curl --resolve cafe.example.com:80:<IP-адрес Ingress> http://cafe.example.com/tea

    Должен быть выведен ответ:

    The tea pod says Hello World to everyone! This file is located on the statically claimed persistent volume.

Удалите неиспользуемые ресурсы

  1. Если созданные ресурсы Kubernetes вам больше не нужны, удалите их.

    kubectl delete -f ./cafe-ingress.yamlkubectl delete -f ./milkshake.yamlkubectl delete -f ./juice.yamlkubectl delete -f ./coffee.yamlkubectl delete -f ./tea.yaml
  2. Удалите неиспользуемые хранилища:

    1. Если диск, который использовался приложением tea, вам больше не нужен — удалите его.

    2. Если NFS-хранилище, которое использовалось приложением milkshake, вам больше не нужно — удалите его.

    Все другие хранилища Cinder, созданные с помощью динамических PVC, будут удалены автоматически.

  3. Работающий кластер потребляет вычислительные ресурсы. Если он вам больше не нужен: