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


Создание и использование тома с хранилищем BLOB-объектов Azure в Служба Azure Kubernetes (AKS)

Контейнерные приложения часто требуются для обращения к данным и их хранения во внешнем томе данных. Если нескольким pod требуется одновременный доступ к одному и тому же тому хранилища, можно использовать хранилище больших двоичных объектов Azure для подключения с помощью blobfuse или Сетевой файловой системы (NFS).

Из этой статьи вы узнаете, как выполнять следующие задачи:

  • Работа с динамическим постоянным томом (PV) путем установки драйвера интерфейса хранилища контейнеров (CSI) и динамического создания контейнера хранилища BLOB-объектов Azure для подключения к pod.
  • Работа со статическим PV путем создания контейнера хранилища BLOB-объектов Azure или использования существующего и подключения его к pod.

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

Подготовка к работе

  • Включите драйвер CSI хранилища BLOB-объектов в кластере AKS.

  • Чтобы поддерживать учетную запись хранения Azure DataLake 2-го поколения при использовании подключения blobfuse, необходимо выполнить следующее:

    • Чтобы создать учетную запись ADLS с помощью драйвера в динамической подготовке, укажите isHnsEnabled: "true" в параметрах класса хранилища.
    • Чтобы включить доступ blbfuse к учетной записи ADLS в статической подготовке, укажите параметр --use-adls=true подключения в постоянном томе.
    • Если вы собираетесь включить учетную запись хранения с иерархическим пространством имен, существующие постоянные тома следует повторно подключить с --use-adls=true параметром подключения.
  • Сведения о кэше blbfuse

    • По умолчанию кэш blbfuse находится в каталоге /mnt . Если номер SKU виртуальной машины предоставляет временный диск, /mnt каталог подключается к временному диску. Однако если номер SKU виртуальной машины не предоставляет временный диск, /mnt каталог подключен на диске ОС, можно задать --tmp-path= параметр подключения для указания другого каталога кэша.

Динамическое подготовка тома

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

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

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

Имя Описание: Пример Обязательно Default value
skuName Указывает тип учетной записи хранения Azure (псевдоним: storageAccountType). Standard_LRS, , Premium_LRSStandard_GRSStandard_RAGRS No Standard_LRS
расположение Укажите расположение Azure. eastus No Если он пуст, драйвер будет использовать то же имя расположения, что и текущий кластер.
resourceGroup Указывает имя группы ресурсов Azure. myResourceGroup No Если он пуст, драйвер будет использовать то же имя группы ресурсов, что и текущий кластер.
storageAccount Указывает имя учетной записи хранения Azure. storageAccountName Нет Если имя учетной записи хранения не указано, драйвер будет искать подходящую учетную запись хранения, соответствующую параметрам учетной записи в одной группе ресурсов. Если не удается найти соответствующую учетную запись хранения, она создаст новую. Однако если указано имя учетной записи хранения, учетная запись хранения должна существовать.
networkEndpointType Укажите тип сетевой конечной точки для учетной записи хранения, созданной драйвером. Если указан privateEndpoint, для учетной записи хранения создается частная конечная точка . В других случаях для протокола NFS будет создана конечная точка службы.1 privateEndpoint No Для кластера AKS добавьте имя кластера AKS в роль участника в группе ресурсов, где размещена виртуальная сеть.
protocol Указывает подключение blobfuse или подключение NFS версии 3. fuse, nfs No fuse
containerName Указывает имя существующего контейнера (каталога). контейнер No Если этот параметр пуст, драйвер создает имя нового контейнера, начиная с pvc-fuse для blobfuse или pvc-nfs для NFS версии 3.
containerNamePrefix Указывает префикс каталога хранилища Azure, созданный драйвером. my Может содержать только строчные буквы, цифры и дефисы, а длина не должна превышать 21 символ. No
server Указывает доменное имя учетной записи хранения Azure. Существующее доменное имя службы доменных имен (DNS) учетной записи хранения, например, <storage-account>.privatelink.blob.core.windows.net. No Если этот параметр пуст, драйвер использует доменное имя по умолчанию <storage-account>.blob.core.windows.net или другое доменное имя службы доменных имен (DNS) учетной записи хранения национального облака.
allowBlobPublicAccess Разрешает или запрещает общий доступ ко всем большим двоичным объектам или контейнерам для учетной записи хранения, созданной драйвером. true,false No false
storageEndpointSuffix Указывает суффикс конечной точки хранилища Azure. core.windows.net No Если этот параметр пуст, драйвер будет использовать суффикс конечной точки хранилища по умолчанию в соответствии с облачной средой.
tags Теги будут созданы в новой учетной записи хранения. Формат тега: 'foo=aaa,bar=bbb' No ""
matchTags Сопоставляет теги, когда драйвер пытается найти подходящую учетную запись хранения. true,false No false
--- Следующие параметры предназначены только для blobfuse --- --- ---
subscriptionID Указывает идентификатор подписки Azure, в которой будет создан каталог хранилища больших двоичных объектов. Идентификатор подписки Azure No Если значение не пустое, необходимо указать resourceGroup.
storeAccountKey Указывает ключ учетной записи хранения для секрета Kubernetes.

Примечание.
false означает, что для получения ключа учетной записи драйвер использует удостоверение kubelet.
true,false No true
secretName; Указывает имя секрета для хранения ключа учетной записи. No
secretNamespace Указывает пространство имен секрета для хранения ключа учетной записи. default,kube-system и т. д. No Пространство имен заявки на постоянный том
isHnsEnabled Включите Hierarchical namespace учетную запись хранения Azure Data Lake. true,false No false
--- Следующие параметры предназначены только для протокола NFS --- --- ---
mountPermissions Укажите разрешения подключенной папки. Значение по умолчанию — 0777. Если задано значение 0, драйвер не будет выполнять chmod после подключения. 0777 No

1 Если учетная запись хранения создается драйвером, необходимо указать networkEndpointType: privateEndpoint только параметр в классе хранилища. Драйвер CSI создает частную конечную точку вместе с учетной записью. При наличии собственной учетной записи хранения необходимо создать частную конечную точку для учетной записи хранения.

Создает утверждение постоянного тома с помощью встроенного класса хранения

Утверждение постоянного тома (PVC) использует объект класса хранения для динамической подготовки контейнера хранилища больших двоичных объектов Azure. Следующий код YAML можно использовать, чтобы создать утверждение постоянного тома в размере 5 ГБ с доступом 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. Создайте утверждение постоянного тома с помощью команды create kubectl:

    kubectl create -f blob-nfs-pvc.yaml
    

После ее выполнения будет создан контейнер хранилища больших двоичных объектов. Вы можете использовать команду kubectl get, чтобы просмотреть состояние PVC.

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 по пути /mnt/blob.

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

    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
    

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

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

Класс хранения, использующий протокол NFS

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

  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
    

Класс хранения, использующий blobfuse

В этом примере следующий манифест настраивает использование blobfuse и подключает контейнер хранилища BLOB-объектов. Используйте его для обновления параметра skuName.

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

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azureblob-fuse-premium
    provisioner: blob.csi.azure.com
    parameters:
      skuName: Standard_GRS  # available values: Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS
    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 that.
    
  2. Создайте класс хранения с помощью команды kubectl apply.

    kubectl apply -f blobfuse-sc.yaml
    

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

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

Статическая подготовка тома

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

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

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

Имя Описание: Пример Обязательно Default value
volumeHandle Укажите значение, которое драйвер может использовать для уникальной идентификации контейнера BLOB-объектов хранилища в кластере. Рекомендуемый способ создать уникальное значение — объединить глобально уникальное имя учетной записи хранения и имя контейнера: {account-name}_{container-name}
Примечание. #/ Символ зарезервирован для внутреннего использования и не может использоваться в дескрипторе тома.
Да
volumeAttributes.resourceGroup Укажите имя группы ресурсов Azure. myResourceGroup No Если это пусто, драйвер использует то же имя группы ресурсов, что и текущий кластер.
volumeAttributes.storageAccount Укажите существующее имя учетной записи хранения Azure. storageAccountName Да
volumeAttributes.containerName Укажите имя существующего контейнера. контейнер Да
volumeAttributes.protocol Укажите подключение blobfuse или подключение NFS версии 3. fuse, nfs No fuse
--- Следующие параметры предназначены только для blobfuse --- --- ---
volumeAttributes.secretName Имя секрета, включающее имя и ключ учетной записи хранения (применяется только для SMB). No
volumeAttributes.secretNamespace Укажите пространство имен секрета для хранения ключа учетной записи. default No Пространство имен утверждения постоянного тома
nodeStageSecretRef.name Укажите имя секрета, которое хранит одно из следующих элементов:
azurestorageaccountkey
azurestorageaccountsastoken
msisecret
azurestoragespnclientsecret.
No Имя существующего секрета Kubernetes
nodeStageSecretRef.namespace Укажите пространство имен секрета. Пространство имен Kubernetes Да
--- Следующие параметры предназначены только для протокола NFS --- --- ---
volumeAttributes.mountPermissions Укажите разрешения подключенной папки. 0777 No
--- Следующие параметры предназначены только для конфигурации с виртуальной сетью NFS --- --- ---
vnetResourceGroup Укажите группу ресурсов виртуальной сети, в которой размещена виртуальная сеть. myResourceGroup No Если этот параметр пуст, драйвер использует значение vnetResourceGroup, указанное в файле конфигурации облака Azure.
vnetName Укажите имя виртуальной сети. aksVNet No Если этот параметр пуст, драйвер использует значение vnetName, указанное в файле конфигурации облака Azure.
subnetName Укажите имя существующей подсети узла агента. aksSubnet No Если этот параметр пуст, драйвер использует значение subnetName, указанное в файле конфигурации облака Azure.
--- Следующие параметры предназначены только для следующего компонента: blobfuse
Управляемое удостоверение и проверка подлинности на основе субъекта-службы
--- --- ---
volumeAttributes.AzureStorageAuthType Укажите тип проверки подлинности. Key, , SASMSISPN No Key
volumeAttributes.AzureStorageIdentityClientID Укажите идентификатор клиента удостоверения. No
volumeAttributes.AzureStorageIdentityResourceID Укажите идентификатор ресурса удостоверения. No
volumeAttributes.MSIEndpoint Укажите конечную точку MSI. No
volumeAttributes.AzureStorageSPNClientID Укажите идентификатор клиента для имени субъекта-службы Azure. No
volumeAttributes.AzureStorageSPNTenantID Укажите идентификатор арендатора для имени субъекта-службы Azure. No
volumeAttributes.AzureStorageAADEndpoint Укажите конечную точку Microsoft Entra. No
--- Следующие параметры предназначены только для следующих компонентов: ключ учетной записи чтения blobfuse и маркер SAS из хранилища ключей --- --- ---
volumeAttributes.keyVaultURL Укажите DNS-имя Azure Key Vault. {имя_хранилища}.vault.azure.net No
volumeAttributes.keyVaultSecretName Укажите имя секрета Azure Key Vault. Имя существующего секрета Azure Key Vault. No
volumeAttributes.keyVaultSecretVersion Версия секрета Azure Key Vault. Существующая версия No Если этот параметр пуст, драйвер использует текущую версию.

Создание контейнера хранилища BLOB-объектов

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

В рамках этой статьи создайте контейнер в группе ресурсов узла. Сначала получите имя группы ресурсов, выполнив команду az aks show и добавив параметр запроса --query nodeResourceGroup. В приведенном ниже примере показано, как получить группу ресурсов узла для кластера AKS myAKSCluster в группе ресурсов myResourceGroup:

az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv

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

MC_myResourceGroup_myAKSCluster_eastus

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

Подключение тома

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

При подключении хранилища BLOB-объектов с помощью протокола NFS версии 3 не выполняется проверка подлинности с помощью ключа учетной записи. Ваш кластер AKS должен располагаться в той же виртуальной сети, что и узел агента, или в пиринговой виртуальной сети. Единственный способ защитить данные в учетной записи хранения — настроить виртуальную сеть и другие параметры безопасности сети. Дополнительные сведения о настройке доступа NFS к учетной записи хранения см. в разделе Подключение хранилища BLOB-объектов с использованием протокола NFS 3.0.

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

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

    Примечание.

    volumeHandle значение должно быть уникальным идентификатором тома для каждого идентичного контейнера 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 используется только для сопоставления размера между PersistentVolumes и PersistentVolumeClaims. Рекомендуется использовать вымышленное высокое значение. Модуль 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
    

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

Следующий YAML создает модуль pod, использующий постоянный том или утверждение постоянного тома с именем ПВХ-BLOB, созданное /mnt/blob ранее, для подключения хранилища BLOB-объектов Azure на пути.

  1. Создайте файл nginx-pod-blob.yaml и скопируйте в него следующий код YAML. При создании постоянного тома для NFS или Blobfuse убедитесь в том, что параметр claimName совпадает с утверждением постоянного тома, созданного на предыдущем шаге при создании постоянного тома для 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 и подключить ПВХ с помощью команды kubectl create , ссылающейся на файл YAML, созданный ранее:

    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
    ...
    

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