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


Драйвер CSI и подготовка томов службы хранилища Azure

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

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

При подключении хранилища BLOB-объектов Azure в виде файловой системы в контейнер или модуль pod позволяет использовать хранилище BLOB-объектов со многими приложениями, которые работают с большим объемом неструктурированных данных. Рассмотрим пример.

  • Данные файла журнала
  • Изображения, документы и потоковое видео или аудио
  • Данные аварийного восстановления

Приложения получают доступ к данным, хранящимся в хранилище BLOB-объектов Azure, с помощью протокола BLOBFuse или сетевой файловой системы (NFS) 3.0. До внедрения драйвера CSI для хранения BLOB в Azure единственным вариантом была установка вручную неподдерживаемого драйвера для доступа к хранилищу BLOB из приложения, работающего в AKS. Если драйвер CSI хранилища объектов Blob в Azure включен в среде AKS, имеются два встроенных класса хранилища:

  • azureblob-fuse-Premium
  • azureblob-nfs-premium

Сведения о создании кластера AKS с поддержкой драйверов CSI см. в статье Драйверы CSI в AKS. Дополнительные сведения о различиях в доступе между каждым из типов хранилища Azure с использованием протокола NFS см. в статье Сравнение доступа к Файлам Azure, хранилищу BLOB-объектов и Azure NetApp Files с помощью NFS.

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

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

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

Замечание

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

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

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

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

Замечание

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

Функции драйвера Azure CSI

Драйвер CSI хранилища BLOB-объектов Azure поддерживает следующие функции:

  • BlobFuse
  • Протокол NFS 3.0

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

  • Улучшения производительности во время параллельного подключения к диску и отсоединения

    • Драйверы в дереве присоединяют или отсоединяют диски в последовательном режиме, а драйверы CSI присоединяют или отсоединяют диски в пакетном режиме. Существует значительное улучшение при наличии нескольких дисков, присоединенных к одному узлу.
  • Поддерживаются SSD уровня "Премиум" версии 1 и версии 2.

    • PremiumV2_LRS поддерживает только режим кэширования None
  • Поддержка дисков с зональной избыточностью (ZRS)

    • Premium_ZRSПоддерживаются StandardSSD_ZRS типы дисков. Диск ZRS можно запланировать на узловом или не-зоновом узле без условия, что том диска должен быть размещен в той же зоне, что и соответствующий узел. Дополнительные сведения, включая поддерживаемые регионы, см. в разделе "Хранение с избыточностью по зонам" для управляемых дисков.
  • Моментальный снимок тома

  • Клон тома

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

Замечание

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

Предпосылки

  • Необходимо установить и настроить Azure CLI версии 2.42 или более поздней версии. Чтобы узнать версию, выполните команду az --version. Если вам нужно установить или обновить, см. статью "Установка Azure CLI". Если вы установили расширение Azure CLI aks-preview , обязательно обновите расширение до последней версии, вызвав вызов az extension update --name aks-preview.

  • Выполните следующие действия, чтобы очистить драйвер с открытым исходным кодом , если вы ранее установили драйвер хранилища BLOB-объектов CSI с открытым кодом для доступа к хранилищу BLOB-объектов Azure из кластера.

  • Удостоверение уровня управления кластером AKS (имя кластера AKS) добавляется в роль участника в виртуальной сети и группе безопасности сети.

  • Чтобы поддерживать [учетную запись Azure Data Lake Storage 2-го поколения][azure-datalake-storage-account] (ADLS) при использовании подключения BLOBFuse, выполните следующие действия:

    • Чтобы создать учетную запись ADLS с помощью драйвера в динамической подготовке, укажите isHnsEnabled: "true" в параметрах класса хранилища.
    • Чтобы разрешить доступ BlobFuse к учетной записи ADLS при статическом провижининге, укажите параметр монтирования --use-adls=true в постоянном томе.
    • Если вы собираетесь включить учетную запись хранения с иерархическим пространством имен, существующие постоянные тома (PV) следует повторно подключить с --use-adls=true параметром подключения.
  • По умолчанию кэш BLOBFuse находится в каталоге /mnt . Если SKU виртуальной машины предоставляет временный диск, каталог /mnt подключается к временному диску. Однако, если SKU ВМ не предоставляет временный диск, каталог /mnt монтирован на диск ОС. Вы можете задать параметр монтирования --tmp-path=, чтобы указать другой каталог кэша.

Замечание

Если blobfuse-proxy не включен во время установки драйвера с открытым исходным кодом, удаление драйвера с открытым исходным кодом нарушает существующие подключения blbfuse. Однако подключения NFS остаются неизменными.

  • У вас должен быть кластер AKS с включенным драйвером CSI диска Azure. Драйвер CSI включен по умолчанию в кластерах AKS под управлением Kubernetes версии 1.21 или более поздней.

  • Azure CLI версии 2.37.0 или более поздней версии устанавливается и настраивается. Чтобы узнать версию, выполните команду az --version. Если вам нужно установить или обновить, см. статью "Установка Azure CLI".

  • Средство kubectl командной строки установлено и настроено для подключения к кластеру AKS.

  • Класс хранилища, настроенный для использования драйвера CSI диска Azure (disk.csi.azure.com).

  • Драйвер CSI диска Azure имеет ограничение тома для каждого узла. Количество томов изменяется на основе размера пула узлов или узлов. Выполните команду get kubectl, чтобы определить количество томов, которые можно выделить на узел:

    kubectl get CSINode <nodename> -o yaml
    

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

Общие требования:

  • У вас должен быть кластер AKS с включенным драйвером CSI для файлов Azure. Драйвер Azure Files CSI включен по умолчанию в кластерах AKS, работающих под управлением Kubernetes версии 1.21 или более поздней.

  • Azure CLI версии 2.37.0 или более поздней версии устанавливается и настраивается. Чтобы проверить версию, выполните команду az --version. Если вам нужно установить или обновить, см. статью "Установка Azure CLI".

  • Средство kubectl командной строки установлено и настроено для подключения к кластеру AKS.

  • Класс хранилища, настроенный для использования драйвера CSI Azure Files (file.csi.azure.com).

  • При выборе между файловыми хранилищами уровня "Стандартный" и "Премиум" важно понимать модель предоставления и требования к ожидаемому характеру использования, который вы планируете использовать в Azure Files. Дополнительные сведения см. в статье Выбор уровня производительности Azure Files на основе шаблонов использования.

Требования к сетевой общей папке (NFS):

  • Удостоверение уровня управления кластером AKS (имя кластера AKS) добавляется в роль участника в виртуальной сети и NetworkSecurityGroup.

  • Принципал службы вашего кластера AKS или управляемая идентичность службы (MSI) должна быть добавлена в роль Сотрудник для учетной записи хранения.

Требования к управляемому удостоверению:

  • Убедитесь, что удостоверению Kubelet, назначенному пользователем, предоставлена роль Storage File Data SMB MI Admin в учетной записи хранения. Если вы используете собственную учетную запись хранения, необходимо назначить Storage File Data SMB MI Admin роль назначенному пользователем удостоверению Kubelet в этой учетной записи хранения.

  • Если драйвер CSI создает учетную запись хранения, предоставьте группе ресурсов, в которой находится учетная запись хранения, роль Storage File Data SMB MI Admin.

  • Если вы используете встроенное удостоверение Kubelet, назначаемое пользователем по умолчанию, оно уже имеет необходимую Storage File Data SMB MI Admin роль в группе ресурсов управляемого узла.

Замечание

Драйвер CSI для файлов Azure разрешает только подключение общих папок SMB с помощью ключевой аутентификации (NTLM версии 2), поэтому не поддерживает максимальный профиль безопасности параметров настроек общего доступа к файлам Azure. С другой стороны, подключение общих папок NFS не требует проверки подлинности на основе ключей.

Включение драйвера CSI в новом или существующем кластере AKS

С помощью Azure CLI можно включить драйвер CSI для Blob-хранилища в новом или существующем кластере AKS перед настройкой постоянного тома для использования подами в кластере.

  1. Чтобы включить драйвер в новом кластере, включите параметр --enable-blob-driver при помощи команды az aks create, как показано в следующем примере:

    az aks create \
        --enable-blob-driver \
        --name myAKSCluster \
        --resource-group myResourceGroup \
        --generate-ssh-keys
    
  2. Чтобы включить драйвер в существующем кластере, включите параметр --enable-blob-driver при помощи команды az aks update, как показано в следующем примере:

    az aks update --enable-blob-driver --name myAKSCluster --resource-group myResourceGroup
    

Вам будет предложено подтвердить, что драйвер CSI BLOB-объектов с открытым кодом не установлен. После подтверждения может потребоваться несколько минут для выполнения этого действия. После завершения вы увидите в выходных данных состояние включения драйвера в кластере. В следующем примере показан раздел, указывающий результаты предыдущей команды:

"storageProfile": {
  "blobCsiDriver": {
    "enabled": true
  },
  ...
}

Отключение драйвера CSI в существующем кластере AKS

С помощью Azure CLI можно отключить драйвер CSI хранилища Blob в существующем кластере AKS после того, как вы удалите постоянный том из кластера.

  1. Чтобы отключить драйвер в существующем кластере, включите параметр --disable-blob-driver при помощи команды az aks update, как показано в следующем примере:

    az aks update --disable-blob-driver --name myAKSCluster --resource-group myResourceGroup
    

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

Kubernetes назначает постоянный том (PV) в качестве ресурса хранилища одному или нескольким модулям pod. Вы можете динамически подготавливать PV через Kubernetes или статически в качестве администратора.

Если нескольким pod требуется одновременный доступ к одному тому хранилища, можно использовать хранилище Azure Blob для подключения с помощью NFS или BlobFuse. В этой статье показано, как в кластере AKS с помощью нескольких модулей pod динамически создать хранилище BLOB-объектов Azure.

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

Эта статья демонстрирует, как динамически создать PV с диском Azure для одного pod в кластере AKS.

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

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

Статически подготовленный том: Выберите этот метод, если у вас уже есть учетная запись Blob-хранилища Azure или контейнер, который вы хотите использовать. Он обеспечивает больший контроль над настройкой хранилища, доступом и жизненным циклом, а также подходит для подключения к существующим ресурсам или повторному использованию хранилища в нескольких кластерах или рабочих нагрузках.

В этом разделе содержатся рекомендации для администраторов кластера, которые хотят подготовить один или несколько постоянных томов, включающих сведения о Blob Storage для использования работой. Запрос на создание постоянного тома (PVC) использует объект класса хранилища для динамического выделения контейнера Blob-хранилища Azure.

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

  1. StorageClass Создайте манифест, сохранив следующий YAML в файл с именемblob-fuse-sc.yaml:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: blob-fuse
    provisioner: blob.csi.azure.com
    parameters:
      skuName: Premium_LRS  # available values: Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS, Standard_ZRS, Premium_ZRS
      protocol: fuse2
      networkEndpointType: privateEndpoint
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    mountOptions:
      - -o allow_other
      - --file-cache-timeout-in-seconds=120
      - --use-attr-cache=true
      - --cancel-list-on-mount-seconds=10  # prevent billing charges on mounting
      - -o attr_timeout=120
      - -o entry_timeout=120
      - -o negative_timeout=120
      - --log-level=LOG_WARNING  # LOG_WARNING, LOG_INFO, LOG_DEBUG
      - --cache-size-mb=1000  # Default will be 80% of available memory, eviction will happen beyond specified value.
    
  2. Чтобы создать класс хранилища в кластере, выполните StorageClass следующую команду:

    kubectl apply -f blob-fuse-sc.yaml
    

Создание ПВХ с помощью встроенного класса хранилища

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

Замечание

Изменение любого ресурса в группе ресурсов узла в кластере AKS является неподдерживаемым действием и приведет к сбоям операции кластера. Дополнительные сведения см. в разделе Почему с AKS создаются две группы ресурсов?

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

При использовании драйверов CSI хранилища в AKS имеются два других встроенных драйвера для объектов BLOB Azure.

Политика освобождения емкости в обоих классах хранения гарантирует, что базовое хранилище Azure Blob будет удалено при удалении соответствующего постоянного тома. Классы хранения также конфигурируют расширяемость контейнера по умолчанию, поскольку для параметра set allowVolumeExpansion задано значение true.

Замечание

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

Используйте команду kubectl get sc, чтобы просмотреть классы хранения. В следующем примере демонстрируются классы хранения azureblob-fuse-premium и azureblob-nfs-premium, доступные для кластера AKS:

NAME                     PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
azureblob-fuse-premium   blob.csi.azure.com   Delete          Immediate           true                   23h
azureblob-nfs-premium    blob.csi.azure.com   Delete          Immediate           true                   23h

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

Запрос постоянного тома (PVC) использует объект класса хранилища для динамического выделения контейнера для BLOB-объектов Azure. Следующий YAML можно использовать для создания 5 ГиБ PVC с доступом ReadWriteMany с помощью встроенного класса хранилища. Дополнительные сведения о режимах доступа см. в документации по постоянным томам Kubernetes.

  1. Создайте файл с именем blob-nfs-pvc.yaml и скопируйте следующий YAML:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azure-blob-storage
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: azureblob-nfs-premium
      resources:
        requests:
          storage: 5Gi
    
  2. Создайте ПВХ с помощью команды создания kubectl :

    kubectl create -f blob-nfs-pvc.yaml
    

После его завершения создается контейнер хранилища BLOB-объектов. Команду kubectl get можно использовать для просмотра состояния ПВХ:

kubectl get pvc azure-blob-storage

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

NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
azure-blob-storage   Bound    pvc-b88e36c5-c518-4d38-a5ee-337a7dda0a68   5Gi        RWX            azureblob-nfs-premium       92m

Установите ПВХ

В следующем YAML создается pod, использующий ПВХ azure-blob-storage для монтажа хранилища Azure Blob по пути /mnt/blob.

  1. Создайте файл с именем blob-nfs-pvи скопируйте следующий YAML. Убедитесь, что имя утверждения соответствует ПВХ, созданному на предыдущем шаге.

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
        - mountPath: "/mnt/blob"
          name: volume
          readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-blob-storage
    
  2. Создайте pod командой kubectl apply

    kubectl apply -f blob-nfs-pv.yaml
    
  3. После того как модуль pod находится в состоянии выполнения, выполните следующую команду, чтобы создать новый файл test.txt.

    kubectl exec mypod -- touch /mnt/blob/test.txt
    
  4. Чтобы проверить правильность подключения диска, выполните следующую команду и убедитесь, что в выходных данных отображается файл test.txt.

    kubectl exec mypod -- ls /mnt/blob
    

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

    test.txt
    

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

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

В этом примере следующий манифест настраивает монтирование контейнера объектного хранилища Blob с помощью протокола NFS. Используйте его для добавления tags параметра.

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

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azureblob-nfs-premium
    provisioner: blob.csi.azure.com
    parameters:
      protocol: nfs
      tags: environment=Development
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    mountOptions:
      - nconnect=4
    
  2. Создайте класс хранилища с помощью команды kubectl apply :

    kubectl apply -f blob-nfs-sc.yaml
    

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

    storageclass.storage.k8s.io/blob-nfs-premium created
    

Монтирование NFS или BlobFuse PV

В этом разделе вы подключаете PV с помощью протокола NFS или BlobFuse.

Подключение хранилища Blob с помощью протокола NFS версии 3 не поддерживает аутентификацию с использованием ключа учетной записи. Кластер AKS должен находиться в той же или одноранговой виртуальной сети, что и узел агента. Единственным способом защиты данных в учетной записи хранения является использование виртуальной сети и других параметров безопасности сети. Для получения дополнительной информации о настройке доступа к учетной записи хранения через NFS см. статью «Монтирование Blob-хранилища с использованием протокола Network File System (NFS) 3.0».

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

  1. Создайте файл pv-blob-nfs.yaml и скопируйте в него следующий код YAML. В объекте storageClass измените resourceGroup, storageAccount и containerName.

    Замечание

    Значение volumeHandle в вашем YAML должно быть уникальным идентификатором тома для каждого аналогичного контейнера объектов BLOB-хранилища в кластере.

    Символы # и / зарезервированы для внутреннего использования и не могут быть использованы.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: blob.csi.azure.com
      name: pv-blob
    spec:
      capacity:
        storage: 1Pi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain  # If set as "Delete" container would be removed after pvc deletion
      storageClassName: azureblob-nfs-premium
      mountOptions:
        - nconnect=4
      csi:
        driver: blob.csi.azure.com
        # make sure volumeid is unique for every identical storage blob container in the cluster
        # character `#` and `/` are reserved for internal use and cannot be used in volumehandle
        volumeHandle: account-name_container-name
        volumeAttributes:
          resourceGroup: resourceGroupName
          storageAccount: storageAccountName
          containerName: containerName
          protocol: nfs
    

    Замечание

    Хотя атрибут емкостиAPI Kubernetes является обязательным, это значение не используется драйвером CSI хранилища BLOB-объектов Azure, так как вы можете гибко записывать данные, пока не достигнете предела емкости учетной записи хранения. Значение атрибута capacity используется только для сопоставления размера между PVs и PVCs. Рекомендуется использовать вымышленное высокое значение. Модуль pod видит подключенный том с вымышленным размером 5 Петабайт.

  2. Выполните следующую команду, чтобы создать постоянный том с помощью команды kubectl create , ссылающейся на файл YAML, созданный ранее:

    kubectl create -f pv-blob-nfs.yaml
    
  3. pvc-blob-nfs.yaml Создайте файл с помощью PersistentVolumeClaim. Рассмотрим пример.

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-blob
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      volumeName: pv-blob
      storageClassName: azureblob-nfs-premium
    
  4. Выполните следующую команду, чтобы создать запрос на постоянный том с помощью команды kubectl create ссылающейся на файл YAML, созданный ранее.

    kubectl create -f pvc-blob-nfs.yaml
    

Создание модуля pod

Следующий YAML создает pod, использующий PV или PVC с именем pvc-blob, созданный ранее, для подключения хранилища Azure Blob по пути /mnt/blob.

  1. Создайте файл nginx-pod-blob.yaml и скопируйте в него следующий код YAML. Убедитесь, что имя утверждения соответствует ПВХ, созданному на предыдущем шаге при создании PV для NFS или BlobFuse.

    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-blob
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
          name: nginx-blob
          volumeMounts:
            - name: blob01
              mountPath: "/mnt/blob"
              readOnly: false
      volumes:
        - name: blob01
          persistentVolumeClaim:
            claimName: pvc-blob
    
  2. Выполните следующую команду, чтобы создать pod и подключить PVC с помощью команды kubectl create:

    kubectl create -f nginx-pod-blob.yaml
    
  3. Выполните следующую команду, чтобы создать интерактивный сеанс оболочки с Pod и убедиться, подключено ли хранилище BLOB.

    kubectl exec -it nginx-blob -- df -h
    

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

    Filesystem      Size  Used Avail Use% Mounted on
    ...
    blobfuse         14G   41M   13G   1% /mnt/blob
    ...
    

Создайте StatefulSet

Чтобы рабочая нагрузка сохраняла объём хранилища при перезапусках или заменах модулей, используйте "StatefulSet". StatefulSets упрощает процесс связывания постоянного хранилища с модулями pod, чтобы новые модули pod, созданные для замены неудачных модулей, могли автоматически получать доступ к тем же томам хранилища. В следующих примерах показано, как настроить StatefulSet для хранилища BLOB-объектов с помощью протокола BLOBFuse или протокола NFS.

  1. Создайте файл azure-blob-nfs-ss.yaml и скопируйте в него следующий код YAML.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: statefulset-blob-nfs
      labels:
        app: nginx
    spec:
      serviceName: statefulset-blob-nfs
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
            - name: statefulset-blob-nfs
              image: mcr.microsoft.com/azurelinux/base/nginx:1.25
              volumeMounts:
                - name: persistent-storage
                  mountPath: /mnt/blob
      updateStrategy:
        type: RollingUpdate
      selector:
        matchLabels:
          app: nginx
      volumeClaimTemplates:
        - metadata:
            name: persistent-storage
          spec:
            storageClassName: azureblob-nfs-premium
            accessModes: ["ReadWriteMany"]
            resources:
              requests:
                storage: 100Gi
    
  2. Создайте StatefulSet с kubectl create помощью команды:

    kubectl create -f azure-blob-nfs-ss.yaml
    

Параметры класса хранилища Динамического ПВХ

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

Имя Description Example Mandatory Значение по умолчанию
skuName Укажите тип учетной записи хранения Azure (псевдоним: storageAccountType). Standard_LRS Premium_LRS Standard_GRS Standard_RAGRS нет Standard_LRS
location Укажите расположение Azure. eastus нет Если это пусто, драйвер использует то же имя расположения, что и текущий кластер.
resourceGroup Указывает имя группы ресурсов Azure. myResourceGroup нет Если это пусто, драйвер использует то же имя группы ресурсов, что и текущий кластер.
storageAccount Указывает имя учетной записи хранения Azure. storageAccountName нет Если имя определенной учетной записи хранения не указано, драйвер ищет подходящую учетную запись хранения, соответствующую параметрам учетной записи в той же группе ресурсов. Если не удается найти соответствующую учетную запись хранения, она создает новую. Однако если указано имя учетной записи хранения, учетная запись хранения должна существовать.
networkEndpointType 1 Укажите тип сетевой конечной точки для учетной записи хранения, созданной драйвером. Если указан privateEndpoint, для учетной записи хранения создается частная конечная точка . В других случаях для протокола NFS создается конечная точка службы. privateEndpoint нет Для кластера AKS добавьте имя кластера AKS в роль участника в группе ресурсов, где размещена виртуальная сеть.
protocol Укажите подключение BLOBFuse или подключение NFSv3. fuse, nfs нет fuse
containerName Укажите имя существующего каталога (контейнера). container нет Если это пусто, драйвер создает новое имя контейнера, начиная с pvc-fuse BLOBFuse или pvc-nfs для NFS версии 3.
containerNamePrefix Укажите префикс каталога хранилища Azure, созданный драйвером. мой нет Может содержать только строчные буквы, цифры, дефисы и длину не более 21 символов.
server Укажите доменное имя учетной записи хранения Azure. Например <storage-account>.blob.core.windows.net, существующее доменное имя учетной записи хранения DNS. нет Если пусто, драйвер использует доменное имя DNS учетной записи хранения по умолчанию <storage-account>.blob.core.windows.net или другое доменное имя суверенного облачного хранилища.
allowBlobPublicAccess Разрешить или запретить общий доступ ко всем блобам или контейнерам учетной записи хранилища, созданной драйвером. true,false нет false
storageEndpointSuffix Укажите суффикс конечной точки хранилища Azure. core.windows.net нет Если это пусто, драйвер использует суффикс конечной точки хранилища по умолчанию в соответствии с облачной средой.
tags [Теги][az-tags] будут созданы в новой учетной записи хранения. Формат тега: 'foo=aaa,bar=bbb' нет ""
matchTags Сопоставляет теги, когда драйвер пытается найти подходящую учетную запись хранения. true,false нет false

1 Если учетная запись хранения создается драйвером, необходимо указать networkEndpointType: privateEndpoint только параметр в классе хранилища. Драйвер CSI создает частную конечную точку и частную зону DNS (именованную privatelink.blob.core.windows.net) вместе с учетной записью. Если у вас есть собственная учетная запись хранения, необходимо создать частную конечную точку для аккаунта хранения. Если вы используете хранилище BLOB-объектов Azure в изолированном сетевом кластере, необходимо создать пользовательский класс хранилища с помощью networkEndpointType: privateEndpoint.

Параметры подготовки статических ПВ

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

Имя Description Example Mandatory Значение по умолчанию
volumeHandle Укажите значение, которое драйвер может использовать для уникальной идентификации контейнера объектов BLOB в кластере. Рекомендуемый способ создать уникальное значение — объединить глобально уникальное имя учетной записи хранения и имя контейнера: {account-name}_{container-name}

Символы # и / зарезервированы для внутреннего использования и не могут использоваться в дескрипторе тома.
Да
volumeAttributes.resourceGroup Укажите имя группы ресурсов Azure. myResourceGroup нет Если это пусто, драйвер использует то же имя группы ресурсов, что и текущий кластер.
volumeAttributes.storageAccount Укажите существующее имя учетной записи хранения Azure. storageAccountName Да
volumeAttributes.containerName Укажите существующее имя контейнера. container Да
volumeAttributes.protocol Укажите подключение BLOBFuse или подключение NFS версии 3. fuse, nfs нет fuse

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

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

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

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

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

Эффективно начиная с Kubernetes версии 1.29, при развертывании кластеров Службы Azure Kubernetes (AKS) в нескольких зонах доступности, AKS теперь использует хранилище с избыточностью по зонам (ZRS) для создания управляемых дисков во встроенных классах хранилища.

  • ZRS обеспечивает синхронную репликацию управляемых дисков Azure в нескольких зонах доступности Azure в выбранном регионе. Эта стратегия избыточности повышает устойчивость приложений и защищает данные от сбоев центра обработки данных.

  • Однако важно отметить, что хранилище с избыточностью между зонами (ZRS) обходится дороже, чем локальное избыточное хранилище (LRS). Если оптимизация затрат является приоритетом, можно создать класс хранилища с параметром имени SKU LRS и использовать его в утверждении постоянного тома.

Уменьшение размера ПВХ не поддерживается из-за риска потери данных. Можно изменить существующий класс хранилища с помощью kubectl edit sc команды или создать собственный пользовательский класс хранилища. Например, если вы хотите использовать диск размером 4 ТиБ, необходимо создать класс хранилища, определяющий cachingmode: None , так как [кэширование дисков не поддерживается для дисков 4 ТиБ и большего размера][параметр кэша диска]. Дополнительные сведения о классах хранения и создании собственного класса хранения см. в статье Параметры хранилища для приложений в AKS.

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

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

Замечание

Запросы на постоянные тома указываются в GiB, но управляемые диски Azure выставляются с учетом SKU для определенного размера. Эти номера SKU варьируются от 32 ГиБ для дисков S4 или P4 и до 32 ТиБ для дисков S80 или P80 (в предварительной версии). Число операций ввода-вывода в секунду и пропускная способность управляемого диска (цен. категория "Премиум") зависят как от номера SKU, так и от размера экземпляров узлов в кластере AKS. Дополнительные сведения см. на странице Цены на управляемые диски.

Классы предварительно созданного kubectl get sc хранилища можно просмотреть с помощью команды. В следующем примере показаны готовые классы хранилища, доступные в кластере AKS:

kubectl get sc

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

NAME                PROVISIONER                AGE
default (default)   disk.csi.azure.com         1h
managed-csi         disk.csi.azure.com         1h

ПВХ автоматически подготавливает хранилище на основе класса хранения. В этом случае ПВХ может использовать один из предварительно созданных классов хранилища для создания управляемого диска Azure уровня "Стандартный" или "Премиум".

  1. Создайте файл azure-pvc.yaml и скопируйте в него следующий манифест. Запрос на диск с именем azure-managed-disk, размером 5 GB и доступом ReadWriteOnce. managed-csi указан как класс хранения.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
        name: azure-managed-disk
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: managed-csi
      resources:
        requests:
          storage: 5Gi
    

    Подсказка

    Чтобы создать диск, который использует хранилище уровня "Премиум", используйте класс storageClassName: managed-csi-premium вместо managed-csi.

  2. Создайте утверждение постоянного тома с помощью kubectl apply команды и укажите файл azure-pvc.yaml .

    kubectl apply -f azure-pvc.yaml
    

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

    persistentvolumeclaim/azure-managed-disk created
    

Применение PVC к модулю pod

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

  1. Проверьте состояние ПВХ с помощью kubectl describe pvc команды.

    kubectl describe pvc azure-managed-disk
    

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

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    
  2. Создайте файл azure-pvc-disk.yaml и скопируйте в него следующий манифест. Этот манифест создает базовый модуль NGINX pod, который использует запрос постоянного тома с именем azure-managed-disk для монтирования диска Azure в путь /mnt/azure. Для контейнеров Windows Server укажите mountPath соглашение о пути Windows, например "D:".

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: "/mnt/azure"
              name: volume
              readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-managed-disk
    
  3. Создайте pod с помощью команды kubectl apply.

    kubectl apply -f azure-pvc-disk.yaml
    

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

    pod/mypod created
    
  4. Теперь у вас есть работающий pod с диском Azure, подключенным к каталогу /mnt/azure. Проверьте конфигурацию pod с помощью kubectl describe команды.

    kubectl describe pod mypod
    

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

    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  azure-managed-disk
        ReadOnly:   false
       default-token-smm2n:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-smm2n
        Optional:    false
    [...]
     Events:
      Type    Reason                 Age   From                               Message
      ----    ------                 ----  ----                               -------
      Normal  Scheduled              2m    default-scheduler                  Successfully assigned mypod to aks-nodepool1-79590246-0
      Normal  SuccessfulMountVolume  2m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "default-token-smm2n"
      Normal  SuccessfulMountVolume  1m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242"
    [...]
    

Параметры динамического класса хранилища для PVCs

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

Имя Meaning Доступное значение Mandatory Значение по умолчанию
skuName Тип учетной записи хранения дисков Azure (псевдоним: storageAccountType) Standard_LRS, Premium_LRS, StandardSSD_LRSPremiumV2_LRSUltraSSD_LRSPremium_ZRSStandardSSD_ZRS нет StandardSSD_LRS
fsType Тип файловой системы ext4, ext3, ext2, xfs, btrfs для Linux, ntfs для Windows нет ext4для Linux, ntfs для Windows
cachingMode [Параметр кэша узла диска данных Azure][параметр disk-host-cache-setting](PremiumV2_LRS и UltraSSD_LRS поддерживают только режим кэширования None) None ReadOnly ReadWrite нет ReadOnly
resourceGroup Укажите группу ресурсов для дисков Azure Имя существующей группы ресурсов нет Если это пусто, драйвер использует то же имя группы ресурсов, что и текущий кластер AKS.
DiskIOPSReadWrite [Диск UltraSSD][ультра-ssd-disks] или [Premium SSD версии 2][premiumv2_lrs_disks] Возможность ввода-вывода в секунду (минимум: 2 операций ввода-вывода в секунду/ГиБ) 100~160000 нет 500
DiskMBpsReadWrite [Диск UltraSSD][ультра-ssd-disks] или [Premium SSD v2][premiumv2_lrs_disks] Пропускная способность (минимум: 0.032/ГиБ) 1~2000 нет 100
Размер логического сектора Размер логического сектора в байтах для диска категории "Ультра". Поддерживаемые значения: 512 - 4096. Значение по умолчанию — 4096. 512, 4096 нет 4096
tags Диск Azure [теги][azure-tags] Формат тега: key1=val1,key2=val2 нет ""
diskEncryptionSetID ResourceId набора шифрования дисков, который используется для [включения шифрования в состоянии покоя][шифрование диска] формат: /subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} нет ""
diskEncryptionType Тип шифрования набора шифрования диска. EncryptionAtRestWithCustomerKey (по умолчанию) EncryptionAtRestWithPlatformAndCustomerKeys нет ""
writeAcceleratorEnabled [Ускоритель записи на дисках Azure][azure-disk-write-accelerator] true, false нет ""
networkAccessPolicy Свойство NetworkAccessPolicy для предотвращения создания универсального кода ресурса (URI) SAS для диска или моментального снимка AllowAll DenyAll AllowPrivate нет AllowAll
diskAccessID Идентификатор ресурса Azure для ресурса DiskAccess для использования частных конечных точек на дисках нет ``
enableBursting [Включение бёрстинга по запросу][бёрстинг по запросу] за пределами заданного уровня производительности диска. Ускорение по запросу должно применяться только к диску категории "Премиум" и размеру > диска 512 ГБ. Диски ценовой категории "Ультра" и "Общий" не поддерживаются. Ускорение отключено по умолчанию. true, false нет false
userAgent Агент пользователя используется для [атрибутирования использования клиентами][customer-usage-attribution] нет Созданный агент пользователя отформатирован как driverName/driverVersion compiler/version (OS-ARCH)
subscriptionID Укажите идентификатор подписки Azure, в которой создаются диски Azure. Идентификатор подписки Azure нет Если значение не пустое, необходимо указать resourceGroup.

Статические параметры подготовки для PV

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

Имя Meaning Доступное значение Mandatory Значение по умолчанию
volumeHandle URI диска Azure /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} Да N/A
volumeAttributes.fsType Тип файловой системы ext4, ext3, ext2, xfs, btrfs для Linux, ntfs для Windows нет ext4для Linux, ntfs для Windows
volumeAttributes.partition Номер секции существующего диска (поддерживается только в Linux) 1 2 3 нет Пустой (без указания секции)
— Убедитесь, что формат секции похож на следующий: -part1
volumeAttributes.cachingMode [Настройка кэша дискового хоста][настройка кэша дискового хоста] None ReadOnly ReadWrite нет ReadOnly

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

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

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

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

  1. Создайте файл с именем 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
    
  2. Создайте класс хранилища, выполнив команду 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 в вашем VolumeSnapshotClass.

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

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

Снимки состояния томов поддерживают следующие сценарии:

  • Резервное копирование и восстановление: Создание моментальных снимков данных приложений, сохраняющих состояние, и их восстановление при необходимости.
  • Клонирование данных. Клонирование существующих томов для создания новых постоянных томов с теми же данными.
  • Аварийное восстановление: быстрое восстановление после потери или повреждения данных.

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

Замечание

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

  1. Например, создайте класс моментального снимка тома с помощью команды 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
    
  2. Создайте моментальный снимок тома из ПВХ, созданного ранее в этой статье.

    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
    
  3. Чтобы убедиться, что моментальный снимок был создан корректно, введите следующую команду:

    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>
    

Создание нового ПВХ на основе моментального снимка тома

Вы можете создать новый PVC на основе моментального снимка тома.

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

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

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

    lost+found
    outfile
    test.txt
    

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

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

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

  1. Создайте клонированный том из созданного ранее томаazuredisk-pvc и новый под для его использования.

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

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

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

    lost+found
    outfile
    test.txt
    

Изменение размера диска Azure PV без простоя

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

Замечание

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

В AKS встроенный managed-csi класс хранилища уже поддерживает расширение, поэтому используйте созданный ранее класс хранилища. ПВХ попросил 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
  1. Увеличьте PV, изменив spec.resources.requests.storage поле, выполнив следующую команду:

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

    Замечание

    Сжатие PV в настоящее время не поддерживается. Попытка исправления существующего ПВХ с меньшим размером, чем текущий, приводит к следующему сообщению об ошибке:

    The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.

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

    persistentvolumeclaim/pvc-azuredisk patched
    
  2. Выполните следующую команду, чтобы убедиться, что размер тома увеличился:

    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
    (...)
    
  3. И через несколько минут выполните следующие команды, чтобы подтвердить размер ПВХ:

    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
    
  4. Выполните следующую команду, чтобы проверить размер диска внутри пода.

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

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

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

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

kubectl exec -it nginx-azuredisk -c <ContainerName> -- df -h /mnt/azuredisk

Контейнеры Windows

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

  1. После создания пула узлов 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
    
  2. Чтобы проверить содержимое тома, выполните следующую команду:

    kubectl exec -it statefulset-azuredisk-win-0 -- powershell -c "type c:/mnt/azuredisk/data.txt"
    

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

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

Динамическое увеличение ресурсов по запросу

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

Это важно

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

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

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

Очистите ресурсы

После завершения работы с ресурсами, созданными в этой статье, их можно удалить с помощью kubectl delete команды.

# Remove the pod
kubectl delete -f azure-pvc-disk.yaml

# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml

Подготовка PV файлов Azure

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

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

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

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

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

Замечание

Чтобы получить лучший опыт работы с файлами Azure, следуйте этим рекомендациям. Расположение для настройки параметров монтирования (mountOptions) зависит от того, подготавливаете ли вы динамические или статические постоянные тома.

  • Если вы динамически подготавливаете том с классом хранилища, укажите параметры подключения для объекта класса хранилища (тип: StorageClass).
  • Если вы статически предоставляете том, укажите параметры монтирования для объекта PersistentVolume (тип: PersistentVolume).
  • Если вы подключаете общую папку в виде встроенного тома, укажите параметры подключения в объекте Pod (тип: Pod).

Мы рекомендуем FIO при выполнении тестов проверки производительности. Дополнительные сведения см. в статье о средствах и тестах для тестирования.

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

Замечание

Изменение любого ресурса в группе ресурсов узла в кластере AKS является неподдерживаемым действием и приведет к сбоям операции кластера. Дополнительные сведения см. в разделе Почему с AKS создаются две группы ресурсов?

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

Дополнительные сведения о классах хранения Kubernetes для файлов Azure см. в разделе о классах хранения Kubernetes.

  1. Создайте файл под названием azure-file-sc.yaml и скопируйте в него следующий пример манифеста. Дополнительные сведения см mountOptions. в разделе "Параметры подключения ".

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: my-azurefile
    provisioner: file.csi.azure.com # replace with "kubernetes.io/azure-file" if aks version is less than 1.21
    allowVolumeExpansion: true
    mountOptions:
     - dir_mode=0777
     - file_mode=0777
     - uid=0
     - gid=0
     - mfsymlinks
     - cache=strict
     - actimeo=30
     - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
    parameters:
      skuName: Premium_LRS
    
  2. Создайте класс хранилища с помощью kubectl apply команды.

    kubectl apply -f azure-file-sc.yaml
    

Создание ПВХ

В заявке на постоянный том используется объект класса хранилища для динамического предоставления общего файла Azure. Чтобы создать PVC размером 100 ГБ с доступом ReadWriteMany, используйте следующий YAML. Дополнительные сведения о режимах доступа см. в разделе "Постоянный том Kubernetes".

  1. Создайте файл azure-file-pvc.yaml и скопируйте в него следующий код YAML. Убедитесь, storageClassName что соответствует классу хранилища, созданному на предыдущем шаге.

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

    Замечание

    Если используется Premium_LRS номер SKU для класса хранилища, минимальное значение storage должно быть 100Gi.

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

    kubectl apply -f azure-file-pvc.yaml
    

    После завершения будет создан общий файловый ресурс. Также будет создан секрет Kubernetes, содержащий сведения о подключении и учетные данные. Вы можете использовать kubectl get команду для просмотра состояния ПВХ:

    kubectl get pvc my-azurefile
    

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

    NAME           STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
    my-azurefile   Bound     pvc-8436e62e-a0d9-11e5-8521-5a8664dc0477   100Gi       RWX           my-azurefile      5m
    

Установите ПВХ

В следующем YAML создается модуль pod, использующий файл PVC my-azurefile для подключения общей папки файлов Azure по пути /mnt/azure . Для контейнеров Windows Server укажите mountPath с использованием формата пути Windows, например "D:".

  1. Создайте файл azure-pvc-files.yaml и скопируйте в него следующий код YAML. Убедитесь в том, что claimName соответствует PVC, созданной на предыдущем шаге.

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: /mnt/azure
              name: volume
              readOnly: false
      volumes:
       - name: volume
         persistentVolumeClaim:
           claimName: my-azurefile
    
  2. Создайте pod с помощью команды kubectl apply.

    kubectl apply -f azure-pvc-files.yaml
    

    Теперь у вас есть запущенный модуль pod с общим файлом Azure Files, подключенным в каталоге /mnt/azure . Эту конфигурацию можно увидеть, когда вы проверяете pod с помощью команды kubectl describe. В следующем сжатом примере выходных данных показан том, подключенный к контейнеру.

    Containers:
      mypod:
        Container ID:   docker://053bc9c0df72232d755aa040bfba8b533fa696b123876108dec400e364d2523e
        Image:          mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        Image ID:       docker-pullable://nginx@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
        State:          Running
          Started:      Fri, 01 Mar 2019 23:56:16 +0000
        Ready:          True
        Mounts:
          /mnt/azure from volume (rw)
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-8rv4z (ro)
    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  my-azurefile
        ReadOnly:   false
    [...]
    

Параметры подключения

Для версий Kubernetes 1.13.0 и более поздних значения по умолчанию для fileMode и dirMode установлены как 0777. При динамической подготовке PV с помощью класса хранилища можно определить параметры подключения непосредственно в манифесте класса хранилища. Дополнительные сведения см. в разделе "Параметры подключения". В следующем примере показано, как задать эти разрешения 0777:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com # replace with "kubernetes.io/azure-file" if aks version is less than 1.21
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict
  - actimeo=30
  - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
parameters:
  skuName: Premium_LRS

Параметры класса хранилища для динамических томов

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

Имя Meaning Доступное значение Mandatory Значение по умолчанию
accountAccessTier Уровень доступа для учетной записи хранения Стандартная учетная запись может выбрать Hot или Cool, а учетная запись Premium может выбрать только Premium. нет Empty. Используйте параметр по умолчанию для различных типов учетных записей хранения.
accountQuota Ограничивает квоту для учетной записи. Можно указать максимальную квоту в ГБ (102 400 ГБ по умолчанию). Если учетная запись превышает указанную квоту, драйвер пропускает выбор учетной записи. нет 102400
allowBlobPublicAccess Разрешить или запретить общий доступ ко всем блобам или контейнерам учетной записи хранилища, созданной драйвером. true или false нет false
disableDeleteRetentionPolicy Укажите, отключите ли DeleteRetentionPolicy для учетной записи хранения, созданной драйвером. true или false нет false
folderName Укажите имя папки в общей папке Azure. Существующее имя папки в файловом общем ресурсе Azure. нет Если имя папки не существует в общем доступе, подключение не удается.
getLatestAccount Определяет, следует ли получить последний ключ учетной записи на основе времени создания. Этот драйвер получает первый ключ по умолчанию. true или false нет false
location Укажите регион учетной записи хранилища Azure. Например: eastus. нет Если поле пусто, драйвер использует то же название местоположения, что и текущий кластер AKS.
matchTags Сопоставляет теги, когда драйвер пытается найти подходящую учетную запись хранения. true или false нет false
networkEndpointType 1 Укажите тип сетевой конечной точки для учетной записи хранения, созданной драйвером. Если privateEndpoint задано, для учетной записи хранения создается частная конечная точка. В других случаях конечная точка службы создается по умолчанию. "",privateEndpoint нет ""
protocol Укажите протокол общей папки. smb, nfs нет smb
requireInfraEncryption Укажите, применяет ли служба дополнительный уровень шифрования с управляемыми платформой ключами для неактивных данных для учетной записи хранения, созданной драйвером. true или false нет false
resourceGroup Укажите группу ресурсов для дисков Azure. Имя существующей группы ресурсов нет Если это пусто, драйвер использует то же имя группы ресурсов, что и текущий кластер AKS.
selectRandomMatchingAccount Определяет, следует ли случайным образом выбрать соответствующую учетную запись. По умолчанию драйвер всегда выбирает первую соответствующую учетную запись в алфавитном порядке (примечание. Этот драйвер использует кэш поиска учетных записей, что приводит к неравномерному распределению файлов в нескольких учетных записях). true или false нет false
server Укажите адрес сервера учетной записи хранения Azure. Например, существующий адрес сервера accountname.privatelink.file.core.windows.net. нет Если поле пустое, драйвер использует адрес учетной записи по умолчанию accountname.file.core.windows.net или другой суверенный облачный аккаунт.
shareAccessTier Уровень доступа для общей папки Учетная запись общего назначения версии 2 может выбирать между TransactionOptimized (по умолчанию) Hotи Cool. Тип учетной записи хранения "Премиум" только для общих папок. нет Empty. Используйте параметр по умолчанию для различных типов учетных записей хранения.
shareName Укажите имя общей папки Azure. Существующее или новое имя общей папки Azure. нет Если это пусто, драйвер создает имя общей папки Azure.
shareNamePrefix Укажите префикс имени общей папки Azure, созданный драйвером. Имя общего ресурса может содержать только строчные буквы, цифры, дефисы и длину не более 21 символов. нет
skuName тип учетной записи хранилища Azure Files (псевдоним: storageAccountType) Standard_LRS, Standard_ZRS, Standard_GRSStandard_RAGRSStandard_RAGZRSPremium_LRSPremium_ZRSStandardV2_LRSStandardV2_ZRSStandardV2_GRSStandardV2_GZRSPremiumV2_LRSPremiumV2_ZRS нет Standard_LRS
Минимальный размер общей папки для типа учетной записи Premium составляет 100 ГБ.
Тип учетной записи ZRS поддерживается в ограниченных регионах.
Общий файловый ресурс NFS поддерживает только тип аккаунта Премиум.
Имена SKU уровня "Стандартный" версии 2 предназначены для подготовленной модели файлов Azure версии 2.
storageAccount Указывает имя учетной записи хранения Azure. storageAccountName -Нет Если имя определенной учетной записи хранения не указано, драйвер ищет подходящую учетную запись хранения, соответствующую параметрам учетной записи в той же группе ресурсов. Если не удается найти соответствующую учетную запись хранения, она создает новую. Однако если указано имя учетной записи хранения, учетная запись хранения должна существовать.
storageEndpointSuffix Укажите суффикс конечной точки хранилища Azure. core.windows.net, core.chinacloudapi.cnи т. д. нет Если это пусто, драйвер использует суффикс конечной точки хранилища по умолчанию в соответствии с облачной средой. Например: core.windows.net.
tags Теги создаются в новой учетной записи хранения. Формат тега: 'foo=aaa,bar=bbb' нет ""

1 Если учетная запись хранения создается драйвером, необходимо указать networkEndpointType: privateEndpoint только параметр в классе хранилища. Драйвер CSI создает частную конечную точку и частную зону DNS (именованную privatelink.file.core.windows.net) вместе с учетной записью. Если у вас есть собственная учетная запись хранения, необходимо создать частную конечную точку для аккаунта хранения. Если вы используете хранилище файлов Azure в изолированном сетевом кластере, необходимо создать пользовательский класс хранилища с помощью networkEndpointType: privateEndpoint. Вы можете следовать этому примеру для справки:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  skuName: Premium_LRS  # available values: Premium_LRS, Premium_ZRS, Standard_LRS, Standard_GRS, Standard_ZRS, Standard_RAGRS, Standard_RAGZRS
  networkEndpointType: privateEndpoint
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777  # modify this permission if you want to enhance the security
  - file_mode=0777
  - 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
  - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks

Параметры статической подготовки для PV

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

Имя Meaning Доступное значение Mandatory Значение по умолчанию
volumeAttributes.resourceGroup Указывает имя группы ресурсов Azure. myResourceGroup нет Если это пусто, драйвер использует то же имя группы ресурсов, что и текущий кластер.
volumeAttributes.storageAccount Укажите существующее имя учетной записи хранения Azure. storageAccountName Да
volumeAttributes.shareName Укажите имя общей папки Azure. fileShareName Да
volumeAttributes.folderName Укажите имя папки в общей папке Azure. folderName нет Если имя папки не существует в общей папке, подключение завершится ошибкой.
volumeAttributes.protocol Укажите протокол общей папки. smb, nfs нет smb
volumeAttributes.server Указание адреса сервера учетной записи хранения Azure Например, существующий адрес сервера accountname.privatelink.file.core.windows.net. нет Если поле пустое, драйвер использует адрес учетной записи по умолчанию accountname.file.core.windows.net или другой суверенный облачный аккаунт.

Создать класс моментальных снимков PV

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

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

    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>
    

Изменение размера файлов Azure PV

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

Замечание

Новый постоянный том (Persistent Volume, PV) никогда не будет создан для удовлетворения запроса. Вместо этого изменяется размер существующего тома. Сжатие постоянных томов в настоящее время не поддерживается.

В 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
  1. Расширьте PVC, увеличив поле spec.resources.requests.storage:

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

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

    persistentvolumeclaim/pvc-azurefile patched
    
  2. Убедитесь, что как в 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
    

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

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

Настройте следующие параметры:

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

  • storageAccount: имя учетной записи хранения.

  • server: полное доменное имя частной конечной точки учетной записи хранения.

  1. Создайте файл с именем 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
    
  2. Создайте класс хранилища с помощью kubectl apply команды:

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

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

    storageclass.storage.k8s.io/private-azurefile-csi created
    
  3. Создайте файл с именем private-pvc.yamlи вставьте следующий пример манифеста в файл:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: private-azurefile-pvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: private-azurefile-csi
      resources:
        requests:
          storage: 100Gi
    
  4. Создайте ПВХ с помощью команды kubectl apply :

    kubectl apply -f private-pvc.yaml
    

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

Теперь Azure Files поддерживает аутентификацию на основе управляемой идентичности для доступа к SMB. Благодаря этой возможности приложения, работающие в AKS, могут безопасно получать доступ к общим папкам Azure без необходимости хранить ключи или учетные данные учетной записи хранения или управлять ими. Управляемые удостоверения обеспечивают упрощенный и безопасный механизм проверки подлинности, упрощая управление доступом и уменьшая риск, связанный с воздействием учетных данных. Вы можете создать динамический том или статический том.

Замечание

Поддержка управляемых удостоверений для файлов Azure в AKS доступна в предварительной версии, начиная с AKS версии 1.34 на узлах Linux.

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

  1. Создайте класс хранилища с активированным управляемым удостоверением с помощью YAML-файла, например, azurefile-csi-managed-identity.yaml с таким содержанием. Установите mountWithManagedIdentity: "true" в разделе parameters.

     apiVersion: storage.k8s.io/v1
     kind: StorageClass
     metadata:
       name: azurefile-csi
     provisioner: file.csi.azure.com
     parameters:
       resourceGroup: EXISTING_RESOURCE_GROUP_NAME   # optional, node resource group by default if it's not provided
       storageAccount: EXISTING_STORAGE_ACCOUNT_NAME # optional, a new account will be created if it's not provided
       mountWithManagedIdentity: "true"
       # optional, clientID of the managed identity, kubelet identity would be used by default if it's not provided
       clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx"
     reclaimPolicy: Delete
     volumeBindingMode: Immediate
     allowVolumeExpansion: true
     mountOptions:
      - dir_mode=0777  # modify this permission if you want to enhance the security
      - 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
      - nobrl  # disable sending byte range lock requests to the server
    
  2. Примените этот класс хранилища, выполнив следующую команду:

    kubectl apply -f azurefile-csi-managed-identity.yaml
    
  3. Разверните StatefulSet или рабочую нагрузку, используя новый класс хранилища, который ссылается на этот том запроса на постоянный том (PVC), чтобы обеспечить подготовку тома с использованием аутентификации управляемой идентичности. В манифесте ПВХ установите storageClassName: azurefile-csi-managed-identity. Рассмотрим пример.

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

Сведения о службе "Файлы Azure" NFS

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

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

Замечание

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

В этом разделе объясняется, как повысить производительность и безопасность при использовании Azure Files NFS 4.1 с AKS. Узнайте, как:

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

  • Создание и настройка класса хранилища NFS

  • Развертывание рабочих нагрузок, использующих тома на базе NFS

  • Включите шифрование в транзитном режиме (EiT) для защиты данных при перемещении между кластером AKS и файлами Azure.

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

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

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

Например, чтобы настроить максимально rsize и wsize на 256-КиБ, настройте класс хранилища 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

Примеры других классов хранилища

Рекомендуемые варианты подключения для общих папок SMB приведены в следующем примере класса хранилища:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  skuName: Premium_LRS  # available values: Premium_LRS, Premium_ZRS, Standard_LRS, Standard_GRS, Standard_ZRS, Standard_RAGRS, Standard_RAGZRS
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777  # modify this permission if you want to enhance the security
  - file_mode=0777 # modify this permission if you want to enhance the security
  - mfsymlinks    # support symbolic links
  - cache=strict  # https://linux.die.net/man/8/mount.cifs
  - nosharesock  # reduces probability of reconnect race
  - actimeo=30  # reduces latency for metadata-heavy workload
  - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks

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

Дополнительные сведения см. в статье "Повышение производительности для общих папок SMB Azure".

Контейнеры Windows

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

  1. После создания пула узлов 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
    
  2. Проверьте содержимое тома, выполнив следующую команду kubectl exec :

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

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

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

Дальнейшие шаги