Создание кластера Службы Azure Kubernetes (AKS), который использует зоны доступности

В этой статье показано, как создать кластер AKS и распределить компоненты узлов между зонами доступности.

Подготовка к работе

Шаблоны Azure Resource Manager и зоны доступности

При создании кластера AKS с зонами доступности с помощью шаблона Azure Resource Manager следует учитывать следующие сведения:

  • Если вы явно определяете значение NULL в шаблоне, например, "availabilityZones": nullшаблон обрабатывает свойство как если бы оно не существует. Это означает, что кластер не развертывается в зоне доступности.
  • Если свойство не включено "availabilityZones": в шаблон, кластер не развертывается в зоне доступности.
  • Невозможно обновить параметры для зон доступности в существующем кластере, так как поведение отличается при обновлении кластера AKS с помощью шаблонов Azure Resource Manager. Если вы явно задали значение NULL в шаблоне для зон доступности и обновляете кластер, он не обновляет кластер для зон доступности. Однако если опустить свойство зон доступности, используя такой синтаксис, как "availabilityZones": [], то операция развертывания попытается отключить зоны доступности в существующем кластере AKS и завершится сбоем.

Создание кластера AKS в разных зонах доступности

При создании кластера с помощью az aks create команды --zones параметр указывает зоны доступности для развертывания узлов агента в. Зоны доступности, в которые развертываются компоненты управляемого уровня управления, не контролируются этим параметром. Они автоматически распределяются по всем зонам доступности (если они присутствуют) в регионе во время развертывания кластера.

В следующих примерах команд показано, как создать группу ресурсов и кластер AKS с тремя узлами. Один узел агента в зоне 1, один в 2, а затем один в 3.

  1. Создайте группу ресурсов с помощью az group create команды.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Создайте кластер AKS с помощью az aks create команды с параметром --zones .

    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --generate-ssh-keys \
        --vm-set-type VirtualMachineScaleSets \
        --load-balancer-sku standard \
        --node-count 3 \
        --zones 1 2 3
    

    Создание кластера AKS займет несколько минут.

    При выборе зоны, к которой должен принадлежать новый узел, указанный пул узлов AKS использует оптимальное распределение зон усилий, предлагаемое базовой Масштабируемые наборы виртуальных машин Azure. Пул узлов AKS "балансируется", если каждая зона имеет одинаковое количество виртуальных машин или +- одну виртуальную машину во всех остальных зонах для масштабируемого набора.

Проверка распределения узлов между зонами

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

  1. Получите учетные данные кластера AKS с помощью az aks get-credentials команды:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. Вывод списка узлов в кластере с помощью kubectl describe команды и фильтрации по значению topology.kubernetes.io/zone .

    kubectl describe nodes | grep -e "Name:" -e "topology.kubernetes.io/zone"
    

    В следующем примере выходных данных показаны три узла, распределенные по заданному региону и зонам доступности, такие как eastus2-1 для первой зоны доступности и eastus2-2 для второй зоны доступности.

    Name:       aks-nodepool1-28993262-vmss000000
                topology.kubernetes.io/zone=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000001
                topology.kubernetes.io/zone=eastus2-2
    Name:       aks-nodepool1-28993262-vmss000002
                topology.kubernetes.io/zone=eastus2-3
    

При добавлении дополнительных узлов в пул агентов платформа Azure автоматически распределяет базовые виртуальные машины по указанным зонам доступности.

При использовании Kubernetes версии 1.17.0 и более поздних версий AKS использует topology.kubernetes.io/zone метку и устаревшую failure-domain.beta.kubernetes.io/zoneверсию. Вы можете получить тот же результат выполнения kubectl describe nodes команды в предыдущем примере с помощью следующей команды:

kubectl get nodes -o custom-columns=NAME:'{.metadata.name}',REGION:'{.metadata.labels.topology\.kubernetes\.io/region}',ZONE:'{metadata.labels.topology\.kubernetes\.io/zone}'

Следующий пример напоминает выходные данные с более подробными сведениями:

NAME                                REGION   ZONE
aks-nodepool1-34917322-vmss000000   eastus   eastus-1
aks-nodepool1-34917322-vmss000001   eastus   eastus-2
aks-nodepool1-34917322-vmss000002   eastus   eastus-3

Проверка распределения узлов между зонами

Как описано в статье Хорошо известные метки, заметки и taint, Kubernetes использует метку topology.kubernetes.io/zone для автоматического распределения модулей pod в контроллере или службе репликации в разных доступных зонах. В этом примере вы протестируете метку и масштабируйте кластер с 3 до 5 узлов, чтобы проверить правильность распространения модуля pod.

  1. Масштабирование кластера AKS с 3 до 5 узлов с помощью az aks scale команды с заданным значением --node-count5.

    az aks scale \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --node-count 5
    
  2. После завершения операции масштабирования проверьте распределение pod по зонам с помощью следующей kubectl describe команды:

    kubectl describe nodes | grep -e "Name:" -e "topology.kubernetes.io/zone"
    

    В следующем примере выходных данных показаны пять узлов, распределенных по указанному региону и зонам доступности, например eastus2-1 для первой зоны доступности и eastus2-2 для второй зоны доступности:

    Name:       aks-nodepool1-28993262-vmss000000
                topology.kubernetes.io/zone=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000001
                topology.kubernetes.io/zone=eastus2-2
    Name:       aks-nodepool1-28993262-vmss000002
                topology.kubernetes.io/zone=eastus2-3
    Name:       aks-nodepool1-28993262-vmss000003
                topology.kubernetes.io/zone=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000004
                topology.kubernetes.io/zone=eastus2-2
    
  3. Разверните приложение NGINX с тремя реплика с помощью следующих kubectl create deployment команд и kubectl scale команд:

    kubectl create deployment nginx --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
    kubectl scale deployment nginx --replicas=3
    
  4. Проверьте распределение pod по зонам с помощью следующей kubectl describe команды:

    kubectl describe pod | grep -e "^Name:" -e "^Node:"
    

    В следующем примере выходных данных показаны три модуля pod, распределенные по указанному региону и зонам доступности, например eastus2-1 для первой зоны доступности и eastus2-2 для второй зоны доступности:

    Name:         nginx-6db489d4b7-ktdwg
    Node:         aks-nodepool1-28993262-vmss000000/10.240.0.4
    Name:         nginx-6db489d4b7-v7zvj
    Node:         aks-nodepool1-28993262-vmss000002/10.240.0.6
    Name:         nginx-6db489d4b7-xz6wj
    Node:         aks-nodepool1-28993262-vmss000004/10.240.0.8
    

    Как видно из предыдущих выходных данных, первый модуль pod выполняется на узле 0, расположенном в зоне eastus2-1доступности. Второй модуль pod выполняется на узле 2, соответствующем eastus2-3, а третий — в узле 4 eastus2-2. Без дополнительной настройки Kubernetes правильно распределяет модули pod по всем трем зонам доступности.

Следующие шаги

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