Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если нескольким модулям pod требуется одновременный доступ к одному тому хранилища, можно использовать Файлы Azure для подключения с помощью протокола Server Message Block (SMB) или NFS. В этой статье показано, как динамически и статически создать общую папку Azure для использования несколькими pod в кластере Azure Kubernetes Service (AKS).
Замечание
Драйвер CSI Azure для файлов разрешает только подключение сетевых ресурсов SMB с использованием аутентификации на основе ключей (NTLM версии 2), и поэтому не поддерживает максимальный уровень безопасности в настройках совместного использования Azure. Монтирование общих ресурсов NFS не требует аутентификации на основе ключей.
Замечание
Мы рекомендуем FIO при выполнении тестов проверки производительности. Дополнительные сведения см. в статье о средствах и тестах для тестирования.
Предпосылки
- Azure CLI версии 2.0.59 или более поздней, установлен и настроен. Найдите версию с помощью
az --versionкоманды. Сведения об установке или обновлении см. в разделе Install Azure CLI. - Драйвер Файлы Azure CSI включен в кластере AKS.
- Учетная запись хранилища Azure .
- При выборе файловых ресурсов на основе SSD (Premium) и HDD (Standard) важно понимать модель развертывания и требования ожидаемого характера использования, который планируется на Файлы Azure. Файлы Azure имеет три модели выставления счетов: предоставленный версии 2 (рекомендуется), оплата по мере использования и устаревшая предоставленная v1. Дополнительные сведения см. в разделе Выбор уровня производительности Файлы Azure на основе шаблонов использования.
Используйте встроенные классы хранилища для создания динамических PV с Файлы Azure
Классы хранилища определяют, как единица хранилища динамически создается в виде постоянного тома. Учетная запись хранения автоматически создается в группе ресурсов node для использования с классом хранилища и содержанием файловой доли Файлы Azure. При использовании драйверов CSI в AKS имеются два дополнительных встроенных StorageClasses, которые используют драйверы хранилища CSI Файлы Azure (остальные классы хранилища CSI создаются вместе с кластером и включают встроенные классы хранилища по умолчанию):
-
azurefile-csi: создает общую папку Azure в хранилище HDD. -
azurefile-csi-premium: создает общую папку Azure в хранилище SSD.
Политика восстановления в обоих классах хранилища гарантирует, что базовый файловый ресурс Azure удаляется при удалении соответствующего ПВ. Классы хранилища также настраивают масштабируемость общих папок, поэтому для её изменения необходимо просто отредактировать заявку на постоянный том (PVC) с указанием нового размера.
Вы можете выбрать один из следующих вариантов SKU избыточности хранилища Azure для параметра skuname в классе определения хранилища:
- PremiumV2_LRS (рекомендуется): версия 2 SSD, локально-избыточное хранилище
- PremiumV2_ZRS (рекомендуется): подготовленный SSD v2, зонально-избыточное хранилище
- Premium_LRS: предоставленная SSD версия 1 (устаревший), локально избыточное хранилище
- Premium_ZRS: SSD подготовленный первой версии (устаревшая версия), зонально-избыточное хранилище
- StandardV2_LRS: подготовленное v2 HDD, локально избыточное хранилище
- StandardV2_ZRS: HDD выделено v2, зонально-резервируемое хранилище
- StandardV2_GRS: выделенный HDD v2, геоизбыточное хранилище
- StandardV2_GZRS: выделенное HDD v2, гео-зонально-избыточное хранилище
- Standard_LRS: HDD с оплатой по мере использования, локально избыточное хранилище
- Standard_GRS: HDD с оплатой по факту использования, геоизбыточное хранилище
- Standard_ZRS: HDD с оплатой по мере использования, зонально-избыточное хранилище
Это важно
Чтобы использовать подготовленную модель выставления счетов версии 2 для Файлы Azure, необходимо использовать драйвер CSI Файлы Azure CSI version 1.35.0 или более поздней версии.
Замечание
Для новых развертываний рекомендуется подготовить SSD версии 2 (PremiumV2_LRS или PremiumV2_ZRS) для большинства рабочих нагрузок. Общие папки SSD обеспечивают более высокую производительность и поддержку дисков с низкой задержкой для рабочих нагрузок с интенсивным вводом-выводом. Минимальная емкость общей папки для учетных записей Premium составляет 100 ГиБ.
Создайте настраиваемые классы хранилища для динамических PV с использованием Файлы Azure
Классы хранилища по умолчанию подходят для большинства сценариев. В некоторых случаях может потребоваться настроить собственный класс хранилища с собственными параметрами. Например, может потребоваться настроить mountOptions общую папку.
Создайте файл с именем
azure-file-sc.yamlи вставьте в следующий пример манифеста:kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: my-azurefile provisioner: file.csi.azure.com reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: # Canonical permissions: 0755/uid=1000/gid=1000 for least privilege. # Use 0777/uid=0/gid=0 only if app requires root or broad write access. - dir_mode=0755 - file_mode=0755 - uid=1000 - gid=1000 - mfsymlinks - cache=strict - actimeo=30 - nosharesock parameters: skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS (SSD v1), StandardV2_LRS (HDD v2), Standard_LRS (HDD pay-as-you-go)Создайте класс хранилища с помощью
kubectl applyкоманды:kubectl apply -f azure-file-sc.yamlВыходные данные должны выглядеть примерно так:
storageclass.storage.k8s.io/my-azurefile created
Параметры класса хранилища для динамических PV с Файлы Azure
В следующей таблице приведены параметры, которые можно использовать для определения пользовательского класса хранилища для запросов сохраняемого тома (PVCs) с Файлы Azure.
| Имя. | Значение | Доступные значения | Обязательно | Значение по умолчанию |
|---|---|---|---|---|
accountAccessTier |
Уровень доступа для учетной записи хранения | Стандартная учетная запись может выбрать Hot или Cool, а учетная запись Premium может выбрать только Premium. |
нет | Empty. Используйте параметр по умолчанию для различных типов учетных записей хранения. |
accountQuota |
Ограничивает квоту для учетной записи. Можно указать максимальную квоту в ГБ (102400 ГБ по умолчанию). Если учетная запись превышает указанную квоту, драйвер пропускает выбор учетной записи. | нет | 102400 |
|
allowBlobPublicAccess |
Разрешить или запретить общий доступ ко всем блобам или контейнерам учетной записи хранилища, созданной драйвером. |
true или false |
нет | false |
disableDeleteRetentionPolicy |
Укажите, отключите ли DeleteRetentionPolicy для учетной записи хранения, созданной драйвером. |
true или false |
нет | false |
folderName |
Укажите имя папки в файловом ресурсе Azure. | Существующее имя папки в файловом хранилище Azure. | нет | Если имя папки не существует в общем доступе, подключение не удается. |
getLatestAccount |
Определяет, следует ли получить последний ключ учетной записи на основе времени создания. Этот драйвер получает первый ключ по умолчанию. |
true или false |
нет | false |
location |
Укажите регион Azure учетной записи хранения Azure. | Например: eastus. |
нет | Если поле пусто, драйвер использует то же название местоположения, что и текущий кластер AKS. |
matchTags |
Сопоставляет теги, когда драйвер пытается найти подходящую учетную запись хранения. |
true или false |
нет | false |
networkEndpointType |
Укажите тип сетевой конечной точки для учетной записи хранения, созданной драйвером. Если 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 (псевдоним: 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 предназначены для модели v2 для Файлы Azure. |
storageAccount |
Укажите имя учетной записи хранения Azure. | storageAccountName | нет | Если имя учетной записи хранения не указано, драйвер будет искать подходящую учетную запись хранения, соответствующую параметрам учетной записи в одной группе ресурсов. Если не удается найти соответствующую учетную запись хранения, она создаст новую. Однако если указано имя учетной записи хранения, учетная запись хранения должна существовать. |
storageEndpointSuffix |
Укажите суффикс конечной точки хранилища Azure. |
core.windows.net, core.chinacloudapi.cnи т. д. |
нет | Если это пусто, драйвер использует суффикс конечной точки хранилища по умолчанию в соответствии с облачной средой. Например: core.windows.net. |
subscriptionID |
Укажите идентификатор подписки Azure, где создается файловая доля Azure. | идентификатор подписки Azure | нет | Если значение не пустое, необходимо указать resourceGroup. |
tags |
Теги создаются в новой учетной записи хранения. | Формат тега: 'foo=aaa,bar=bbb' | нет | "" |
| --- | Следующие параметры предназначены только для протокола SMB | --- | --- | --- |
storeAccountKey |
Укажите, нужно ли сохранять ключ доступа учетной записи в секрет Kubernetes. |
true или false false означает, что для получения ключа учетной записи драйвер использует удостоверение kubelet. |
нет | true |
secretName |
Указывает имя секрета для хранения ключа учетной записи. | нет | ||
secretNamespace |
Укажите пространство имен секрета для хранения ключа учетной записи. Примечание. Если secretNamespace не указано, секрет создается в том же пространстве имен, что и pod. |
default,kube-system и т. д. |
нет | Пространство имен PVC, например csi.storage.k8s.io/pvc/namespace |
useDataPlaneAPI |
Укажите, следует ли использовать API плоскости данных для создания, удаления или изменения размера общей папки, что может решить проблему ограничения API SRP, так как API плоскости данных практически не имеет ограничений, в то время как может возникнуть сбой, если в учетной записи хранения настроены брандмауэр или параметры виртуальной сети. |
true или false |
нет | false |
| --- | Следующие параметры предназначены только для протокола NFS. | --- | --- | --- |
mountPermissions |
Разрешения смонтированной папки. Значение по умолчанию — 0777. Если установлено значение 0, драйвер не выполняет chmod после подключения |
0777 |
нет | |
rootSquashType |
Укажите поведение подавления привилегий суперпользователя для общего доступа. Значение по умолчанию — NoRootSquash. |
AllSquash, NoRootSquashRootSquash |
нет | |
| --- | Следующие параметры предназначены только для параметра виртуальной сети (например, NFS, частная конечная точка) | --- | --- | --- |
fsGroupChangePolicy |
Указывает, как драйвер изменяет владение томом. Модуль Pod securityContext.fsGroupChangePolicy игнорируется. |
OnRootMismatch(по умолчанию), AlwaysNone |
нет | OnRootMismatch |
subnetName |
Имя подсети | Существующее имя подсети узла агента. | нет | Если драйвер пустой, драйвер использует значение subnetName в файле конфигурации облака Azure. |
vnetName |
Имя виртуальной сети | Существующее имя виртуальной сети. | нет | Если это пусто, драйвер обновит все подсети в виртуальной сети кластера. |
vnetResourceGroup |
Укажите группу ресурсов виртуальной сети, в которой определена виртуальная сеть. | Существующее имя группы ресурсов. | нет | Если драйвер пустой, драйвер использует значение vnetResourceGroup в файле конфигурации облака Azure. |
Это важно
Параметр класса хранилища tags применяется к учетной записи хранения, когда том подготавливается драйвером CSI Файлы Azure. После создания постоянного тома спецификация неизменна, PersistentVolume поэтому редактирование или исправление PV для изменения тегов или других атрибутов тома закончится неудачей. Обновление класса хранилища позже влияет только на недавно подготовленные тома.
Чтобы обновить теги в существующем томе, измените их в базовой учетной записи хранения в Azure. Если класс хранения использует существующую учетную запись хранения, обновите теги в этой учетной записи. Эта операция не прерывает существующие подключения, модули pod или доступ к данным, а обновленные теги Azure не синхронизируются с kubernetes PV YAML или метаданными. Рассмотрим пример.
az storage account update \
--name mystorageaccount \
--resource-group MC_myResourceGroup_myAKSCluster_eastus \
--set tags.abc=ABC123
Замечание
Если учетная запись хранения создается драйвером, необходимо указать networkEndpointType: privateEndpoint только параметр в классе хранилища. Драйвер CSI создает частную конечную точку и частную зону DNS (именованную privatelink.file.core.windows.net) вместе с учетной записью. Если у вас есть собственная учетная запись хранения, необходимо создать частную конечную точку для аккаунта хранения. Если вы используете Файлы Azure хранилище в изолированном сетевом кластере, необходимо создать пользовательский класс хранилища с помощью networkEndpointType: privateEndpoint. В качестве ссылки можно использовать следующий пример манифеста:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-private-custom
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, StandardV2_LRS, Standard_LRS
networkEndpointType: privateEndpoint
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- 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
Создать PVC с Файлы Azure
В PVC используется объект класса хранилища для динамического создания файлового хранилища Azure. Пример манифеста YAML в этом разделе можно использовать для создания ПВХ размером 100 ГБ с доступом ReadWriteMany . Дополнительные сведения о режимах доступа см. в разделе "Режимы доступа Kubernetes PV".
Создайте файл с именем
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.Создайте ПВХ с помощью
kubectl applyкоманды.kubectl apply -f azure-file-pvc.yamlПросмотрите состояние ПВХ с помощью
kubectl getкоманды:kubectl get pvc my-azurefileВаши выходные данные должны напоминать следующий пример вывода, который показывает, что PVC находится в состоянии
Bound, а PV был динамически создан для удовлетворения требования.NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE my-azurefile Bound pvc-aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb 100Gi RWX my-azurefile 5m
Использование ПВХ с Файлы Azure в модуле pod
Пример манифеста YAML в этом разделе создает pod, использующий PVC my-azurefile для подключения файлового хранилища Файлы Azure по пути /mnt/azure. Для контейнеров Windows Server укажите mountPath с помощью соглашения о пути Windows, например 'D:'.
Создайте файл с именем
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Создайте pod с помощью команды
kubectl apply.kubectl apply -f azure-pvc-files.yamlПросмотрите состояние pod с помощью
kubectl describeкоманды:kubectl describe pod mypodВыходные данные должны выглядеть примерно так, как показано, что модуль pod запущен и том подключен по правильному пути:
Containers: mypod: Container ID: docker://BB22CC33DD44EE55FF66AA77BB88CC99DD00EE11 Image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine Image ID: docker-pullable://nginx@sha256:AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00 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 [...]
Параметры монтирования для Файлы Azure
Расположение для настройки параметров монтирования (mountOptions) зависит от того, подготавливаете ли вы динамические или статические постоянные тома:
- Если вы динамически подготавливаете том с классом хранилища, укажите параметры подключения для объекта класса хранилища (тип: StorageClass).
- Если вы статически подготавливаете том, укажите параметры монтирования для объекта PV (тип: PersistentVolume).
- Если вы подключаете общую папку в виде встроенного тома, укажите параметры подключения в объекте Pod (тип: Pod).
Дополнительные сведения см. в разделе "Параметры подключения".
Значение по умолчанию для fileMode и dirMode в Kubernetes версии 1.13.0 и более поздней — 0777. В следующем примере задано значение 0777:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: my-azurefile
provisioner: file.csi.azure.com
allowVolumeExpansion: true
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- 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: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS (SSD v1), StandardV2_LRS (HDD v2), Standard_LRS (HDD pay-as-you-go)
Рекомендуемые параметры монтирования для долей SMB
Рекомендуемые варианты подключения для общих папок SMB приведены в следующем примере класса хранилища:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-premiumv2-custom
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, StandardV2_LRS, Standard_LRS, Standard_ZRS
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- 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, а рабочая нагрузка тяжела, зарегистрируйтесь, чтобы использовать функцию кэширования метаданных для повышения производительности.
Дополнительные сведения см. в статье Повышение производительности для общих папок SMB Azure.
Рекомендуемые параметры подключения для общих папок NFS
Рекомендуемые параметры подключения для общих папок NFS приведены в следующем примере класса хранилища:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-premiumv2-custom
provisioner: file.csi.azure.com
parameters:
protocol: nfs
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, PremiumV2_ZRS
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
- nconnect=4 # improves performance by enabling multiple connections to share
- noresvport # improves availability
- actimeo=30 # reduces latency for metadata-heavy workloads
Увеличьте размер предварительного чтения, чтобы повысить пропускную способность чтения.
Хотя Файлы Azure поддерживает настройку nconnect до максимального значения 16, рекомендуется настроить параметры подключения с оптимальным параметром nconnect=4. В настоящее время в реализации nconnect для Файлы Azure нет никаких улучшений, превышающих четыре канала.
Создание моментального снимка тома из ПВХ с Файлы Azure
Драйвер CSI Файлы Azure поддерживает создание снапшотов постоянных томов, а также связанных с ними файловых томов.
Создайте класс снимка тома
kubectl applyс помощью команды:kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshotclass-azurefile.yamlВыходные данные должны выглядеть примерно так:
volumesnapshotclass.snapshot.storage.k8s.io/csi-azurefile-vsc createdСоздайте моментальный снимок тома из динамического PVC, созданного ранее в этом руководстве, с помощью команды
kubectl apply.kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshot-azurefile.yamlВыходные данные должны выглядеть примерно так:
volumesnapshot.snapshot.storage.k8s.io/azurefile-volume-snapshot createdПросмотрите состояние моментального снимка тома с помощью
kubectl describeкоманды:kubectl describe volumesnapshot azurefile-volume-snapshotВаши выходные данные должны выглядеть примерно следующим образом: моментальный снимок тома не готов к использованию, поскольку драйвер все еще создает снимок базового файлового раздела Azure.
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: 00aa00aa-bb11-cc22-dd33-44ee44ee44ee Spec: Source: Persistent Volume Claim Name: pvc-azurefile Volume Snapshot Class Name: csi-azurefile-vsc Status: Bound Volume Snapshot Content Name: snapcontent-00aa00aa-bb11-cc22-dd33-44ee44ee44ee Ready To Use: false Events: <none>
Изменение размера постоянного тома с помощью Файлы Azure
Замечание
Сжатие постоянных томов в настоящее время не поддерживается. Попытка исправления существующего ПВХ с меньшим размером, чем текущий, приводит к следующему сообщению об ошибке:
The persistentVolumeClaim "pvc-azurefile" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.
Вы можете запросить больший объем для ПВХ, изменив объект ПВХ, чтобы указать больший размер. Это изменение активирует расширение базового тома, которое производит резервное копирование постоянного тома. Новый постоянный том (Persistent Volume, PV) никогда не будет создан для удовлетворения запроса. Вместо этого изменяется размер существующего тома.
В AKS встроенный managed-csi класс хранилища уже поддерживает расширение, поэтому вы можете использовать динамический PVC, который был создан ранее в этом руководстве. PVC запросил область хранения на 100 ГиБ.
Проверьте текущий размер ПВХ и файловой системы внутри модуля pod с помощью
kubectl execкоманды для выполненияdf -hкоманды внутри модуля pod:kubectl exec -it nginx-azurefile -- df -h /mnt/azurefileВыходные данные должны выглядеть примерно так, как показано, что файловая система имеет размер 100 ГБ:
Filesystem Size Used Avail Use% Mounted on //a123b4c567de89fghi01jk2.file.core.windows.net/pvc-00aa00aa-bb11-cc22-dd33-44ee44ee44ee 100G 128K 100G 1% /mnt/azurefileРасширьте PVC, увеличив поле
spec.resources.requests.storageс помощью командыkubectl patch. В этом примере мы увеличим общую папку до 200 ГиБ:kubectl patch pvc pvc-azurefile --type merge --patch '{"spec": {"resources": {"requests": {"storage": "200Gi"}}}}'Выходные данные должны выглядеть примерно следующим образом, что показывает успешное исправление PVC:
persistentvolumeclaim/pvc-azurefile patchedУбедитесь, что размер ПВХ был успешно изменен, и новый размер отражается в модуле pod с помощью
kubectl get pvcкоманды иdf -hкоманды внутри модуля pod:kubectl get pvc pvc-azurefileВыходные данные должны выглядеть примерно так, как показано, что ПВХ по-прежнему находится в
Boundсостоянии, и емкость была обновлена до 200 ГиБ:NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-azurefile Bound pvc-00aa00aa-bb11-cc22-dd33-44ee44ee44ee 200Gi RWX azurefile-csi 64mПроверьте новый размер файловой системы в контейнере с помощью команды
kubectl exec, чтобы выполнить командуdf -hвнутри контейнера:kubectl exec -it nginx-azurefile -- df -h /mnt/azurefileВыходные данные должны выглядеть примерно так, как показано, что размер файловой системы составляет 200 ГБ:
Filesystem Size Used Avail Use% Mounted on //a123b4c567de89fghi01jk2.file.core.windows.net/pvc-bbbbbbbb-1111-2222-3333-cccccccccccc 200G 128K 200G 1% /mnt/azurefile
Использование постоянного тома с частным хранилищем Файлы Azure (частная конечная точка)
Если ресурсы Файлы Azure защищены с помощью частной конечной точки, необходимо создать собственный класс хранилища. Убедитесь, что вы настроили параметры DNS для разрешения IP-адреса частной конечной точки в полное доменное имя FQDN строка подключения. При создании класса хранилища с помощью драйвера CSI Файлы Azure необходимо указать параметр networkEndpointType со значением privateEndpoint и указать следующие параметры:
-
resourceGroup: группа ресурсов, в которой развернута учетная запись хранения. -
storageAccount: имя учетной записи хранения. -
server: полное доменное имя частной конечной точки учетной записи хранения.
Создайте файл с именем
private-azure-file-sc.yamlи вставьте следующий манифест. Убедитесь, что вы заменили заполнители<resourceGroup>и<storageAccountName>.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azurefile-csi-private-custom provisioner: file.csi.azure.com allowVolumeExpansion: true parameters: skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, StandardV2_LRS resourceGroup: <resourceGroup> storageAccount: <storageAccountName> server: <storageAccountName>.file.core.windows.net networkEndpointType: privateEndpoint reclaimPolicy: Delete volumeBindingMode: Immediate mountOptions: # Canonical permissions: 0755/uid=1000/gid=1000 for least privilege. # Use 0777/uid=0/gid=0 only if app requires root or broad write access. - dir_mode=0755 - file_mode=0755 - uid=1000 - gid=1000 - 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Создайте класс хранилища с помощью
kubectl applyкоманды:kubectl apply -f private-azure-file-sc.yamlВыходные данные должны выглядеть примерно так:
storageclass.storage.k8s.io/private-azurefile-csi createdСоздайте файл с именем
private-pvc.yamlи вставьте его в следующий манифест. Убедитесь, чтоstorageClassNameсоответствует имени существующего класса хранилища.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: private-azurefile-pvc spec: accessModes: - ReadWriteMany storageClassName: private-azurefile-csi resources: requests: storage: 100GiСоздайте ПВХ с помощью
kubectl applyкоманды.kubectl apply -f private-pvc.yaml
Использование Файлы Azure с контейнерами Windows
Драйвер CSI Файлы Azure также поддерживает Windows узлы и контейнеры. Чтобы использовать контейнеры Windows, следуйте инструкции по быстрому запуску Windows контейнеров, чтобы добавить пул узлов Windows. После настроек Windows-пула узлов можно использовать встроенные классы хранилища, такие как azurefile-csi, или создать пользовательский. Пример набора с отслеживанием состояния Windows в этом разделе каждую секунду сохраняет метки времени в файл data.txt, который подключен к общей папке Azure с помощью Файлы Azure CSI-драйвера.
Создайте StatefulSet с помощью команды
kubectl apply.kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/windows/statefulset.yamlВыходные данные должны выглядеть примерно так:
statefulset.apps/busybox-azurefile createdУбедитесь, что метки времени записываются в общую папку с помощью следующих
kubectl execкоманд для выполненияcatкоманды внутри pod:kubectl exec -it busybox-azurefile-0 -- cat c:\\mnt\\azurefile\\data.txt # on Linux/MacOS Bash kubectl exec -it busybox-azurefile-0 -- cat c:\mnt\azurefile\data.txt # on Windows Powershell/CMDВаши выходные данные должны выглядеть следующим образом, показывая, что метки времени записываются в общую папку каждую секунду:
2020-08-27 22:11:01Z 2020-08-27 22:11:02Z 2020-08-27 22:11:04Z (...)
Использование протокола NFS с Файлы Azure
Файлы Azure поддерживает протокол NFS версии 4.1. Поддержка NFS версии 4.1 для Файлы Azure предоставляет полностью управляемую файловую систему NFS как услугу, построенную на платформе распределенного хранилища с высокой доступностью и надежностью.
Этот параметр оптимизирован для рабочих нагрузок произвольного доступа с обновлениями данных на месте и обеспечивает полную поддержку файловой системы POSIX. В этом разделе показано, как использовать ресурсы NFS с помощью драйвера Azure File CSI в кластере AKS.
Предварительные требования для использования общих папок NFS с Файлы Azure
- Для NFS требуются общие папки SSD (например
PremiumV2_LRS,PremiumV2_ZRS,Premium_LRSилиPremium_ZRS) и учетная запись хранения с поддержкой виртуальной сети. - Идентификатор плоскости управления вашего кластера AKS (то есть, имя вашего кластера AKS) добавляется к роли Contributor в виртуальной сети и NetworkSecurityGroup.
- Для кластеров AKS, служебный принципал или управляемое удостоверение службы (MSI) должны быть добавлены в роль Участника к аккаунту хранилища.
Замечание
Вы можете использовать частную конечную точку вместо предоставления доступа к выбранной виртуальной сети.
Оптимизация параметров размера чтения и записи
В этом разделе содержатся сведения о подходе к настройке производительности NFS с драйвером CSI Файлы Azure cSI с параметрами 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, которые поддерживают эффективную передачу пакетов и не уменьшают пропускную способность и не увеличивают задержку.
Следующий пример манифеста настраивает раздел mountOptions в классе хранилища с максимальным значением rsize и wsize, равным 256 КиБ.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-premiumv2-custom
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
protocol: nfs
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, PremiumV2_ZRS
mountOptions:
- nconnect=4
- noresvport
- actimeo=30
- rsize=262144
- wsize=262144
Для списка поддерживаемых mountOptions см. параметры подключения NFS.
Создание класса хранения общей папки NFS
Замечание
vers, minorversion, sec настраиваются драйвером CSI файла Azure. Указание значения в манифесте для этих свойств не поддерживается.
Создайте файл с именем
nfs-sc.yamlи вставьте его в следующий манифест. Обязательно укажитеprotocol: nfsв разделе параметров и настройте необходимыеmountOptionsпараметры для рабочей нагрузки.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azurefile-csi-premiumv2-custom provisioner: file.csi.azure.com allowVolumeExpansion: true parameters: protocol: nfs skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, PremiumV2_ZRS mountOptions: - nconnect=4 - noresvport - actimeo=30После редактирования и сохранения файла создайте класс хранилища с помощью
kubectl applyкоманды.kubectl apply -f nfs-sc.yamlВыходные данные должны выглядеть примерно так:
storageclass.storage.k8s.io/azurefile-csi-nfs created
Создание набора с отслеживанием состояния с помощью общей папки с поддержкой NFS
Создайте файл с именем
nfs-ss.yamlи вставьте его в следующий манифест. Эта конфигурация сохраняет метки времени в файлdata.txt.apiVersion: apps/v1 kind: StatefulSet metadata: name: statefulset-azurefile labels: app: nginx spec: podManagementPolicy: Parallel # default is OrderedReady serviceName: statefulset-azurefile replicas: 1 template: metadata: labels: app: nginx spec: nodeSelector: "kubernetes.io/os": linux containers: - name: statefulset-azurefile image: mcr.microsoft.com/oss/nginx/nginx:1.19.5 command: - "/bin/bash" - "-c" - set -euo pipefail; while true; do echo $(date) >> /mnt/azurefile/outfile; sleep 1; done volumeMounts: - name: persistent-storage mountPath: /mnt/azurefile updateStrategy: type: RollingUpdate selector: matchLabels: app: nginx volumeClaimTemplates: - metadata: name: persistent-storage spec: storageClassName: azurefile-csi-premiumv2-custom accessModes: ["ReadWriteMany"] resources: requests: storage: 100GiСоздайте StatefulSet с помощью команды
kubectl apply.kubectl apply -f nfs-ss.yamlВыходные данные должны выглядеть примерно так:
statefulset.apps/statefulset-azurefile createdПроверьте содержимое тома с помощью следующей
kubectl execкоманды, чтобы выполнитьdf -hкоманду внутри pod:kubectl exec -it statefulset-azurefile-0 -- df -hВаше выходное сообщение должно выглядеть следующим образом: это показывает, что NFS-расшаренный ресурс подключен по правильному пути и имеет корректный размер.
Filesystem Size Used Avail Use% Mounted on ... /dev/sda1 29G 11G 19G 37% /etc/hosts accountname.file.core.windows.net:/accountname/pvc-cccccccc-2222-3333-4444-dddddddddddd 100G 0 100G 0% /mnt/azurefile ...Так как общая папка NFS находится в учетной записи хранения класса Premium, минимальный размер общей папки составляет 100 ГиБ. Если вы создаете PVC с небольшим размером хранилища, вы можете столкнуться с примерно такой ошибкой: Не удалось создать общую папку ... размер (5)....
Шифрование при передаче (EiT) для общих папок NFS (предварительная версия)
Замечание
Функция EiT теперь доступна в предварительной версии, начиная с AKS версии 1.33. Ubuntu 20.04, Azure Linux, arm64 и Windows узлы в настоящее время не поддерживаются.
Эта функция поддерживается во всех Azure регионах, которые поддерживают SSD Azure файловые хранилища.
Шифрование при передаче (EiT) гарантирует, что все операции чтения и записи в общие папки NFS в виртуальной сети шифруются, обеспечивая дополнительный уровень безопасности.
Задав encryptInTransit: "true" в параметрах класса хранилища, вы можете включить шифрование данных в транзитном режиме для общих папок NFS Azure. Рассмотрим пример.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-premiumv2-custom
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
protocol: nfs
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, PremiumV2_ZRS
encryptInTransit: "true"
mountOptions:
- nconnect=4
- noresvport
- actimeo=30
Использование управляемого удостоверения для доступа к хранилищу Файлы Azure (предварительная версия)
Файлы Azure теперь поддерживает проверку подлинности на основе управляемых удостоверений для доступа SMB. Это позволяет приложениям безопасно получать доступ к Файлы Azure без хранения учетных данных или управления ими.
Замечание
Поддержка управляемых удостоверений для Файлы Azure в AKS доступна в предварительной версии, начиная с AKS версии 1.34 на узлах Linux.
Предварительные требования для использования управляемого удостоверения для доступа к хранилищу Файлы Azure
- Убедитесь, что удостоверение Kubelet, назначаемое пользователем , имеет
Storage File Data SMB MI Adminроль в учетной записи хранения.- Если вы используете собственную учетную запись хранения, необходимо назначить
Storage File Data SMB MI Adminроль назначенному пользователем удостоверению Kubelet в этой учетной записи хранения. - Если учетная запись хранения создается драйвером CSI, предоставьте
Storage File Data SMB MI Adminроль группе ресурсов, в которой находится учетная запись хранения.
- Если вы используете собственную учетную запись хранения, необходимо назначить
Включение управляемого удостоверения для динамических PV с помощью Файлы Azure
Чтобы включить управляемое удостоверение для динамически подготовленных томов, необходимо создать новый класс хранилища с параметрами: mountWithManagedIdentity, "true" и развернуть StatefulSet, используя этот класс хранилища.
В следующем примере манифеста настраивается класс хранилища для использования управляемого удостоверения для доступа к Файлы Azure:
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:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- 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
Включение управляемого удостоверения для статических PV с помощью Файлы Azure
Чтобы использовать управляемое удостоверение со статически подготовленными персистентными томами Файлы Azure, убедитесь, что выполнена следующая конфигурация:
- Включите SMBOauth в учетной записи хранения, выполнив следующую команду:
az storage account update --name <account-name> --resource-group <resource-group-name> --enable-smb-oauth true - Создайте PV с помощью
mountWithManagedIdentity:"true"и подключите PV к модулю pod приложения.
В следующем примере манифеста настраивается ПС для использования управляемого удостоверения для доступа к Файлы Azure:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-azurefile
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: azurefile-csi
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- 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
csi:
driver: file.csi.azure.com
# make sure volumeHandle is unique for every identical share in the cluster
volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}"
volumeAttributes:
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
shareName: EXISTING_FILE_SHARE_NAME
mountWithManagedIdentity: "true"
# optional, clientID of the managed identity, kubelet identity would be used by default if it's empty
clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx"
Использование удостоверения рабочей нагрузки для доступа к хранилищу Файлы Azure (предварительная версия)
Файлы Azure теперь поддерживает аутентификацию на основе удостоверений рабочих нагрузок для доступа к SMB. Удостоверение рабочей нагрузки позволяет подам осуществлять доступ к Файлы Azure с минимальным уровнем привилегий, не привязывая удостоверение приложения к жизненному циклу узла.
Замечание
Поддержка идентификации рабочей нагрузки для Файлы Azure в AKS доступна в предварительной версии, начиная с версии AKS 1.35.0 на Linux-узлах.
Предварительные условия для использования идентификации рабочей нагрузки для доступа к хранилищу Файлы Azure
Прежде чем использовать идентификацию рабочей нагрузки для доступа к Файлы Azure из AKS, выполните следующие предварительные условия.
1. Создайте кластер с включенным издателем oidc и получите учетные данные кластера AKS
Создайте новый кластер AKS с активированным эмитентом OIDC или убедитесь, что он уже активирован. Следуйте официальной документации по созданию кластера AKS с --enable-oidc-issuer параметром и получите учетные данные кластера. И задайте следующие переменные среды:
export RESOURCE_GROUP=<your resource group name>
export CLUSTER_NAME=<your cluster name>
export REGION=<your region>
2. Подготовка учетной записи хранения
Создайте новую учетную запись хранения и общую папку или используйте существующую. Подробные инструкции см. в Файлы Azure документации. Задайте следующие переменные среды:
export STORAGE_RESOURCE_GROUP=<your storage account resource group>
export ACCOUNT=<your storage account name>
export SHARE=<your fileshare name> # optional
Создайте или повторно используйте управляемую учетную запись и предоставьте необходимые разрешения
Создайте управляемое удостоверение, назначаемое пользователем, или повторно используйте существующее (например, управляемое удостоверение , связанное с группой ресурсов узла AKS). А также получите необходимые сведения об удостоверениях и ресурсах:
export UAMI=<your managed identity name>
az identity create --name $UAMI --resource-group $RESOURCE_GROUP
export USER_ASSIGNED_CLIENT_ID="$(az identity show -g $RESOURCE_GROUP --name $UAMI --query 'clientId' -o tsv)"
export IDENTITY_TENANT=$(az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query identity.tenantId -o tsv)
export ACCOUNT_SCOPE=$(az storage account show --name $ACCOUNT --query id -o tsv)
Предоставьте Storage File Data SMB MI Admin роль управляемому удостоверению. Эта роль позволяет монтировать Файлы Azure только с использованием идентификационных токенов рабочих процессов, без использования ключей аккаунта хранения.
az role assignment create --role "Storage File Data SMB MI Admin" --assignee $USER_ASSIGNED_CLIENT_ID --scope $ACCOUNT_SCOPE
4. Создание Kubernetes ServiceAccount
Создайте Службу Kubernetes ServiceAccount, которую будет использовать рабочая нагрузка.
export SERVICE_ACCOUNT_NAME=<your sa name>
export SERVICE_ACCOUNT_NAMESPACE=<your sa namespace>
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: ${SERVICE_ACCOUNT_NAME}
namespace: ${SERVICE_ACCOUNT_NAMESPACE}
EOF
5. Создайте федеративное удостоверение личности
Создайте учетные данные федеративного удостоверения между управляемым удостоверением, издателем учетной записи службы и субъектом az identity federated-credential create с помощью команды.
export FEDERATED_IDENTITY_NAME=<your federated identity name>
export AKS_OIDC_ISSUER="$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" -o tsv)"
az identity federated-credential create --name $FEDERATED_IDENTITY_NAME \
--identity-name $UAMI \
--resource-group $RESOURCE_GROUP \
--issuer $AKS_OIDC_ISSUER \
--subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
После выполнения этих действий рабочие нагрузки, работающие с указанным ServiceAccount, могут проходить проверку подлинности в Файлы Azure с помощью удостоверения рабочей нагрузки Microsoft Entra без использования ключей учетной записи хранения или управляемых удостоверений на уровне узла.
Включение удостоверения рабочей нагрузки для динамических PV с помощью Файлы Azure
Чтобы использовать удостоверение для рабочей нагрузки с динамически предоставленными постоянными томами Файлы Azure, убедитесь в следующей конфигурации:
Предоставление разрешений для идентификации плоскости управления драйвера CSI
- Назначьте роль для удостоверения, используемого контрольной плоскостью драйвера CSI, для целевой учетной записи хранения.
- Если учетная запись хранения создается динамически драйвером CSI, предоставьте
Storage Account Contributorроль группе ресурсов узла. - По умолчанию, идентификатор плоскости управления кластера AKS уже присваивается роли
Storage Account Contributorв группе ресурсов узлов для создания учетной записи хранения.
Создайте новый класс хранилища с помощью
mountWithWorkloadIdentityToken:"true"и разверните statefulset, используя этот класс хранилища.
Следующий пример манифеста настраивает класс хранилища для использования удостоверения рабочей нагрузки для доступа к Файлы Azure:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-wi
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
mountWithWorkloadIdentityToken: "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
- 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
Включение идентификации нагрузки для статических PV с помощью Файлы Azure
Чтобы использовать идентификацию рабочей нагрузки со статически выделенными Файлы Azure постоянными томами, убедитесь в следующей настройке:
- Включите SMBOauth в учетной записи хранения, выполнив следующую команду:
az storage account update --name <account-name> --resource-group <resource-group-name> --enable-smb-oauth true - Создайте PV с указанными
mountWithWorkloadIdentityToken"true"и подключите PV к поду приложения.
В следующем примере манифеста настраивается постоянный том (PV) для использования удостоверения для идентификации рабочих нагрузок и доступа к Файлы Azure.
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-azurefile
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: azurefile-csi
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
csi:
driver: file.csi.azure.com
# make sure volumeHandle is unique for every identical share in the cluster
volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}"
volumeAttributes:
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
shareName: EXISTING_FILE_SHARE_NAME
mountWithWorkloadIdentityToken: "true"
# optional, clientID of the managed identity, kubelet identity would be used by default if it's empty
clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx"
Создание статического PV с помощью Файлы Azure
В следующих разделах приведены инструкции по созданию статического ПВ с Файлы Azure. Статический ПВ — это постоянный том, который администратор создает вручную. Этот PV доступен для использования модулями pod в кластере. Чтобы использовать статический PV, создайте ПВХ, который ссылается на PV, а затем создадите модуль pod, который ссылается на ПВХ.
Параметры класса хранилища для статических PV с Файлы Azure
В следующей таблице содержатся параметры для настройки пользовательского класса хранилища для статических PVC с использованием Файлы Azure.
| Имя. | Значение | Доступные значения | Обязательно | Значение по умолчанию |
|---|---|---|---|---|
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 или другой суверенный облачный аккаунт. |
| --- | Следующие параметры предназначены только для протокола SMB | --- | --- | --- |
volumeAttributes.secretName |
Укажите секретное имя, которое хранит имя и ключ учетной записи хранения. | нет | ||
volumeAttributes.secretNamespace |
Укажите пространство имен секрета. |
default,kube-system и т. д. |
нет | Пространство имен ПВХ (csi.storage.k8s.io/pvc/namespace) |
nodeStageSecretRef.name |
Укажите секретное имя, которое хранит имя и ключ учетной записи хранения. | Существующее имя секрета. | нет | Если это пусто, драйвер использует удостоверение kubelet для получения ключа учетной записи. |
nodeStageSecretRef.namespace |
Укажите пространство имен секрета. | Пространство имен Kubernetes | нет | |
| --- | Следующие параметры предназначены только для протокола NFS. | --- | --- | --- |
volumeAttributes.fsGroupChangePolicy |
Указывает, как драйвер изменяет владение томом. Модуль Pod securityContext.fsGroupChangePolicy игнорируется. |
OnRootMismatch(по умолчанию), AlwaysNone |
нет | OnRootMismatch |
volumeAttributes.mountPermissions |
Укажите разрешения смонтированной папки. Значение по умолчанию — 0777. |
нет |
Создание общего файлового хранилища Azure
Прежде чем использовать общую папку Файлы Azure в качестве тома Kubernetes, необходимо создать учетную запись служба хранилища Azure и общую папку.
Получите имя группы ресурсов узла кластера AKS с помощью
az aks showкоманды с параметром--query nodeResourceGroup.az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsvВыходные данные команды будут выглядеть примерно так:
MC_myResourceGroup_myAKSCluster_eastusСоздайте учетную запись хранения с помощью
az storage account createкоманды с параметром--sku. Следующая команда создает учетную запись хранения с помощьюStandard_LRSSKU. Обязательно замените следующие заполнители:-
myAKSStorageAccountс именем учетной записи хранения -
nodeResourceGroupNameс именем группы ресурсов, в которую размещаются узлы кластера AKS. -
locationс именем региона для создания ресурса. Это должен быть тот же регион, что и узлы кластера AKS.
az storage account create --name myAKSStorageAccount --resource-group nodeResourceGroupName --location location --sku Standard_LRS-
Экспортируйте строка подключения в виде переменной среды, которая используется для создания общей папки, с помощью команды [
az storage account show-connection-string][az-storage-account-show-connection-string]. Обязательно заменитеstorageAccountNameна имя учетной записи хранения иresourceGroupNameна имя группы ресурсов.export AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name storageAccountName --resource-group resourceGroupName -o tsv)Замечание
Строки подключения должны быть защищены путем ротации ключей или хранения в безопасной среде Azure Key Vault. Дополнительные сведения о строках подключения см. в разделе Настройка строк подключения служба хранилища Azure и Управление ключами доступа к учетной записи хранилища. В рабочих средах Майкрософт рекомендуется использовать проверку подлинности Microsoft Entra ID. Дополнительные сведения можно найти в разделе Authorize access to data in служба хранилища Azure.
Создайте общую папку
az storage share createс помощью команды. Обязательно заменитеshareNameсвоим именем для общего доступа.az storage share create --name shareName --connection-string $AZURE_STORAGE_CONNECTION_STRINGЭкспортируйте ключ учетной записи хранилища как переменную среды, используя команду [
az storage account keys list][az-storage-account-keys-list]. Обязательно заменитеstorageAccountNameна имя учетной записи хранения иresourceGroupNameна имя группы ресурсов.STORAGE_KEY=$(az storage account keys list --resource-group nodeResourceGroupName --account-name myAKSStorageAccount --query "[0].value" -o tsv)Выведите имя и ключ учетной записи хранения с помощью следующей команды. Обратите внимание на ключ учетной записи хранения, который вы используете для создания секрета Kubernetes на следующем шаге.
echo Storage account key: $STORAGE_KEY
Создайте секрет Kubernetes
Kubernetes требуются учетные данные для доступа к файловому ресурсу, который был создан на предыдущем шаге. Эти учетные данные хранятся в секрете Kubernetes, на который ссылается при создании модуля Pod Kubernetes.
Создайте секрет с помощью
kubectl create secretкоманды. В следующем примере создается секрет с именем azure-secret и заполняется azurestorageaccountname и azurestorageaccountkey из предыдущего шага. Чтобы использовать существующую учетную запись хранения Azure, укажите имя и ключ учетной записи.kubectl create secret generic azure-secret --from-literal=azurestorageaccountname=myAKSStorageAccount --from-literal=azurestorageaccountkey=$STORAGE_KEY
Подключение общей папки в качестве постоянного тома
Создайте новый файл с именем
azurefiles-pv.yamlи вставьте в него следующее содержимое. В объектеcsiизменитеresourceGroup,volumeHandleиshareName. Для параметров подключения значениеfileModeпо умолчанию иdirModeравно 0777.apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: file.csi.azure.com name: azurefile spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: azurefile-csi csi: driver: file.csi.azure.com volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}" # make sure this volumeid is unique for every identical share in the cluster volumeAttributes: shareName: aksshare nodeStageSecretRef: name: azure-secret namespace: default mountOptions: # Canonical permissions: 0755/uid=1000/gid=1000 for least privilege. # Use 0777/uid=0/gid=0 only if app requires root or broad write access. - dir_mode=0755 - file_mode=0755 - uid=1000 - gid=1000 - mfsymlinks - cache=strict - nosharesock - actimeo=30 - nobrl # disable sending byte range lock requests to the server and for applications which have challenges with posix locksСоздайте PV, используя команду
kubectl create.kubectl create -f azurefiles-pv.yamlСоздайте файл с именем azurefiles-mount-options-pvc.yaml и вставьте в следующее содержимое. Убедитесь, что
storageClassNameсовпадает с именем существующего класса хранилища, иvolumeNameсовпадает с именем PV, созданного на предыдущем шаге.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azurefile spec: accessModes: - ReadWriteMany storageClassName: azurefile-csi volumeName: azurefile resources: requests: storage: 5GiСоздайте ПВХ с помощью
kubectl applyкоманды.kubectl apply -f azurefiles-mount-options-pvc.yamlУбедитесь, что ваш ПВХ создан и привязан к PV с помощью
kubectl getкоманды.kubectl get pvc azurefileВыходные данные должны иметь следующий вид: ПВХ находится в
Boundсостоянии, и он привязан к ПВ с именем azurefile.NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE azurefile Bound azurefile 5Gi RWX azurefile 5sОбновите спецификацию контейнера, чтобы ссылаться на ПВХ и pod в YAML-файле. Рассмотрим пример.
... volumes: - name: azure persistentVolumeClaim: claimName: azurefileСпецификация pod не может быть обновлена на месте, поэтому удалите модуль pod с помощью
kubectl deleteкоманды и повторно создайте его с помощьюkubectl applyкоманды.kubectl delete pod mypod kubectl apply -f azure-files-pod.yaml
Подключение файловой общой папки в качестве встроенного тома
Замечание
Чтобы избежать проблем с производительностью, рекомендуется использовать постоянный том вместо встроенного тома, когда множество подов обращаются к одному файловому ресурсу. Встроенный том может получать доступ только к секретам в том же пространстве имен, что и pod. Чтобы указать другое пространство имен секрета, используйте постоянный том.
Чтобы подключить общую папку Файлы Azure в pod, настройте том в спецификации контейнера.
Создайте новый файл с именем
azure-files-pod.yamlи вставьте в него следующее содержимое. Если имя общей папки или секретного имени изменено, обновитеshareNameиsecretName. Вы также можете обновитьmountPathпуть, по которому общая папка "Файлы" подключена в модуле pod. Для контейнеров Windows Server укажитеmountPathс помощью соглашения о пути Windows, например 'D:'.apiVersion: v1 kind: Pod metadata: name: mypod spec: nodeSelector: kubernetes.io/os: linux containers: - image: 'mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine' name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azure mountPath: /mnt/azure readOnly: false volumes: - name: azure csi: driver: file.csi.azure.com volumeAttributes: secretName: azure-secret # required shareName: aksshare # required mountOptions: 'dir_mode=0755,file_mode=0755,uid=1000,gid=1000,cache=strict,actimeo=30,nosharesock,nobrl' # optionalСоздайте pod с помощью команды
kubectl apply.kubectl apply -f azure-files-pod.yamlПросмотрите состояние pod с помощью
kubectl describeкоманды:kubectl describe pod mypod