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


Использование хранилища контейнеров Azure с Azure Elastic SAN

Azure Container Storage — это облачная служба управления объёмами, развертывания и оркестрации, разработанная специально для контейнеров. В этой статье показано, как настроить хранилище контейнеров Azure для использования Azure Elastic SAN в качестве серверного хранилища для рабочих нагрузок Kubernetes.

Это важно

Эта статья относится к хранилищу контейнеров Azure (версия 2.x.x), которая поддерживает локальный диск NVMe и Azure Elastic SAN в качестве резервных типов хранилища. Дополнительные сведения о более ранних версиях см. в документации Azure хранилище контейнеров (версия 1.x.x.

Что такое Azure Elastic SAN?

Azure Elastic SAN — это управляемая служба хранилища блоков. Он предоставляет центральный пул емкости и производительности хранилища, включая IOPS и пропускную способность. В этом пуле вы создаете несколько томов и присоединяете их ко многим вычислительным ресурсам. Вместо подготовки и настройки отдельных дисков для каждой рабочей задачи Elastic SAN выделяет хранилище из единого пула емкости и распределяет производительность между подключенными томами. Этот подход подходит для сред с множеством динамических рабочих нагрузок, когда спрос изменяется с течением времени, и неиспользуемая производительность одного тома используется другими томами. Elastic SAN обычно используется для общего масштабируемого блочного хранилища на многих томах или узлах. Кроме того, она поддерживает более быстрое подключение и отсоединение томов для оркестрированных рабочих нагрузок, более высокую плотность томов на узел, а также централизованное развертывание и управление емкостью и производительностью хранилища.

Расширение емкости Elastic SAN через хранилище контейнеров Azure в настоящее время не поддерживается. Вы можете resize Elastic SAN непосредственно на портале Azure или с помощью Azure CLI.

Предварительные условия

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

  • Для этой статьи требуется Azure CLI версии 2.83.0 или более поздней. Дополнительные сведения см. в статье Как установить Azure CLI. Отключите такие расширения, как aks-preview если возникают проблемы. Установите или обновите расширения по мере необходимости:

    • az extension add --upgrade --name k8s-extension
    • az extension add --upgrade --name elastic-san (только Elastic SAN)
  • Вам нужен клиент командной строки Kubernetes. kubectl Он уже установлен, если вы используете Azure Cloud Shell. Его можно установить локально, выполнив az aks install-cli команду.

  • Проверьте, поддерживается ли целевой регион в регионах хранилища контейнеров Azure.

  • Изучите инструкции по установке и убедитесь, что Azure Container Storage установлено правильно.

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

    az provider register --namespace Microsoft.ElasticSan
    

Настройка разрешений

Чтобы хранилище контейнеров Azure развернуло Elastic SAN, необходимо назначить роль Оператор хранилища контейнеров Azure управляемому удостоверению AKS. Для выполнения этого шага для вашей подписки на Azure потребуется роль владельца хранилища контейнеров Azure или участника хранилища контейнеров Azure.

Выполните следующие команды, чтобы назначить роли Azure Container Storage Operator вашему управляемому удостоверению AKS. Не забудьте заменить <resource-group>, <cluster-name>а <azure-subscription-id> также собственными значениями. Вы также можете сузить область для группы ресурсов, например /subscriptions/<azure-subscription-id>/resourceGroups/<resource-group>.

export AKS_MI_OBJECT_ID=$(az aks show --name <cluster-name> --resource-group <resource-group> --query "identityProfile.kubeletidentity.objectId" -o tsv)
az role assignment create --assignee $AKS_MI_OBJECT_ID --role "Azure Container Storage Operator" --scope "/subscriptions/<azure-subscription-id>"

Выбор модели подготовки

Хранилище контейнеров Azure поддерживает три способа использования Elastic SAN с Azure Kubernetes Service (AKS):

  • Динамическая подготовка: Azure хранилище контейнеров создает группы и тома Elastic SAN по запросу.
  • Подготовленная эластичная SAN и группа томов: Сначала вы создаете эластичную SAN и группу томов, а затем Azure Container Storage подготавливает тома внутри этих существующих ресурсов.
  • Статическая подготовка: вы предварительно создаёте Elastic SAN, группу томов и том, а затем предоставьте том в Kubernetes как статически определённый постоянный том (PV).

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

Динамическая подготовка эластичной сети SAN

Создание класса хранилища по умолчанию

Создайте файл манифеста YAML, например storageclass.yaml, используйте следующую спецификацию.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azuresan-csi
provisioner: san.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

Емкость Elastic SAN по умолчанию, подготовленная с помощью этого класса хранилища, составляет 1 ТиБ.

Кроме того, можно создать класс хранилища с помощью Terraform.

  1. Используйте Terraform для управления классом хранения, создав конфигурацию, как показано ниже main.tf. Обновите версию поставщика или путь kubeconfig по мере необходимости для вашей среды.

    terraform {
      required_version = ">= 1.5.0"
      required_providers {
        kubernetes = {
          source  = "hashicorp/kubernetes"
          version = "~> 3.0"
        }
      }
    }
    
    provider "kubernetes" {
      config_path = "~/.kube/config"
    }
    
    resource "kubernetes_storage_class_v1" "azuresan_csi" {
      metadata {
        name = "azuresan-csi"
      }
    
      storage_provisioner    = "san.csi.azure.com"
      reclaim_policy         = "Delete"
      volume_binding_mode    = "Immediate"
      allow_volume_expansion = true
    }
    
  2. Инициализация и применение конфигурации.

    terraform init
    terraform apply
    

Создание класса хранилища с настраиваемой емкостью Elastic SAN

Если требуется другая начальная емкость, отличная от 1 ТиБ по умолчанию, задайте initialStorageTiB параметр в классе хранилища.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azuresan-csi
provisioner: san.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
parameters:
  initialStorageTiB: "10"

Предварительно подготовленные эластичные SAN и группы томов

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

Создание класса хранилища для предварительно подготовленной эластичной сети SAN

Если у вас еще не установлено Azure Container Storage, установите его.

  1. Определите управляемую группу ресурсов кластера AKS.

    kubectl get node -o jsonpath={range .items[*]}{.spec.providerID}{"\n"}{end}
    

    Группа ресурсов узла появится после /resourceGroup/ идентификатора поставщика.

  2. Создайте эластичную SAN в управляемой группе ресурсов.

    az elastic-san create --resource-group <node-resource-group> --name <san-name> --location <node-region> --sku "{name:Premium_LRS,tier:Premium}" --base-size-tib 1 --extended-capacity-size-tib 1
    
  3. Создайте класс хранилища, который ссылается на эластичную SAN:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azuresan-csi
    provisioner: san.csi.azure.com
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    parameters:
      san: <san-name> # replace with the name of your precreated Elastic SAN
    

Создайте класс хранилища для заранее подготовленного Elastic SAN и группы томов.

  1. Создайте эластичную SAN в управляемой группе ресурсов, выполнив действия, описанные в разделе "Создание класса хранилища для предварительно подготовленной эластичной SAN".

  2. Создайте группу томов.

  3. Получение сведений о виртуальной сети.

    az network vnet list -g <node-resource-group> --query [].name -o tsv
    
  4. Получение сведений о подсети.

    az network vnet subnet list -g <node-resource-group> --vnet-name <vnet-name> --query [].name -o tsv
    
  5. Обновите конечную точку службы.

    az network vnet subnet update -g <node-resource-group> --vnet-name <vnet-name> --name <subnet-name> --service-endpoints "Microsoft.Storage"
    

    Это важно

    Если кластер AKS использует несколько пулов узлов в разных подсетях, необходимо включить идентификаторы всех подсетей пулов узлов в сетевые ACL группы томов Elastic SAN. Группы томов Elastic SAN разрешают доступ только из подсетей виртуальной сети, явно авторизованных в правилах группы томов, и запросы из других подсетей по умолчанию блокируются.

  6. Создайте группу томов.

    az elastic-san volume-group create --resource-group <node-resource-group> --elastic-san-name <san-name> --name <volume-group-name> --network-acls '{"virtual-network-rules":[{"id":"<subnet-id>","action":"Allow"}]}'
    
  7. Создайте класс хранилища, ссылающийся на Elastic SAN и группу томов:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azuresan-csi
    provisioner: san.csi.azure.com
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    parameters:
      san: <san-name> # replace with the name of your precreated Elastic SAN
      volumegroup: <volume-group-name> # replace with the name of your precreated volume group
    

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

Примените манифест:

kubectl apply -f storageclass.yaml

Убедитесь, что класс хранилища создан:

kubectl get storageclass azuresan-csi

Должен отобразиться примерно такой результат:

NAME           PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
azuresan-csi   san.csi.azure.com    Delete          Immediate           true                   10s

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

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

  1. Создайте файл манифеста YAML, например acstor-pvc.yaml.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: managedpvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: azuresan-csi
    
  2. Примените манифест для создания PVC.

    kubectl apply -f acstor-pvc.yaml
    

    Должен отобразиться примерно такой результат:

    persistentvolumeclaim/managedpvc created
    

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

kubectl describe pvc managedpvc

При создании PVC, он готов к использованию подом.

Развертывание модуля pod и подключение постоянного тома

Создайте pod, используя программу Flexible I/O Tester (fio) для тестирования и моделирования рабочей нагрузки, и укажите путь монтирования для постоянного тома. Для claimName используйте имя, которое вы использовали при создании ПВХ.

  1. Создайте файл манифеста YAML, например acstor-pod.yaml.

    apiVersion: v1
    kind: Pod
    metadata:
      name: fiopod
    spec:
      containers:
        - name: fio
          image: mayadata/fio
          args: ["sleep", "1000000"]
          volumeMounts:
            - mountPath: "/volume"
              name: iscsi-volume
      volumes:
        - name: iscsi-volume
          persistentVolumeClaim:
            claimName: managedpvc
    
  2. Примените манифест для развертывания модуля pod.

    kubectl apply -f acstor-pod.yaml
    

    Должен отобразиться результат, как в примере ниже:

    pod/fiopod created
    
  3. Убедитесь, что модуль pod запущен, и ПВХ привязан:

    kubectl describe pod fiopod
    kubectl describe pvc managedpvc
    
  4. Проверьте тестирование fio, чтобы просмотреть текущее состояние:

    kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
    

Теперь у вас есть pod, использующий Elastic SAN в качестве хранилища.

Статическое выделение тома Elastic SAN

Вы можете предварительно создать том в эластичной сети SAN и обнажить его в Kubernetes как статическую ПС. Воспользуйтесь шагами из раздела «Создание класса хранилища для предварительно подготовленной Elastic SAN и группы томов», чтобы создать Elastic SAN и группу томов. Эти действия также можно выполнить на портале Azure с помощью панели службы Elastic SAN.

Создание класса хранилища Elastic SAN по умолчанию

Используйте следующий манифест YAML для создания класса хранилища Elastic SAN по умолчанию:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azuresan-csi
provisioner: san.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

Примените манифест для создания класса хранилища:

kubectl apply -f storageclass.yaml

Проверьте класс хранилища:

kubectl get storageclass azuresan-csi

Создание тома Elastic SAN

az elastic-san volume create -g <node-resource-group> -e <san-name> -v <volume-group-name> -n <volume-name> --size-gib 5

Обратите внимание на идентификатор Azure Resource Manager (ARM) тома Elastic SAN. Используйте его для volumeHandle значения в yamL постоянного тома.

Получите квалифицированное имя iSCSI (IQN) и targetPortal значения для тома Elastic SAN:

az elastic-san volume show --name <volume-name> --resource-group <rg-name> --elastic-san-name <san-name>

Создайте постоянный том

Создайте файл манифеста YAML, например pv_static.yaml.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-san
  annotations:
    pv.kubernetes.io/provisioned-by: san.csi.azure.com
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: azuresan-csi
  csi:
    driver: san.csi.azure.com
    volumeHandle: #{rg}#{san}#{vg}#{vol}
    volumeAttributes:
      # iqn: "<retrieved from pre-provisioned volume>"
      # targetPortal: "<retrieved from pre-provisioned volume>"
      numsessions: "8"

Примените манифест для создания персистентного тома.

kubectl apply -f pv_static.yaml

Создайте статический запрос постоянного тома

Создайте файл манифеста YAML, например pvc_static.yaml.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-san
spec:
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  volumeName: pv-san
  storageClassName: azuresan-csi

Примените манифест для создания PVC.

kubectl apply -f pvc_static.yaml

Создание модуля pod, использующего статический том

Создайте файл манифеста YAML, например pod.yaml.

apiVersion: v1
kind: Pod
metadata:
  name: pod-san-static
spec:
  nodeSelector:
    kubernetes.io/os: linux
  containers:
    - image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
      name: nginx
      ports:
        - containerPort: 80
          protocol: TCP
      volumeMounts:
        - mountPath: /var/www
          name: iscsi-volume
  volumes:
    - name: iscsi-volume
      persistentVolumeClaim:
        claimName: pvc-san

Примените манифест для создания модуля pod.

kubectl apply -f pod.yaml

См. также