Поделиться через


Использование драйвера интерфейса контейнерного хранилища (CSI) дисков Azure в Службе Azure Kubernetes (AKS)

Драйвер интерфейса хранилища контейнеров Azure (CSI) — это драйвер, соответствующий спецификации CSI, используемый Служба Azure Kubernetes (AKS) для управления жизненным циклом диска Azure.

CSI является стандартом для подключения произвольных блоковых и файловых систем хранения к контейнеризованным рабочим нагрузкам на Kubernetes. После внедрения и использования CSI AKS сможет выполнять запись, развертывание и итерацию подключаемых модулей, чтобы предоставлять новые или улучшать существующие системы хранения в Kubernetes. Использование CSI-драйверов в AKS позволяет избежать необходимости изменять основной код Kubernetes и ожидать его циклов выпуска.

Сведения о создании кластера AKS с поддержкой драйвера CSI см. в статье Включение драйвера CSI в AKS. В этой статье описывается, как использовать драйвер CSI диска Azure.

Примечание.

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

Функции CSI-драйвера для дисков Azure

В дополнение к функциям драйвера в дереве драйвер Azure Disk CSI поддерживает следующие функции:

  • Улучшения производительности во время параллельного подключения к диску и отсоединения
    • Встроенные драйверы присоединяют или отсоединяют диски в последовательном режиме, а драйверы CSI присоединяют или отсоединяют диски пакетно. Наблюдается значительное улучшение, когда к одному узлу подключено несколько дисков.
  • Поддерживаются SSD уровня "Премиум" версии 1 и версии 2.
    • PremiumV2_LRS поддерживает только режим кэширования None
  • Поддержка дисков с зональной избыточностью (ZRS)
    • Типы дисков Premium_ZRS и StandardSSD_ZRS поддерживаются. Диск ZRS можно запланировать на узле зоны или узле, не связанном с зоной, без ограничений, предполагающих, что том диска должен находиться в той же зоне, что и данный узел. Дополнительные сведения, в том числе поддерживаемые регионы, см. в разделе Зонально избыточное хранилище для управляемых дисков.
  • Моментальный снимок
  • Клон тома
  • Изменение размера диска PV без простоев

Примечание.

В зависимости от используемого типа SKU виртуальной машины драйвер CSI диска Azure может иметь ограничение на количество томов на узел. Для некоторых мощных виртуальных машин (например, 16 ядер) ограничение составляет 64 тома на узел. Чтобы определить ограничение на номер SKU виртуальной машины, просмотрите столбец "Максимальное количество дисков данных" для каждого предлагаемого номера SKU виртуальной машины. Список предлагаемых номеров SKU виртуальных машин и их соответствующих подробных ограничений емкости см. в разделе "Размеры виртуальных машин общего назначения".

Использование постоянных томов CSI с дисками Azure

Постоянный том (PV) — это часть хранилища, которая подготовлена к использованию для модулей pod Kubernetes. Постоянный том может использоваться одним или несколькими модулями и может быть подготовлен динамически или статически. В этой статье показано, как динамически создавать PVs с использованием диска Azure для применения одним pod'ом в кластере AKS. Для статического выделения ресурсов см. раздел Создание статического тома с дисками Azure.

Для получения дополнительной информации о томах Kubernetes см. варианты хранения для приложений в AKS.

Динамически создавайте постоянные тома дисков (PVs) Azure с помощью встроенных классов хранения.

Класс хранения используется для определения того, как единица хранения создается динамически с помощью постоянного тома. Дополнительные сведения о классах хранения Kubernetes см. в разделе Классы хранения Kubernetes.

При использовании драйвера CSI дисков Azure в AKS существует еще два встроенных компонентов, которые используют драйвер хранения Azure Disk CSI. Дополнительные классы хранения CSI создаются вместе с кластером наряду с классами хранения по умолчанию в дереве.

  • managed-csi использует локально-резервированное хранилище Azure Standard SSD для создания управляемого диска. Начиная с версии 1.29 Kubernetes, в кластерах службы Azure Kubernetes Service (AKS), развернутых в нескольких зонах доступности, этот класс хранилища использует зонально избыточное хранилище Azure Standard SSD (ZRS) для создания управляемых дисков.
  • managed-csi-premium: использует Premium LRS Azure для создания управляемого диска. Начиная с версии Kubernetes 1.29, в кластерах Службы Kubernetes Azure (AKS), развернутых в нескольких зонах доступности, этот класс хранилища использует зонально-избыточное хранилище Azure Premium (ZRS) для создания управляемых дисков.

Политика восстановления в обоих классах хранения гарантирует, что базовые диски Azure будут удалены при удалении соответствующего персистентного тома. Классы хранения также настраивают PV на расширение. Вам просто нужно изменить заявку на постоянный том (PVC), указав новый размер.

Чтобы использовать эти классы хранения, создайте PVC и соответствующий модуль, который ссылается на них и использует их. Заявка на постоянный том (PVC) используется для автоматической подготовки хранилища на основе класса хранения. Запрос на постоянный том может использовать один из предсозданных классов хранения или класс хранения, определяемый пользователем, для создания диска под управлением Azure для необходимого SKU и размера. При создании описания pod указывается PVC (заявка на постоянный том), чтобы запросить необходимое хранилище.

Создайте пример pod и соответствующую заявку на постоянное хранилище, выполнив команду kubectl apply:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/pvc-azuredisk-csi.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/nginx-pod-azuredisk.yaml

Выходные данные команды будут выглядеть примерно так:

persistentvolumeclaim/pvc-azuredisk created
pod/nginx-azuredisk created

Когда pod перейдет в рабочее состояние, выполните следующую команду, чтобы создать новый файл с именем test.txt.

kubectl exec nginx-azuredisk -- touch /mnt/azuredisk/test.txt

Чтобы проверить, правильно ли подключен диск, выполните следующую команду и убедитесь, что файл test.txt отображается в выходных данных:

kubectl exec nginx-azuredisk -- ls /mnt/azuredisk

lost+found
outfile
test.txt

Создание пользовательского класса хранения

Классы хранения по умолчанию подходят для большинства распространенных сценариев. В некоторых случаях может потребоваться настроить собственный класс хранения с собственными параметрами. Например, вы захотите изменить класс volumeBindingMode.

Можно использовать класс volumeBindingMode: Immediate, гарантирующий, что это происходит немедленно после создания запроса на постоянный том. Когда пулы узлов ограничены топологией, например, при использовании зон доступности, постоянные тома (PVs) могут быть привязаны или созданы без учета требований расписания pod.

Для решения этой ситуации можно использовать volumeBindingMode: WaitForFirstConsumer, что откладывает привязку и подготовку постоянных томов до тех пор, пока не будет создан модуль, использующий заявку на постоянный том. Таким образом, постоянный том (PV) будет подготовлен в зоне доступности (или другой топологии), указанной в ограничениях планирования pod, и будет соответствовать этим ограничениям. Классы хранения по умолчанию используют класс volumeBindingMode: WaitForFirstConsumer.

Создайте файл с именем sc-azuredisk-csi-waitforfirstconsumer.yaml и вставьте в него следующий манифест. Класс хранения совпадает с нашим классом хранения managed-csi, но у него другой класс volumeBindingMode.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: azuredisk-csi-waitforfirstconsumer
provisioner: disk.csi.azure.com
parameters:
  skuname: StandardSSD_LRS
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

Создайте класс хранения, выполнив команду kubectl apply и укажите свой файл sc-azuredisk-csi-waitforfirstconsumer.yaml:

kubectl apply -f sc-azuredisk-csi-waitforfirstconsumer.yaml

Выходные данные команды будут выглядеть примерно так:

storageclass.storage.k8s.io/azuredisk-csi-waitforfirstconsumer created

Моментальные снимки томов

Драйвер CSI диска Azure поддерживает создание моментальных снимков постоянных томов. В рамках этой возможности драйвер может выполнять полные или добавочные моментальные снимки в зависимости от значения, заданного в параметре incremental (по умолчанию это значение равно true).

В следующей таблице приведены сведения обо всех параметрах.

Имя. Значение Доступное значение Обязательно Значение по умолчанию
resourceGroup Группа ресурсов для хранения моментальных снимков СУЩЕСТВУЮЩАЯ ГРУППА РЕСУРСОВ Нет Если этот параметр не указан, моментальный снимок будет храниться в той же группе ресурсов, что и исходные диски Azure
постепенный Создание полного или добавочного моментального снимка true, false Нет true
теги Теги дисков Azure Формат тега: 'key1=val1,key2=val2' Нет ""
пользовательский агент Агент пользователя, используемый для отслеживания потребления услуг клиентами No Созданный useragent в формате driverName/driverVersion compiler/version (OS-ARCH)
ID подписки Укажите идентификатор подписки Azure, в которой будут созданы диски Azure Идентификатор подписки Azure Нет Если значение не пустое, resourceGroup должен быть указан, incremental должен быть установлен как false

Создание моментального снимка тома

Примечание.

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

Как пример возможностей, создайте класс моментальных снимков объема с помощью команды kubectl apply:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/storageclass-azuredisk-snapshot.yaml

Выходные данные команды будут выглядеть примерно так:

volumesnapshotclass.snapshot.storage.k8s.io/csi-azuredisk-vsc created

Теперь создадим моментальный снимок тома из заявки на постоянный том, который мы динамически создали в начале этого учебника, pvc-azuredisk.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/azuredisk-volume-snapshot.yaml

Выходные данные команды будут выглядеть примерно так:

volumesnapshot.snapshot.storage.k8s.io/azuredisk-volume-snapshot created

Чтобы убедиться, что снимок был создан правильно, выполните следующую команду:

kubectl describe volumesnapshot azuredisk-volume-snapshot

Выходные данные команды будут выглядеть примерно так:

Name:         azuredisk-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T05:27:58Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  714582
  Self Link:         /apis/snapshot.storage.k8s.io/v1/namespaces/default/volumesnapshots/azuredisk-volume-snapshot
  UID:               dd953ab5-6c24-42d4-ad4a-f33180e0ef87
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azuredisk
  Volume Snapshot Class Name:      csi-azuredisk-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-dd953ab5-6c24-42d4-ad4a-f33180e0ef87
  Creation Time:                       2020-08-31T05:27:59Z
  Ready To Use:                        true
  Restore Size:                        10Gi
Events:                                <none>

Создание новой заявки на постоянный том на основе моментального снимка тома

Вы можете создать новую заявку на постоянный том (Persistent Volume Claim, PVC) на основе снимка тома. Используйте моментальный снимок, созданный на предыдущем шаге, и создайте новый запрос на постоянный том и новый pod для его использования.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/pvc-azuredisk-snapshot-restored.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/nginx-pod-restored-snapshot.yaml

Выходные данные команды будут выглядеть примерно так:

persistentvolumeclaim/pvc-azuredisk-snapshot-restored created
pod/nginx-restored created

Наконец, убедитесь, что это тот же PVC, созданный ранее, проверив его содержимое с помощью выполнения следующей команды:

kubectl exec nginx-restored -- ls /mnt/azuredisk

Выходные данные команды будут выглядеть примерно так:

lost+found
outfile
test.txt

Как и ожидалось, мы по-прежнему можем увидеть созданный ранее файл test.txt.

Клонирование томов

Клонированный том определяется как дубликат существующего тома Kubernetes. Дополнительные сведения о клонировании томов в Kubernetes см. в концептуальной документации по клонированию томов.

Драйвер CSI для дисков Azure поддерживает клонирование томов. Чтобы продемонстрировать, создайте клонированный томранее созданногоazuredisk-pvc и новый pod для использования.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/pvc-azuredisk-cloning.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/nginx-pod-restored-cloning.yaml

Выходные данные команды будут выглядеть примерно так:

persistentvolumeclaim/pvc-azuredisk-cloning created
pod/nginx-restored-cloning created

Вы можете проверить содержимое клонированного тома, выполнив следующую команду и убедившись, что файл test.txt создан:

kubectl exec nginx-restored-cloning -- ls /mnt/azuredisk

Выходные данные команды будут выглядеть примерно так:

lost+found
outfile
test.txt

Изменение размера постоянного тома без остановки работы

Для PVC можно запросить больший объем. Измените объект PVC и укажите больший размер. Это изменение активирует расширение базового тома, которое производит резервное копирование постоянного тома.

Примечание.

Новый постоянный том никогда не будет создан для удовлетворения заявки. Вместо этого изменяется размер существующего тома.

В AKS встроенный класс хранения managed-csi уже поддерживает расширение, поэтому используйте заявку PVC, созданную ранее с этим классом хранения. PersistentVolumeClaim запросила постоянный том объемом 10 ГиБ. Можно подтвердить, выполнив следующую команду:

kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk

Выходные данные команды будут выглядеть примерно так:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc        9.8G   42M  9.8G   1% /mnt/azuredisk

Разверните PVC, увеличив spec.resources.requests.storage поле, посредством выполнения следующей команды:

kubectl patch pvc pvc-azuredisk --type merge --patch '{"spec": {"resources": {"requests": {"storage": "15Gi"}}}}'

Примечание.

Сжатие постоянных томов сейчас не поддерживается. Попытка изменить существующий PVC на размер меньше текущего приводит к следующему сообщению об ошибке: The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.

Выходные данные команды будут выглядеть примерно так:

persistentvolumeclaim/pvc-azuredisk patched

Выполните следующую команду, чтобы убедиться, что размер тома увеличился:

kubectl get pv

Выходные данные команды будут выглядеть примерно так:

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS   REASON   AGE
pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            Delete           Bound    default/pvc-azuredisk                     managed-csi             2d2h
(...)

И через несколько минут выполните следующие команды, чтобы подтвердить размер PVC:

kubectl get pvc pvc-azuredisk

Выходные данные команды будут выглядеть примерно так:

NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-azuredisk   Bound    pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            managed-csi    2d2h

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

kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk

Выходные данные команды будут выглядеть примерно так:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         15G   46M   15G   1% /mnt/azuredisk

Всплеск по запросу

Модель взрывного увеличения ёмкости дисков по запросу позволяет диску работать в усиленном режиме, когда его потребности превышают текущую ёмкость. В этой модели за каждый всплеск активности диска взимается дополнительная плата. Ускорение дисков по требованию доступно только для дисков SSD (цен. категория "Премиум") емкостью более 512 ГиБ. Дополнительные сведения о количестве операций ввода-вывода в секунду (IOPS) и пропускной способности на диск для премиальных SSD см. в разделе Размер премиум SSD. Кредитное ускорение дисков — это когда диск может врываться только в том случае, если в его кредитном резервуаре накоплены кредиты. Ускорение на основе кредитов не приводит к дополнительным расходам при всплеске ускорения диска. Усиление за счет кредитов доступно только для SSD "Премиум" емкостью 512 ГиБ и меньше, и SSD "Стандартный" емкостью 1024 ГиБ и меньше. Дополнительные сведения об ускорении по запросу см. в разделе Ускорение по запросу.

Внимание

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

Чтобы создать постоянный том SSD премиум с включенным бурстингом по запросу, можно создать новый класс хранения, установив параметр enableBursting в true, как показано в следующем шаблоне YAML. Дополнительные сведения о включении бёрстинга по запросу см. в разделе Ускорение по запросу. Дополнительные сведения о создании собственного класса хранения с поддержкой всплесков по требованию см. в разделе Создание управляемого драйвера CSI с хранилищем класса «Премиум» с поддержкой всплесков.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: burstable-managed-csi-premium
provisioner: disk.csi.azure.com
parameters:
  skuname: Premium_LRS
  enableBursting: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

Контейнеры Windows

Драйвер CSI диска Azure поддерживает узлы и контейнеры Windows. Если вы хотите использовать контейнеры Windows, следуйте указаниям в Кратком руководстве по контейнерам Windows, чтобы добавить пул узлов Windows.

После создания пула узлов Windows теперь можно использовать встроенные классы хранения, такие как managed-csi. Вы можете развернуть пример набора с отслеживанием состояния на основе Windows, который сохранит метки времени в файле data.txt, выполнив следующую команду kubectl apply:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/windows/statefulset.yaml

Выходные данные команды будут выглядеть примерно так:

statefulset.apps/busybox-azuredisk created

Чтобы проверить содержимое тома, выполните следующую команду:

kubectl exec -it busybox-azuredisk-0 -- cat c:\\mnt\\azuredisk\\data.txt # on Linux/MacOS Bash
kubectl exec -it busybox-azuredisk-0 -- cat c:\mnt\azuredisk\data.txt # on Windows Powershell/CMD

Выходные данные команды будут выглядеть примерно так:

2020-08-27 08:13:41Z
2020-08-27 08:13:42Z
2020-08-27 08:13:44Z
(...)

Следующие шаги