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


Использование хранилища контейнеров Azure с локальным NVMe

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

Внимание

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

Что такое локальный NVMe?

Когда вашему приложению требуется задержка на уровне субмиллисекунд и высокая пропускная способность, вы можете использовать локальный NVMe с хранилищем контейнеров Azure для удовлетворения требований к производительности. Эфемерный означает, что диски развертываются на локальной виртуальной машине, где размещен кластер AKS, и не сохраняются в службе хранилища Azure. Данные теряются на этих дисках при остановке или освобождении виртуальной машины. Локальные диски NVMe предлагаются для выбора семейств виртуальных машин Azure, таких как оптимизированные для хранения виртуальные машины.

По умолчанию хранилище контейнеров Azure создает универсальные временные тома при использовании локальных дисков NVMe. Для вариантов использования, требующих запроса на выделение постоянного тома, можно добавить аннотацию localdisk.csi.acstor.io/accept-ephemeral-storage: "true" в шаблон запроса на выделение постоянного тома.

Чередование данных

Чтобы повысить производительность, хранилище контейнеров Azure автоматически расчерчивает данные через все доступные локальные диски NVMe на уровне каждой виртуальной машины. Полосование — это метод, при котором данные делятся на небольшие блоки и равномерно записываются на несколько дисков одновременно, что увеличивает пропускную способность и улучшает общую производительность операций ввода-вывода. Это поведение включено по умолчанию и не может быть отключено.

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

Например, серия Lsv3 масштабируется с одного диска NVMe 1,92 ТБ на Standard_L8s_v3 (около 400 000 операций ввода-вывода в секунду и 20 000 МБ/с) до 10 дисков NVMe на Standard_L80s_v3 (около 3,8 млн операций ввода-вывода в секунду и 20 000 МБ/с).

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

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

  • Для этой статьи требуется последняя версия (2.77.0 или более поздняя) Azure CLI. Узнайте , как установить Azure CLI. Не используйте Azure Cloud Shell, так как az upgrade он недоступен в Cloud Shell. Обязательно выполните команды в этой статье с правами администратора.

  • Вам нужен клиент командной строки Kubernetes. kubectl Его можно установить локально, выполнив az aks install-cli команду.

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

  • Теперь можно использовать кластеры с одним узлом, хотя конфигурации с несколькими узлами по-прежнему рекомендуется.

Выбор типа виртуальной машины, поддерживающей локальный NVMe

Локальные диски NVMe доступны только в определенных типах виртуальных машин, например виртуальных машин, оптимизированных для хранения , или виртуальных машин с ускорением GPU. Если вы планируете использовать локальную емкость NVMe, выберите один из этих размеров виртуальных машин.

Выполните следующую команду, чтобы получить тип виртуальной машины, используемый с пулом узлов. Замените <resource group> и <cluster name> собственными значениями. Вам не нужно указывать значения PoolName или VmSize, поэтому сохраните запрос, как показано здесь.

az aks nodepool list --resource-group <resource group> --cluster-name <cluster name> --query "[].{PoolName:name, VmSize:vmSize}" -o table

Ниже приведен пример выходных данных.

PoolName    VmSize
----------  ---------------
nodepool1   standard_l8s_v3

Примечание.

В хранилище контейнеров Azure (версия 2.x.x.x) теперь можно использовать кластеры с менее чем тремя узлами.

Создание и присоединение обобщённых временных томов

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

1. Создание класса хранилища

В отличие от предыдущих версий, которые требовали создания кастомизированного ресурса пула хранения, Azure Хранилище Контейнеров (версия 2.x.x) использует стандартные классы хранения Kubernetes. Это изменение упрощает процесс настройки хранилища.

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

  1. Используйте избранный текстовый редактор для создания файла манифеста YAML, code storageclass.yamlнапример.

  2. Вставьте следующий код и сохраните файл.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: local
    provisioner: localdisk.csi.acstor.io
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    
  3. Примените файл манифеста YAML для создания пула носителей.

    kubectl apply -f storageclass.yaml
    

2. Проверка класса хранилища

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

kubectl get storageclass local

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

NAME    PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local   localdisk.csi.acstor.io    Delete          WaitForFirstConsumer   true                   10s

3. Развертывание модуля pod с универсальным временным томом

Создайте модуль pod с помощью Fio (гибкий модуль тестирования ввода-вывода) для тестирования и моделирования рабочей нагрузки, использующего универсальный временный том.

  1. Используйте избранный текстовый редактор для создания файла манифеста YAML, code fiopod.yamlнапример.

  2. Вставьте следующий код и сохраните файл.

    kind: Pod
    apiVersion: v1
    metadata:
      name: fiopod
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: fio
          image: mayadata/fio
          args: ["sleep", "1000000"]
          volumeMounts:
            - mountPath: "/volume"
              name: ephemeralvolume
      volumes:
        - name: ephemeralvolume
          ephemeral:
            volumeClaimTemplate:
              spec:
                volumeMode: Filesystem
                accessModes: ["ReadWriteOnce"]
                storageClassName: local
                resources:
                  requests:
                    storage: 10Gi
    
  3. Примените файл манифеста YAML для развертывания модуля pod.

    kubectl apply -f fiopod.yaml
    

4. Проверьте развертывание и запустите тесты производительности

Убедитесь, что модуль pod запущен:

kubectl get pod fiopod

Вы должны увидеть pod в состоянии 'Running'. Запустив программу, вы можете выполнить тест с использованием Fio benchmark:

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

Создайте и прикрепите постоянные тома с аннотацией эфемерного хранилища

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

Примечание.

Хранилище контейнеров Azure (версия 2.x.x) использует новую заметку localdisk.csi.acstor.io/accept-ephemeral-storage: "true" вместо предыдущей acstor.azure.com/accept-ephemeral-storage: "true".

1. Создание класса хранилища (если оно еще не создано)

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

  1. Используйте избранный текстовый редактор для создания файла манифеста YAML, code storageclass.yamlнапример.

  2. Вставьте следующий код и сохраните файл.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: local
    provisioner: localdisk.csi.acstor.io
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    
  3. Примените файл манифеста YAML для создания пула носителей.

    kubectl apply -f storageclass.yaml
    

Разверните набор StatefulSet с постоянными томами

Если необходимо использовать запросы на постоянный том, которые не привязаны к жизненному циклу Pod, следует добавить аннотацию localdisk.csi.acstor.io/accept-ephemeral-storage: "true". Данные тома являются локальными для узла и теряются, если узел удаляется или pod перемещается на другой узел.

Ниже приведен пример набора с отслеживанием состояния с использованием постоянных томов с заметкой о эфемерном хранилище:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-lcd-lvm-annotation
  labels:
    app: busybox
spec:
  podManagementPolicy: Parallel
  serviceName: statefulset-lcd
  replicas: 10
  template:
    metadata:
      labels:
        app: busybox
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: statefulset-lcd
          image: mcr.microsoft.com/azurelinux/busybox:1.36
          command:
            - "/bin/sh"
            - "-c"
            - set -euo pipefail; trap exit TERM; while true; do date -u +"%Y-%m-%dT%H:%M:%SZ" >> /mnt/lcd/outfile; sleep 1; done
          volumeMounts:
            - name: persistent-storage
              mountPath: /mnt/lcd
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: busybox
  volumeClaimTemplates:
    - metadata:
        name: persistent-storage
        annotations:
          localdisk.csi.acstor.io/accept-ephemeral-storage: "true"
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: local
        resources:
          requests:
            storage: 10Gi

Сохраните и примените этот YAML, чтобы создать StatefulSet с постоянными хранилищами.

kubectl apply -f statefulset-pvc.yaml

Управление хранилищем

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

Проверка емкости эфемерного диска узла

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

Убедитесь, что класс StorageClass для localdisk.csi.acstor.io существует. Выполните следующую команду, чтобы проверить доступную емкость эфемерного диска для каждого узла.

kubectl get csistoragecapacities.storage.k8s.io -n kube-system -o custom-columns=NAME:.metadata.name,STORAGE_CLASS:.storageClassName,CAPACITY:.capacity,NODE:.nodeTopology.matchLabels."topology\.localdisk\.csi\.acstor\.io/node"

Выходные данные должны соответствовать следующему примеру.

NAME          STORAGE_CLASS   CAPACITY    NODE
csisc-2pkx4   local           1373172Mi   aks-storagepool-31410930-vmss000001
csisc-gnmm9   local           1373172Mi   aks-storagepool-31410930-vmss000000

Если вы столкнулись с пустыми выходными результатами емкости, убедитесь, что StorageClass для localdisk.csi.acstor.io существует. Ресурс csistoragecapacities.storage.k8s.io создается только после существования класса StorageClass для localdisk.csi.acstor.io .

Расширение емкости хранилища

Так как эфемерное хранилище дисков использует локальные ресурсы на узлах кластера AKS, расширение емкости хранилища требует добавления узлов в кластер.

Чтобы добавить узел в кластер, выполните следующую команду. Замените <cluster-name>, <nodepool-name><resource-group>и <new-count> вашими значениями.

az aks nodepool scale --cluster-name <cluster-name> --name <nodepool-name> --resource-group <resource-group> --node-count <new-count>

Удаление ресурсов хранилища

Чтобы очистить ресурсы хранилища, необходимо сначала удалить все PersistentVolumeClaims и/или PersistentVolumes. Удаление хранилища контейнеров Azure StorageClass не удаляет существующие функции PersistentVolumes/PersistentVolumeClaims.

Чтобы удалить класс хранилища с именем local, выполните следующую команду:

kubectl delete storageclass local

См. также