Использование драйвера Container Storage Interface (CSI) для Файлов Azure в Службе Azure Kubernetes (AKS)

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

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

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

Примечание.

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

Новые возможности драйвера CSI Файлов Azure

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

Использование постоянного тома с Файлами Azure

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

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

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

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

Класс хранения используется для определения того, как создается файловый ресурс Azure. Учетная запись хранения автоматически создается в группе ресурсов узла для использования с классом хранилища для хранения общей папки Azure. Выберите один из следующих SKU для избыточности хранилища Azure для skuName:

  • Standard_LRS — локально избыточное хранилище ценовой категории "Стандартный";
  • Standard_GRS — геоизбыточное хранилище ценовой категории "Стандартный";
  • Standard_ZRS — хранилище ценовой категории "Стандартный", избыточное в пределах зоны;
  • Standard_RAGRS — геоизбыточное хранилище ценовой категории "Стандартный" с доступом на чтение;
  • Standard_RAGZRS — хранилище, геоизбыточное между зонами, с доступом на чтение ценовой категории "Стандартный".
  • Premium_LRS — локально избыточное хранилище класса Premium.
  • Premium_ZRS — избыточное между зонами хранилище уровня "Премиум".

Примечание.

Файлы Azure поддерживает общие папки Azure Premium. Минимальная емкость общей папки составляет 100 ГиБ. Мы рекомендуем использовать общие папки Azure Premium вместо общих папок уровня "Стандартный", так как общие папки класса Premium обеспечивают более высокую производительность, поддержку дисков с низкой задержкой для рабочих нагрузок с интенсивным вводом-выводом.

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

  • azurefile-csi: использует Azure Standard служба хранилища для создания общей папки Azure.
  • azurefile-csi-premium: использует Azure хранилище класса Premium для создания общей папки Azure.

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

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

Создайте пример PVC и pod для вывода текущей даты в outfile с помощью команды kubectl apply.

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

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

persistentvolumeclaim/pvc-azurefile created
pod/nginx-azurefile created

После того как модуль Pod перейдет в состояние выполнения, можно проверить, правильно ли подключена общая папка. Для этого воспользуйтесь следующей командой и убедитесь, что выходные данные содержат outfile.

kubectl exec nginx-azurefile -- ls -l /mnt/azurefile

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

total 29
-rwxrwxrwx 1 root root 29348 Aug 31 21:59 outfile

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

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

В подключенных общих папках Kubernetes для параметров fileMode и dirMode используется значение по умолчанию 0777. Для объекта класса хранения можно указать различные параметры подключения.

Создайте файл с именем azure-file-sc.yaml и вставьте в него следующий пример манифеста.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0640
  - file_mode=0640
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict # https://linux.die.net/man/8/mount.cifs
  - nosharesock
parameters:
  skuName: Standard_LRS

Создайте класс хранения с помощью команды kubectl apply.

kubectl apply -f azure-file-sc.yaml

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

storageclass.storage.k8s.io/my-azurefile created

Драйвер CSI Файлов Azure поддерживает создание моментальных снимков постоянных томов и базовых общих папок.

Примечание.

Этот драйвер поддерживает только создание моментальных снимков; восстановление из моментального снимка не поддерживается этим драйвером. Моментальные снимки можно восстановить на портале Azure или в CLI. Дополнительные сведения о создании и восстановлении моментального снимка см. в статье Общие сведения о моментальных снимках общих ресурсов для Файлов Azure.

Создайте класс моментальных снимков томов с помощью команды kubectl apply:

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

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

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

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

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

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

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

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

kubectl describe volumesnapshot azurefile-volume-snapshot

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

Name:         azurefile-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1beta1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T22:37:41Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  955091
  Self Link:         /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/azurefile-volume-snapshot
  UID:               c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azurefile
  Volume Snapshot Class Name:      csi-azurefile-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
  Ready To Use:                        false
Events:                                <none>

Изменение размера постоянного тома

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

Примечание.

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

Сжатие постоянных томов сейчас не поддерживается.

В AKS встроенный класс хранения azurefile-csi уже поддерживает расширение, поэтому используйте заявку PVC, созданную ранее с этим классом хранения. ПВХ попросил 100 ХиБ-файловую папку. Это можно проверить, запустив:

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

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

Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  100G  128K  100G   1% /mnt/azurefile

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

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

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

persistentvolumeclaim/pvc-azurefile patched

Убедитесь, что в PVC и файловой системе в модуле Pod отображается новый размер:

kubectl get pvc pvc-azurefile
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
pvc-azurefile   Bound    pvc-5e5d9980-da38-492b-8581-17e3cad01770   200Gi      RWX            azurefile-csi   64m

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile
Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  200G  128K  200G   1% /mnt/azurefile

Использование постоянного тома с частным хранилищем Файлов Azure (частная конечная точка)

Если ресурсы Файлы Azure защищены с помощью частной конечной точки, необходимо создать собственный класс хранилища. Убедитесь, что параметры DNS настроены для разрешения IP-адреса частной конечной точки в полное доменное имя строка подключения. Настройте следующие параметры:

  • resourceGroup: группа ресурсов, в которой развернута учетная запись хранения.
  • storageAccount: имя учетной записи хранения.
  • server: полное доменное имя частной конечной точки учетной записи хранения.

Создайте файл с именем private-azure-file-sc.yamlи вставьте следующий пример манифеста в файл. Замените значения для <resourceGroup> и <storageAccountName>.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: private-azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  resourceGroup: <resourceGroup>
  storageAccount: <storageAccountName>
  server: <storageAccountName>.file.core.windows.net
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict  # https://linux.die.net/man/8/mount.cifs
  - nosharesock  # reduce probability of reconnect race
  - actimeo=30  # reduce latency for metadata-heavy workload

Создайте класс хранилища с помощью kubectl apply команды:

kubectl apply -f private-azure-file-sc.yaml

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

storageclass.storage.k8s.io/private-azurefile-csi created

Создайте файл с именем private-pvc.yamlи вставьте следующий пример манифеста в файл:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: private-azurefile-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: private-azurefile-csi
  resources:
    requests:
      storage: 100Gi

Создайте PVC с помощью команды kubectl apply.

kubectl apply -f private-pvc.yaml

Общие файловые ресурсы NFS

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

Этот параметр оптимизирован для рабочих нагрузок произвольного доступа с обновлениями данных на месте и обеспечивает полную поддержку файловой системы POSIX. В этом разделе показано, как использовать общие папки NFS с драйвером CSI службы "Файлы Azure" в кластере AKS.

Необходимые компоненты

  • Удостоверение уровня управления кластером AKS (то есть имя кластера AKS) добавляется в роль участника в виртуальной сети и NetworkSecurityGroup.
  • Субъект-служба кластера AKS или управляемое удостоверение службы (MSI) необходимо добавить в роль участника в учетную запись хранения.

Примечание.

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

Оптимизация параметров размера чтения и записи

В этом разделе содержатся сведения о подходе к настройке производительности NFS с драйвером CSI Файлы Azure с параметрами rsize и wsize. Параметры rsize и wsize задают максимальный размер передачи операции NFS. Если rsize или wsize не указан на подключении, клиент и сервер согласовывают наибольший размер, поддерживаемый двумя. В настоящее время Azure NetApp Files и современные дистрибутивы Linux поддерживают размер данных для чтения и записи до 1048 576 байтов (1 МиБ).

Оптимальная производительность основана на эффективном обмене данными между клиентом и сервером. Увеличение или уменьшение значений размера параметра чтения и записи может повысить производительность NFS. Размер пакетов чтения и записи, передаваемых между клиентом и сервером, по умолчанию — 8 КБ для NFS версии 2 и 32 КБ для NFS версии 3 и 4. Эти значения по умолчанию могут быть слишком большими или слишком маленькими. Сокращение rsize и wsize может повысить производительность NFS в перегруженной сети, отправив меньшие пакеты для каждого ответа на чтение NFS и запрос на запись. Однако это может увеличить количество пакетов, необходимых для отправки данных по сети, что увеличивает общий сетевой трафик и использование ЦП на клиенте и сервере.

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

Дополнительные сведения об оптимизации rsize и wsize см . в рекомендациях по настройке подключения Linux NFS для Azure NetApp Files.

Например, чтобы настроить максимальный размер rsize и wsize 256-KiB, настройте mountOptions класс хранилища следующим образом:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30
  - rsize=262144
  - wsize=262144

Создание класса хранения общей папки NFS

Создайте файл под именем nfs-sc.yaml и скопируйте в него следующий манифест. Список поддерживаемых mountOptionsNFS параметров подключения.

Примечание.

vers, minorversionsec настраивается драйвером CSI файлов Azure. Указание значения в манифесте для этих свойств не поддерживается.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30

После изменения и сохранения файла создайте класс хранения с помощью команды kubectl apply.

kubectl apply -f nfs-sc.yaml

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

storageclass.storage.k8s.io/azurefile-csi-nfs created

Создание развертывания с общей папкой на базе NFS

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

kubectl apply -f

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-azurefile
  labels:
    app: nginx
spec:
  podManagementPolicy: Parallel  # default is OrderedReady
  serviceName: statefulset-azurefile
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: statefulset-azurefile
          image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
          command:
            - "/bin/bash"
            - "-c"
            - set -euo pipefail; while true; do echo $(date) >> /mnt/azurefile/outfile; sleep 1; done
          volumeMounts:
            - name: persistent-storage
              mountPath: /mnt/azurefile
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  volumeClaimTemplates:
    - metadata:
        name: persistent-storage
      spec:
        storageClassName: azurefile-csi-nfs
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 100Gi

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

statefulset.apps/statefulset-azurefile created

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

kubectl exec -it statefulset-azurefile-0 -- df -h

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

Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda1                                                                                 29G   11G   19G  37% /etc/hosts
accountname.file.core.windows.net:/accountname/pvc-fa72ec43-ae64-42e4-a8a2-556606f5da38  100G     0  100G   0% /mnt/azurefile
...

Примечание.

Обратите внимание, что, поскольку общая папка NFS находится в учетной записи Premium, минимальный размер общей папки составляет 100 ГиБ. Если вы создаете PVC с небольшим размером хранилища, вы можете столкнуться с примерно такой ошибкой: Не удалось создать общую папку ... размер (5)....

Контейнеры Windows

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

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

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

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

statefulset.apps/busybox-azurefile created

Проверьте содержимое тома, выполнив команду kubectl exec.

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

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

2020-08-27 22:11:01Z
2020-08-27 22:11:02Z
2020-08-27 22:11:04Z
(...)

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