Использование хранилища контейнеров 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, требуется оптимизированная для хранения виртуальная машина , например standard_l8s_v3 .
Выполните следующую команду, чтобы получить тип виртуальной машины, используемый с пулом узлов. Замените <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.
Используйте избранный текстовый редактор для создания файла манифеста YAML,
code acstor-storagepool.yaml
например.Вставьте следующий код и сохраните файл. Значение имени пула носителей может быть любым нужным.
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme
Примените файл манифеста 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. Создание пула носителей
Создайте пул носителей, который является логическим группированием хранилища для кластера Kubernetes, определив его в файле манифеста YAML.
Если вы включили хранилище контейнеров Azure с помощью az aks create
или az aks update
командами, возможно, у вас уже есть пул носителей. Используется kubectl get sp -n acstor
для получения списка пулов носителей. Если у вас уже есть пул носителей, который вы хотите использовать, можно пропустить этот раздел и перейти к отображению доступных классов хранилища.
Выполните следующие действия, чтобы создать пул носителей с помощью локального NVMe.
Используйте избранный текстовый редактор для создания файла манифеста YAML,
code acstor-storagepool.yaml
например.Вставьте следующий код и сохраните файл. Значение имени пула носителей может быть любым нужным.
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme
Примените файл манифеста 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. Создание утверждения постоянного тома
Утверждение постоянного тома используется для автоматической подготовки хранилища на основе класса хранилища. Выполните следующие действия, чтобы создать ПВХ с помощью нового класса хранения.
Используйте избранный текстовый редактор для создания файла манифеста 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 ГиБ.
Развертывание пула носителей
Вы можете расширить пулы носителей, поддерживаемые локальным 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 в узлах, где он установлен. Стандартная конфигурация по умолчанию, если вы не обновляете уровень производительности.
Эти три уровня предлагают другой диапазон операций ввода-вывода в секунду. В следующей таблице содержатся рекомендации по тому, что можно ожидать с каждым из этих уровней. Мы использовали FIO, популярное средство проверки производительности для достижения этих чисел со следующей конфигурацией:
- AKS: SKU узла — Standard_L16s_v3;
- FIO: размер блока — 4 КБ; Глубина очереди — 32; Numjobs — число ядер, назначенных компонентам хранилища контейнеров; Шаблон доступа — случайный; Размер рабочего набора — 32G
Уровень | Количество виртуальных ЦП. | 100 % считывания операций ввода-вывода в секунду | 100 % операций ввода-вывода в секунду |
---|---|---|---|
Basic |
12,5% от общего числа ядер виртуальных машин | До 120 000 | До 90 000 |
Standard (по умолчанию) |
25 % общих ядер виртуальных машин | До 220 000 | До 180 000 |
Premium |
50% общих ядер виртуальных машин | До 550 000 | До 360 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>