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

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

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

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

Примечание.

Драйвер CSI дисков Azure версии 2 (предварительная версия) повышает масштабируемость и уменьшает задержку отработки отказа pod. Он использует общие диски для подготовки реплик вложений на нескольких узлах кластера и интегрируется с планировщиком pod, чтобы обеспечить выбор узла с репликой вложения при отработке отказа pod. Драйвер CSI для дисков Azure версии 2 (предварительная версия) также предоставляет возможность точной настройки производительности. Если вы заинтересованы в участии в предварительной версии, отправьте запрос: https://aka.ms/DiskCSIv2Preview. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, поэтому возможны критические изменения на этапе предварительной версии. Предварительная версия не рекомендуется для рабочих нагрузок в рабочей среде. Дополнительные сведения см. в статье Дополнительные условия использования Предварительных версий Microsoft 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. Постоянный том может использоваться одним или несколькими модулями pod и может быть подготовлен динамически или статически. В этой статье описывается динамическое создание постоянных томов с помощью диска Azure, используемого одним модулем pod в кластере службы Azure Kubernetes (AKS). Сведения о статической подготовке см. в разделе Создание статического тома с дисками Azure.

Дополнительные сведения о томах Kubernetes см. в статье, посвященной возможностям хранения данных приложений в AKS.

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

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

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

  • managed-csi использует локально избыточное хранилище на базе SSD ценовой категории "Стандартный" для создания управляемого диска. Действующий начиная с Kubernetes версии 1.29, в кластерах Служба Azure Kubernetes (AKS), развернутых в нескольких зонах доступности, этот класс хранилища использует хранилище, избыточное между зонами SSD Azure standard (ZRS), для создания управляемых дисков.
  • managed-csi-premium использует локально избыточное хранилище Azure ценовой категории "Премиум" для создания управляемого диска. Эффективно начиная с Kubernetes версии 1.29, в кластерах Служба Azure Kubernetes (AKS), развернутых в нескольких зонах доступности, этот класс хранилища использует хранилище, избыточное между зонами Azure Premium (ZRS), для создания управляемых дисков.

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

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

Создайте пример 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, гарантирующий изменение сразу же после создания заявки на постоянный том. Когда пулы узлов ограничены топологией, например, при использовании зон доступности, постоянные тома будут привязаны или подготовлены без знания требований расписания pod.

Для решения этой ситуации можно использовать volumeBindingMode: WaitForFirstConsumer, что откладывает привязку и подготовку постоянных томов до тех пор, пока не будет создан модуль, использующий заявку на постоянный том. Таким образом, постоянный том будет подготовлен в зоне доступности (или другой топологии), указанной в ограничениях расписания 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).

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

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

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

Создание новой заявки на постоянный том на основе моментального снимка тома. Используйте моментальный снимок, созданный на предыдущем шаге, и создайте новую заявку на постоянный том и новый 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

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

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

Примечание.

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

В AKS встроенный класс хранения managed-csi уже поддерживает расширение, поэтому используйте заявку PVC, созданную ранее с этим классом хранения. Заявка на постоянный том запросила постоянный том объемом 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"}}}}'

Примечание.

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

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

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 ГиБ. Дополнительные сведения о подготовленных операциях ввода-вывода в секунду дисков 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
(...)

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