Использование мультизональных классов хранения

Используйте преднастроенные мультизональные классы хранения, чтобы Kubernetes при планировании пода динамически подготавливал для него постоянный том (PV), расположенный в той же зоне доступности, что и сам под. В Kubernetes за такое планирование пода отвечает механизм Topology Spread Constraints. Он помогает повысить отказоустойчивость и обеспечить высокую доступность (high availability) кластера за счет распределения рабочей нагрузки (workload) между разными зонами доступности.

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

  1. Создайте кластер актуальной версии, если это еще не сделано.
  2. Установите и настройте kubectl, если это еще не сделано.
  3. Подключитесь к кластеру при помощи kubectl.

1. Добавьте мультизональный класс хранения (StorageClass) для PV

  1. Создайте файл манифеста для StorageClass, например csi-ceph-hdd.yaml, и добавьте в него следующее содержимое:

    apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: csi-ceph-hddparameters:  type: ceph-hddprovisioner: cinder.csi.openstack.orgreclaimPolicy: DeletevolumeBindingMode: WaitForFirstConsumerallowVolumeExpansion: true

    Здесь:

    • type: ceph-hdd описывает тип диска для PV.

    • volumeBindingMode: WaitForFirstConsumer откладывает создание и привязку PV до момента, когда будет создан первый под, использующий соответствующий PVC. Так этот под будет сначала запланирован на узел, и только после этого Kubernetes создаст для него PV той же зоне доступности, что и узел. Это позволит избежать ситуации, при которой под и PV окажутся в разных зонах доступности.

      Если после первого запуска вы попытаетесь перенести этот под в другую зону доступности, вы получите ошибку, содержащую похожий текст:

      3 node(s) had volume node affinity conflict

      Подробнее о настройках привязки томов в официальной документации Kubernetes.

  2. Примените созданный манифест в кластере:

    kubectl apply -f csi-ceph-hdd.yaml

2. Создайте приложение

  1. Создайте файл манифеста для контроллера рабочей нагрузки типа StatefulSet для пространства имен test-statefulset:

    Здесь:

    • replicas: 3 — количество реплик подов.
    • maxSkew: 1 — максимально допустимое различие в количестве подов между узлами. В этом примере оно не должно превышать 1.
  2. Создайте ресурс Kubernetes на основе манифеста:

    kubectl apply -f test-statefulset.yaml
  3. Просмотрите информацию о созданных подах с помощью команды:

    kubectl get pods -n test-statefulset -o wide

    Пример вывода:

    NAME            READY   STATUS    RESTARTS   AGE     IP               NODE                            NOMINATED NODE   READINESS GATESzone-spread-0   1/1     Running   0          2m42s   10.100.173.129   test-multiaz-node-group-ud1-0   <none>           <none>zone-spread-1   1/1     Running   0          2m30s   10.100.100.128   test-multiaz-node-group-ud2-2   <none>           <none>zone-spread-2   1/1     Running   0          2m18s   10.100.204.193   test-multiaz-node-group-ud1-1   <none>           <none>

    Это означает, что созданы 3 пода в 2 зонах доступности:

    • zone-spread-0 на узле test-multiaz-node-group-ud1-0 в зоне UD1;
    • zone-spread-1 на узле test-multiaz-node-group-ud2-2 в зоне UD2;
    • zone-spread-2 на узле test-multiaz-node-group-ud1-1 в зоне UD1.
  4. Убедитесь, что на основе манифеста для StorageClass созданы PV для каждого пода в его зоне доступности:

    1. Найдите PV, созданные для подов:

      kubectl get pv -o wide
    2. В выведенной таблице найдите значения столбца NODE для каждого из созданных PVC на основе созданного класса хранения csi-ceph-hdd. Пример вывода:

      NAME                                       ...   STATUS    STORAGECLASS   ...   NODE...                                        ...   ...       ...                      pvc-58fd0c60-e825-42a9-a187-b9f092bb077d         Bound     csi-ceph-hdd   ...   test-multiaz-node-group-ud1-0pvc-eb0ee40d-6580-4902-a832-ea192e32f910   ...   Bound     csi-ceph-hdd   ...   test-multiaz-node-group-ud2-2pvc-f32f486e-75e9-4ba5-b553-ffbbad180b91   ...   Bound     csi-ceph-hdd   ...   test-multiaz-node-group-ud1-1

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

Работающий кластер тарифицируется и потребляет вычислительные ресурсы. Если ресурсы Kubernetes, созданные для проверки работы мультизональных классов хранения, вам больше не нужны, удалите их:

  1. Удалите созданное пространство имен test-statefulset и связанные с ним ресурсы:

    kubectl delete ns test-statefulset
  2. Удалите созданные PV.

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