Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Хранилище контейнеров Azure — это облачная служба оркестрации, управления томами и развертывания, изначально созданная для контейнеров. В этой статье показано, как настроить хранилище контейнеров Azure для использования локального диска NVMe в качестве серверного хранилища для рабочих нагрузок Kubernetes. NVMe предназначен для высокоскоростной передачи данных между хранилищем и ЦП, обеспечивая высокий объем операций ввода-вывода в секунду и пропускную способность.
Внимание
Эта статья относится к хранилищу контейнеров Azure (версия 2.x.x),которая поддерживает локальный диск NVMe и Azure Elastic SAN в качестве резервных типов хранилища. Дополнительные сведения о более ранних версиях см. в документации Azure Container Storage (версии 1.x.x).
Что такое локальный NVMe?
Когда вашему приложению требуется субмиллисекундная задержка хранилища и высокая пропускная способность, вы можете использовать локальные диски NVMe с хранилищем Azure Container Storage, чтобы удовлетворить требования производительности. Эфемерный означает, что диски развертываются на локальной виртуальной машине, где размещен кластер 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, создайте бесплатную учетную запись, прежде чем приступить к работе.
Для этой статьи требуется 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 правильно установлено.
Выбор типа виртуальной машины, поддерживающей локальный 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) теперь можно использовать кластеры с менее чем тремя узлами.
В сценариях, когда размеры виртуальных машин с одним локальным диском NVMe используются вместе с временными дисками ОС, локальный диск NVMe выделяется для ОС, поэтому для использования Azure Container Storage не остается ресурсов. Чтобы обеспечить оптимальную производительность и доступность локальных дисков NVMe для высокопроизводительной обработки данных, рекомендуется выполнить следующие действия.
- Выберите размеры виртуальных машин с двумя или более локальными дисками NVMe.
- Используйте управляемые диски для ОС, освобождая все локальные диски NVMe для обработки данных.
Дополнительные сведения см. в рекомендациях по эфемерным дискам данных NVMe в службе Azure Kubernetes.
Создание класса хранилища для локального NVMe
Если у вас еще нет хранилища контейнеров Azure, установите его.
Хранилище контейнеров Azure (версия 2.x.x) представляет локальный NVMe в качестве стандартного класса хранилища Kubernetes. Создайте класс хранилища один раз для кластера и используйте его как для универсальных временных томов, так и для запросов на постоянные тома.
Используйте ваш любимый текстовый редактор для создания файла манифеста YAML, например
storageclass.yaml, затем вставьте следующую спецификацию.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-csi provisioner: localdisk.csi.acstor.io reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: trueПримените манифест для создания класса хранилища.
kubectl apply -f storageclass.yaml
Кроме того, можно создать класс хранилища с помощью Terraform.
Используйте 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" "local_csi" { metadata { name = "local-csi" } storage_provisioner = "localdisk.csi.acstor.io" reclaim_policy = "Delete" volume_binding_mode = "WaitForFirstConsumer" allow_volume_expansion = true }Инициализация, проверка и применение конфигурации для создания класса хранилища.
terraform init terraform plan terraform apply
Проверка класса хранилища
Выполните следующую команду, чтобы убедиться, что класс хранилища создан:
kubectl get storageclass local-csi
Должен отобразиться примерно такой результат:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-csi localdisk.csi.acstor.io Delete WaitForFirstConsumer true 10s
Создание и присоединение обобщённых временных томов
Выполните следующие действия, чтобы создать и подключить универсальный временный том с помощью хранилища контейнеров Azure. Перед продолжением убедитесь, что хранилище контейнеров Azure local-csi и класс хранилища существует.
Развертывание модуля pod с универсальным временным томом
Создайте модуль pod с помощью Fio (гибкий модуль тестирования ввода-вывода) для тестирования и моделирования рабочей нагрузки, использующего универсальный временный том.
Используйте избранный текстовый редактор для создания файла манифеста YAML,
code fiopod.yamlнапример.Вставьте следующий код и сохраните файл.
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-csi resources: requests: storage: 10GiПримените файл манифеста YAML для развертывания модуля pod.
kubectl apply -f fiopod.yaml
Проверка развертывания и выполнение тестов
Убедитесь, что модуль 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".
Убедитесь, что хранилище контейнеров Azure установлено , а local-csi класс хранилища, созданный ранее, доступен перед развертыванием рабочих нагрузок, использующих его.
Развернуть 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-csi
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-csi 1373172Mi aks-storagepool-31410930-vmss000001
csisc-gnmm9 local-csi 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-csi, выполните следующую команду:
kubectl delete storageclass local-csi
См. также
- Что такое хранилище контейнеров Azure?
- Установка хранилища контейнеров Azure с помощью AKS
- Использование хранилища контейнеров Azure (версия 1.x.x) с локальным NVMe
- Обзор развертывания высокодоступной базы данных PostgreSQL в Службе Azure Kubernetes (AKS)
- Рекомендации по использованию временных дисков данных NVMe в службе Azure Kubernetes (AKS)