Использование хранилища контейнеров Azure с локальной репликацией NVMe и томов
Хранилище контейнеров Azure — это облачная служба управления томами, развертывания и оркестрации, созданная изначально для контейнеров. В этой статье показано, как настроить хранилище контейнеров Azure для использования временных дисков с локальной репликацией NVMe и томом в качестве серверного хранилища для рабочих нагрузок Kubernetes. В конце концов у вас будет модуль pod, использующий локальный NVMe в качестве хранилища. Репликация копирует данные между томами на разных узлах и восстанавливает том при потере реплики, обеспечивая устойчивость для эфемерного диска.
Что такое временный диск?
Если приложению требуется задержка вложенного хранилища, можно использовать временный диск с хранилищем контейнеров Azure для удовлетворения ваших требований к производительности. Эфемерный означает, что диски развертываются на локальной виртуальной машине, где размещен кластер AKS, и не сохраняются в службе хранилища Azure. Данные будут потеряны на этих дисках при остановке или освобождении виртуальной машины.
Существует два типа эфемерного диска: локальный NVMe и временный SSD. NVMe предназначен для высокоскоростной передачи данных между хранилищем и ЦП. Выберите NVMe, если приложению требуется больше операций ввода-вывода в секунду или пропускная способность, чем временный SSD, или требуется больше места в хранилище. Помните, что хранилище контейнеров Azure поддерживает только синхронную репликацию данных для локального NVMe.
Благодаря эфемерной природе этих дисков хранилище контейнеров Azure поддерживает использование универсальных временных томов по умолчанию при использовании временных дисков. Однако некоторые варианты использования могут вызывать постоянные тома , даже если данные не устойчивы. Например, если вы хотите использовать существующие файлы YAML или шаблоны развертывания, которые жестко закодируются для использования постоянных томов, а рабочая нагрузка поддерживает репликацию на уровне приложения для устойчивости. В таких случаях можно обновить установку хранилища контейнеров Azure и добавить заметку acstor.azure.com/accept-ephemeral-storage=true
в определение утверждения постоянного тома для поддержки создания постоянных томов из временных пулов носителей дисков.
Необходимые компоненты
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Для этой статьи требуется последняя версия (2.35.0 или более поздняя) Azure CLI. Узнайте , как установить Azure CLI. Если вы используете среду Bash в Azure Cloud Shell, то последняя версия уже установлена. Если вы планируете выполнять команды локально, а не в Azure Cloud Shell, обязательно запустите их с правами администратора. Дополнительные сведения см. в статье "Начало работы с Azure Cloud Shell".
Вам потребуется клиент командной строки Kubernetes.
kubectl
Он уже установлен, если вы используете Azure Cloud Shell или вы можете установить его локально, выполнивaz aks install-cli
команду.Если вы еще не установили хранилище контейнеров Azure, следуйте инструкциям в статье "Использование хранилища контейнеров Azure с Служба Azure Kubernetes".
Проверьте, поддерживается ли целевой регион в регионах хранилища контейнеров Azure.
Выбор типа виртуальной машины, поддерживающей локальный NVMe
Локальный диск NVMe доступен только в определенных типах виртуальных машин, например SKU оптимизированных для хранения виртуальных машин или SKU ускорения GPU. Если вы планируете использовать локальный NVMe, выберите один из этих номеров SKU виртуальных машин.
Выполните следующую команду, чтобы получить тип виртуальной машины, используемый с пулом узлов. Замените <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
Рекомендуется использовать не менее четырех виртуальных ЦП, а каждый пул узлов имеет по крайней мере три узла.
Создание и присоединение универсальных временных томов
Выполните следующие действия, чтобы создать и присоединить универсальный эфемерный том.
1. Создание пула носителей с репликацией томов
Сначала создайте пул носителей, который является логическим группированием хранилища для кластера Kubernetes, определив его в файле манифеста YAML.
Если вы включили хранилище контейнеров Azure с помощью az aks create
или az aks update
командами, возможно, у вас уже есть пул носителей. Используется kubectl get sp -n acstor
для получения списка пулов носителей. Если у вас уже есть пул носителей, который вы хотите использовать, можно пропустить этот раздел и перейти к отображению доступных классов хранилища.
Выполните следующие действия, чтобы создать пул носителей с помощью локальной NVMe с репликацией. В настоящее время служба хранилища контейнеров Azure поддерживает конфигурации с тремя репликами и пятью репликами. Если указать три реплики, в кластере AKS должно быть не менее трех узлов. Если указать пять реплик, необходимо иметь по крайней мере пять узлов.
Примечание.
Так как пулы носителей временных дисков используют все доступные диски NVMe, необходимо удалить все существующие локальные пулы носителей NVMe перед созданием нового пула носителей.
Используйте избранный текстовый редактор для создания файла манифеста YAML,
code acstor-storagepool.yaml
например.Вставьте следующий код и сохраните файл. Значение имени пула носителей может быть любым нужным.
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme replicas: 3
Примените файл манифеста YAML для создания пула носителей.
kubectl apply -f acstor-storagepool.yaml
После завершения создания пула носителей вы увидите следующее сообщение:
storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
Эту команду можно также запустить, чтобы проверить состояние пула носителей. Замените
<storage-pool-name>
значением имени пула носителей. В этом примере значение будет эфемерным, nvme.kubectl describe sp <storage-pool-name> -n acstor
При создании пула носителей хранилище контейнеров Azure создаст класс хранилища от вашего имени с помощью соглашения acstor-<storage-pool-name>
об именовании.
2. Отображение доступных классов хранилища
Когда пул носителей готов к использованию, необходимо выбрать класс хранилища, чтобы определить, как хранилище динамически создается при создании и развертывании томов.
Запустите kubectl get sc
, чтобы отобразить доступные классы хранилища. Вы увидите класс хранилища с именем acstor-<storage-pool-name>
.
$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal disk.csi.azure.com Retain WaitForFirstConsumer true 65m
acstor-ephemeraldisk-nvme containerstorage.csi.azure.com Delete WaitForFirstConsumer true 2m27s
Внимание
Не используйте класс хранилища, помеченный внутренним. Это внутренний класс хранилища, необходимый для работы хранилища контейнеров Azure.
3. Развертывание модуля pod с универсальным временным томом
Создайте модуль pod с помощью Fio (гибкий модуль ввода-вывода Tester) для тестирования и моделирования рабочих нагрузок, использующего универсальный временный том.
Используйте избранный текстовый редактор для создания файла манифеста YAML,
code acstor-pod.yaml
например.Вставьте следующий код и сохраните файл.
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: acstor.azure.com/io-engine: acstor containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: ephemeralvolume volumes: - name: ephemeralvolume ephemeral: volumeClaimTemplate: metadata: labels: type: my-ephemeral-volume spec: accessModes: [ "ReadWriteOnce" ] storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different resources: requests: storage: 1Gi
При изменении размера хранилища томов убедитесь, что размер меньше доступной емкости временного диска одного узла. См. раздел "Проверка емкости диска узла с эфемерным".
Примените файл манифеста YAML для развертывания модуля pod.
kubectl apply -f acstor-pod.yaml
Вы должны увидеть результат, аналогичный приведенному ниже:
pod/fiopod created
Убедитесь, что модуль pod запущен и что утверждение эфемерного тома успешно привязано к pod:
kubectl describe pod fiopod kubectl describe pvc fiopod-ephemeralvolume
Проверьте тестирование 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, использующий локальный NVMe с репликацией томов, и его можно использовать для рабочих нагрузок Kubernetes.
Создание и присоединение постоянных томов
Чтобы создать постоянный том из эфемерного пула носителей дисков, необходимо включить заметку в утверждения постоянного тома (PVCs) в качестве защиты, чтобы гарантировать, что вы планируете использовать постоянные тома, даже если данные являются временными. Кроме того, перед созданием утверждений постоянного тома необходимо включить --ephemeral-disk-volume-type
флаг со PersistentVolumeWithAnnotation
значением в кластере.
Выполните следующие действия, чтобы создать и подключить постоянный том.
1. Обновление установки хранилища контейнеров Azure
Выполните следующую команду, чтобы обновить установку хранилища контейнеров Azure, чтобы разрешить создание постоянных томов из временных пулов носителей дисков.
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage ephemeralDisk --storage-pool-option NVMe --ephemeral-disk-volume-type PersistentVolumeWithAnnotation
2. Создание пула носителей с репликацией томов
Выполните следующие действия, чтобы создать пул носителей с помощью локальной NVMe с репликацией. В настоящее время служба хранилища контейнеров Azure поддерживает конфигурации с тремя репликами и пятью репликами. Если указать три реплики, в кластере AKS должно быть не менее трех узлов. Если указать пять реплик, необходимо иметь по крайней мере пять узлов.
Примечание.
Так как пулы носителей временных дисков используют все доступные диски NVMe, необходимо удалить все существующие локальные пулы носителей NVMe перед созданием нового пула носителей.
Используйте избранный текстовый редактор для создания файла манифеста YAML,
code acstor-storagepool.yaml
например.Вставьте следующий код и сохраните файл. Значение имени пула носителей может быть любым нужным. Задайте для реплик значение 3 или 5.
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme replicas: 3
Примените файл манифеста YAML для создания пула носителей.
kubectl apply -f acstor-storagepool.yaml
После завершения создания пула носителей вы увидите следующее сообщение:
storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
Эту команду можно также запустить, чтобы проверить состояние пула носителей. Замените
<storage-pool-name>
значением имени пула носителей. В этом примере значение будет эфемерным, nvme.kubectl describe sp <storage-pool-name> -n acstor
При создании пула носителей хранилище контейнеров Azure создаст класс хранилища от вашего имени с помощью соглашения acstor-<storage-pool-name>
об именовании.
3. Отображение доступных классов хранилища
Когда пул носителей готов к использованию, необходимо выбрать класс хранилища, чтобы определить, как хранилище динамически создается при создании и развертывании томов.
Запустите kubectl get sc
, чтобы отобразить доступные классы хранилища. Вы увидите класс хранилища с именем acstor-<storage-pool-name>
.
$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal disk.csi.azure.com Retain WaitForFirstConsumer true 65m
acstor-ephemeraldisk-nvme containerstorage.csi.azure.com Delete WaitForFirstConsumer true 2m27s
Внимание
Не используйте класс хранилища, помеченный внутренним. Это внутренний класс хранилища, необходимый для работы хранилища контейнеров Azure.
4. Создание утверждения постоянного тома
Утверждение постоянного тома (PVC) используется для автоматической подготовки хранилища на основе класса хранения. Выполните следующие действия, чтобы создать ПВХ с помощью нового класса хранения.
Используйте избранный текстовый редактор для создания файла манифеста YAML,
code acstor-pvc.yaml
например.Вставьте следующий код и сохраните файл. Значение ПВХ
name
может быть любым, что вы хотите.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ephemeralpvc annotations: acstor.azure.com/accept-ephemeral-storage: "true" spec: accessModes: - ReadWriteOnce storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different resources: requests: storage: 100Gi
При изменении размера хранилища томов убедитесь, что размер меньше доступной емкости временного диска одного узла. См. раздел "Проверка емкости диска узла с эфемерным".
Примените файл манифеста YAML для создания ПВХ.
kubectl apply -f acstor-pvc.yaml
Должен отобразиться примерно такой результат:
persistentvolumeclaim/ephemeralpvc created
Вы можете проверить состояние ПВХ, выполнив следующую команду:
kubectl describe pvc ephemeralpvc
После создания ПВХ он готов к использованию pod.
5. Развертывание модуля pod и подключение постоянного тома
Создайте модуль pod с помощью Fio (гибкий средство тестирования ввода-вывода) для тестирования и моделирования рабочих нагрузок и укажите путь подключения для постоянного тома. Для имени утверждения используйте значение имени , используемое при создании утверждения постоянного тома.
Используйте избранный текстовый редактор для создания файла манифеста YAML,
code acstor-pod.yaml
например.Вставьте следующий код и сохраните файл.
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: acstor.azure.com/io-engine: acstor volumes: - name: ephemeralpv persistentVolumeClaim: claimName: ephemeralpvc containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: ephemeralpv
Примените файл манифеста YAML для развертывания модуля pod.
kubectl apply -f acstor-pod.yaml
Вы должны увидеть результат, аналогичный приведенному ниже:
pod/fiopod created
Убедитесь, что модуль pod запущен и что утверждение постоянного тома успешно привязано к pod:
kubectl describe pod fiopod kubectl describe pvc ephemeralpvc
Проверьте тестирование 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, использующий локальный NVMe с репликацией томов, и его можно использовать для рабочих нагрузок Kubernetes.
Управление томами и пулами носителей
В этом разделе вы узнаете, как проверить доступную емкость временных дисков, как отсоединить и повторно подключить постоянный том, как развернуть или удалить пул носителей и как оптимизировать производительность.
Проверка емкости временного диска узла
Временный том выделяется на одном узле. При настройке размера временных томов размер должен быть меньше доступной емкости эфемерного диска одного узла.
Выполните следующую команду, чтобы проверить доступную емкость эфемерного диска для одного узла.
$ kubectl get diskpool -n acstor
NAME CAPACITY AVAILABLE USED RESERVED READY AGE
ephemeraldisk-nvme-diskpool-jaxwb 75660001280 75031990272 628011008 560902144 True 21h
ephemeraldisk-nvme-diskpool-wzixx 75660001280 75031990272 628011008 560902144 True 21h
ephemeraldisk-nvme-diskpool-xbtlj 75660001280 75031990272 628011008 560902144 True 21h
В этом примере доступная емкость эфемерного диска для одного узла составляет 75031990272
байт или 69 ГиБ.
Отключение и повторное подключение постоянного тома
Чтобы отключить постоянный том, удалите модуль pod, к которому подключен постоянный том.
kubectl delete pods <pod-name>
Чтобы повторно подключить постоянный том, просто укажите имя утверждения постоянного тома в файле манифеста YAML, как описано в разделе "Развертывание модуля pod" и подключение постоянного тома.
Чтобы проверить, к каким постоянным томам привязано утверждение постоянного тома, выполните следующую команду:
kubectl get pvc <persistent-volume-claim-name>
Развертывание пула носителей
Вы можете расширить пулы носителей, поддерживаемые локальным NVMe, чтобы быстро масштабироваться и без простоя. Сжатие пулов носителей в настоящее время не поддерживается.
Так как пул носителей, поддерживаемый временным диском, использует локальные ресурсы хранилища на узлах кластера AKS (виртуальных машинах), расширение пула носителей требует добавления другого узла в кластер. Следуйте этим инструкциям, чтобы развернуть пул носителей.
Выполните следующую команду, чтобы добавить узел в кластер AKS. Замените
<cluster-name>
,<nodepool name>
и<resource-group-name>
собственными значениями. Чтобы получить имя пула узлов, выполните командуkubectl get nodes
.az aks nodepool add --cluster-name <cluster name> --name <nodepool name> --resource-group <resource group> --node-vm-size Standard_L8s_v3 --node-count 1 --labels acstor.azure.com/io-engine=acstor
Запустите
kubectl get nodes
и увидите, что узел был добавлен в кластер.Запустите
kubectl get sp -A
и убедитесь, что емкость пула носителей увеличилась.
Удаление пула носителей
Если вы хотите удалить пул носителей, выполните следующую команду. Замените <storage-pool-name>
именем пула носителей.
kubectl delete sp -n acstor <storage-pool-name>
Оптимизация производительности при использовании локального NVMe
В зависимости от требований к производительности рабочей нагрузки можно выбрать три различных уровня производительности: "Базовый", "Стандартный" и "Премиум". Эти уровни предлагают другой диапазон операций ввода-вывода в секунду, и выбор будет влиять на количество виртуальных ЦП, которые компоненты хранилища контейнеров Azure используют в узлах, где он установлен. Стандартная конфигурация по умолчанию, если вы не обновляете уровень производительности.
Репликация в одной зоне
Уровень | Количество виртуальных ЦП. | 100 % операций ввода-вывода в секунду | 100 % операций ввода-вывода в секунду |
---|---|---|---|
Basic |
12,5% от общего числа ядер виртуальных машин | До 120 000 | До 45 000 |
Standard (по умолчанию) |
25 % общих ядер виртуальных машин | До 220 000 | До 90 000 |
Premium |
50% общих ядер виртуальных машин | До 550 000 | До 180 000 |
Репликация с несколькими зонами
Уровень | Количество виртуальных ЦП. | 100 % операций ввода-вывода в секунду | 100 % операций ввода-вывода в секунду |
---|---|---|---|
Basic |
12,5% от общего числа ядер виртуальных машин | До 120 000 | До 45 000 |
Standard (по умолчанию) |
25 % общих ядер виртуальных машин | До 220 000 | До 90 000 |
Premium |
50% общих ядер виртуальных машин | До 550 000 | До 180 000 |
Примечание.
Потребление ОЗУ и огромных страниц будет оставаться согласованным на всех уровнях: 1 ГиБ ОЗУ и 2 ГиБ огромных страниц.
После определения уровня производительности, который соответствует вашим потребностям, можно выполнить следующую команду, чтобы обновить уровень производительности установки хранилища контейнеров Azure. Замените <performance tier>
базовым, стандартным или премиумом.
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type> --ephemeral-disk-nvme-perf-tier <performance-tier>