Konfigurace zón dostupnosti ve službě Azure Kubernetes Service (AKS)

Zóny dostupnosti pomáhají chránit aplikace a data před selháními datacentra. Zóny jsou jedinečná fyzická umístění v rámci oblasti Azure. Každá zóna zahrnuje jedno nebo více datacenter vybavených nezávislým napájením, chlazením a sítěmi.

Použití služby Azure Kubernetes Service (AKS) se zónami dostupnosti fyzicky distribuuje prostředky mezi různé zóny dostupnosti v rámci jedné oblasti, což zlepšuje spolehlivost. Nasazení uzlů ve více zónách neúčtuje žádné další náklady. V tomto článku se dozvíte, jak nakonfigurovat prostředky AKS tak, aby používaly zóny dostupnosti pomocí Azure CLI nebo Terraformu.

Předpoklady

  • Aktivní předplatné Azure. Pokud nemáte předplatné Azure, vytvořte si bezplatný účet před zahájením.

  • Nastavte kontext předplatného az account set pomocí příkazu. Například:

    az account set --subscription "00000000-0000-0000-0000-000000000000"
    
  • Nainstalované a nakonfigurované Rozhraní příkazového řádku Azure. Pokyny k instalaci najdete v tématu Instalace Azure CLI.

  • kubectl nainstalován. Můžete jej lokálně nainstalovat pomocí příkazu az aks install-cli.

Omezení a úvahy

Při používání zón dostupnosti v AKS mějte na paměti následující omezení a důležité informace:

  • Projděte si kvóty, omezení velikosti virtuálních počítačů a dostupnost oblastí v AKS.

  • Většina oblastí Azure podporuje zóny dostupnosti. Další informace najdete v seznamu oblastí Azure.

  • AKS nepřijímá všechny SKU virtuálních počítačů při vytváření fondů uzlů v určené lokalitě. Vytvoření fondu uzlů selže, pokud vybrané SKU virtuálního počítače nepodporuje požadované zóny dostupnosti v daném regionu. Zkontrolujte dostupnost pomocí az aks list-vm-skus.

    az aks list-vm-skus \
      --location eastus \
      --size Standard_D8ps_v5 \
      --all \
      --output table
    
  • Po vytvoření fondu uzlů nemůžete změnit počet zón dostupnosti. Pokud chcete změnit počet zón dostupnosti, musíte vytvořit nový fond uzlů s požadovaným počtem zón a migrovat úlohy do nového fondu uzlů.

Komponenty clusteru AKS

Následující diagram znázorňuje různé komponenty clusteru AKS, včetně komponent AKS hostovaných microsoftem a komponentami AKS ve vašem předplatném Azure:

Diagram znázorňující různé komponenty AKS, včetně komponent AKS hostovaných komponentami Microsoftu a AKS ve vašem předplatném Azure

Řídicí rovina AKS

Microsoft provozuje řídicí rovinu AKS, server API Kubernetes a další služby, jako je scheduler, jako spravované služby, a etcd služby. Microsoft replikuje řídicí rovinu ve více zónách.

Další prostředky clusteru se nasazují ve spravované skupině prostředků ve vašem předplatném Azure. Ve výchozím nastavení má tato skupina prostředků předponu MC_ (pro spravovaný cluster) a obsahuje prostředky popsané v následujících částech.

Skupiny uzlů

Fondy uzlů se vytvářejí jako škálovací sady virtuálních počítačů ve vašem předplatném Azure.

Když vytváříte cluster AKS, je potřeba jeden fond systémových uzlů. Tento fond uzlů se vytvoří automaticky a hostuje důležité systémové pody, jako například CoreDNS a metrics-server. Do clusteru AKS můžete přidat další fondy uzlů uživatelů pro hostování aplikací.

Fondy uzlů můžete nasadit třemi způsoby: rozpětí zón, zarovnané v zóně nebo regionální (bez použití zón dostupnosti).

Tip

Místo ručního výběru zón můžete nechat AKS vybrat je za vás pomocí automatického umístění zóny (--zones auto) při vytváření fondu uzlů nebo aktualizace existujícího fondu uzlů. Podrobnosti najdete v tématu Automatické umístění zóny pro fondy uzlů v AKS (Preview).

Následující diagram znázorňuje distribuci uzlů napříč zónami dostupnosti v každém ze tří modelů:

Diagram znázorňující distribuci uzlů AKS napříč zónami dostupnosti v různých modelech

Zóny fondu systémových uzlů se konfigurují při vytváření clusteru nebo fondu uzlů.

Fondy uzlů pokrývající zóny

Ve fondech uzlů zahrnujících zónu jsou uzly rozložené napříč všemi vybranými zónami. AKS automaticky vyrovnává počet uzlů mezi zónami. Pokud dojde k výpadku zóny, můžou být ovlivněné uzly v ovlivněné zóně, ale uzly v jiných zónách dostupnosti zůstanou nedotčené.

Fondy uzlů zarovnané podle zóny

Poznámka:

Pokud je jedna úloha nasazená napříč fondy uzlů, doporučujeme nastavit --balance-similar-node-groups na true tak, aby byla zachována vyvážená distribuce uzlů napříč zónami pro vaše úlohy během operací rozšiřování kapacity.

V této konfiguraci se každý uzel zarovná (připne) ke konkrétní zóně. Tuto konfiguraci můžete použít v případě, že potřebujete nižší latenci mezi uzly, podrobnější kontrolu nad operacemi škálování nebo při použití automatického škálování clusteru.

Regionální fondy uzlů

Místní režim se používá, když v šabloně nasazení nenastavíte přiřazení zóny (například"zones"=[])."zones"=null

V této konfiguraci fond uzlů vytvoří regionální (ne připnuté k zóně) instance a implicitně je rozloží po celém regionu. Neexistuje žádná záruka, že instance jsou vyvážené nebo rozložené mezi zóny nebo že instance jsou ve stejné zóně dostupnosti. Ve výjimečných případech výpadku zóny může dojít k ovlivnění jakékoli nebo všech instancí ve fondu uzlů.

Nasazení

Azure Kubernetes Service (AKS) používá pody, úložiště a svazky a nástroje pro vyrovnávání zatížení napříč zónami, aby se zachovala vysoká dostupnost vašich aplikací.

Kapsle

Kubernetes si uvědomuje zóny dostupnosti Azure a dokáže vyrovnávat pody (kontejnery) napříč uzly v různých zónách. V případě, že zóna přestane být dostupná, Kubernetes automaticky přesune pody mimo ovlivněné uzly.

Jak je uvedeno v referencích Kubernetes Well-Known Labels, Annotations, and Taints, Kubernetes používá tento topology.kubernetes.io/zone popisek k automatickému rozložení podů v kontroleru replikace nebo službě, které jsou dostupné v různých zónách.

Parametr maxSkew popisuje stupeň nerovnoměrného rozdělení podů. Za předpokladu, že jsou tři zóny a tři repliky, nastavením této hodnoty 1 zajistíte, že každá zóna má spuštěný aspoň jeden pod. Například:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: my-app
      containers:
      - name: my-container
        image: my-image

Úložiště a svazky

Kubernetes verze 1.29 a novější ve výchozím nastavení používají spravované disky Azure pomocí zónově redundantního úložiště pro deklarace trvalých svazků (PVCS). Tyto disky se replikují mezi zónami, aby se zvýšila odolnost vašich aplikací.

Následující příklad ukazuje PVC, které používá Azure Standard SSD v zonově redundantním úložišti:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: azure-managed-disk
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: managed-csi
  #storageClassName: managed-csi-premium
  resources:
    requests:
      storage: 5Gi

Pro nasazení v souladu se zónou můžete vytvořit novou třídu úložiště s parametrem skuname nastaveným na LRS (místně redundantní úložiště). Pak můžete použít novou třídu úložiště ve vašem PVC.

I když jsou místně redundantní disky úložiště levnější, nejsou zónově redundantní a připojení disku k uzlu v jiné zóně se nepodporuje.

Následující příklad ukazuje místně redundantní třídu úložiště SSD úrovně Standard:

kind: StorageClass
metadata:
  name: azuredisk-csi-standard-lrs
provisioner: disk.csi.azure.com
parameters:
  skuname: StandardSSD_LRS
  #skuname: PremiumV2_LRS

Vyrovnávače zatížení

Důležité

Od 30. září 2025 už Azure Kubernetes Service (AKS) nepodporuje Load Balancer úrovně Basic. Pokud se chcete vyhnout potenciálním přerušením služeb, doporučujeme použít Load Balancer úrovně Standard pro nová nasazení a upgradovat všechna existující nasazení na Load Balancer úrovně Standard. Další informace o tomto vyřazení najdete v problému vyřazení na GitHubu a oznámení o vyřazení z Azure Updates. Pokud chcete mít přehled o oznámeních a aktualizacích, postupujte podle poznámek k verzi AKS.

Kubernetes ve výchozím nastavení nasazuje Azure Standard Load Balancer, který vyrovnává příchozí provoz napříč všemi zónami v oblasti. Pokud uzel přestane být dostupný, nástroj pro vyrovnávání zatížení směruje provoz na uzly, které jsou v pořádku.

Následující příklad ukazuje službu, která používá Azure Load Balancer:

apiVersion: v1
kind: Service
metadata:
  name: example
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080

Vytvoření fondů uzlů pomocí Azure CLI

Pomocí Azure CLI můžete vytvořit cluster AKS, fondy uzlů překlenující zóny s dostupnostními zónami a zónově sladěné fondy uzlů s dostupnostními zónami.

Vytvoření fondů uzlů pokrývajících více zón

Zóny můžete zadat pomocí parametru --zones při vytváření clusteru AKS pomocí az aks create příkazu nebo fondu az aks nodepool add uzlů. Například:

# Create an AKS cluster with a zone-spanning system node pool in all three availability zones with one node in each availability zone
az aks create \
  --resource-group example-rg \
  --name example-cluster \
  --node-count 3 \
  --zones 1 2 3

# Add one new zone-spanning user node pool with two nodes in each availability zone
az aks nodepool add \
  --resource-group example-rg \
  --cluster-name example-cluster \
  --name userpoola  \
  --node-count 6 \
  --zones 1 2 3

Vytvořte zónově vyrovnané fondy uzlů

Následující příkazy vytvoří tři fondy uzlů pro oblast se třemi zónami dostupnosti pomocí az aks nodepool add příkazu s parametrem --zones pro určení zóny pro každý fond uzlů:

# Add three new zone-aligned user node pools with two nodes in each
az aks nodepool add \
  --resource-group example-rg \
  --cluster-name example-cluster \
  --name userpoolx  \
  --node-count 2 \
  --zones 1

az aks nodepool add \
  --resource-group example-rg \
  --cluster-name example-cluster \
  --name userpooly  \
  --node-count 2 \
  --zones 2

az aks nodepool add \
  --resource-group example-rg \
  --cluster-name example-cluster \
  --name userpoolz  \
  --node-count 2 \
  --zones 3

Vytvoření konfiguračního souboru Terraformu

Konfigurační soubory Terraformu definují infrastrukturu, kterou Terraform vytváří a spravuje.

  1. Vytvořte soubor s názvem main.tf a přidejte následující kód, který definuje verzi Terraformu a určí zprostředkovatele Azure:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. Přidáním následujícího kódu main.tf vytvořte skupinu prostředků Azure. Neváhejte dle potřeby změnit název a umístění skupiny prostředků.

    resource "azurerm_resource_group" "example" {
     name     = "aks-rg"
     location = "East US"
    }
    

Vytvořte cluster AKS s fondem systémových uzlů přesahujícím zóny

Přidáním následujícího kódu main.tf vytvořte cluster AKS s fondem systémových uzlů ve všech třech zónách dostupnosti s jedním uzlem v každé zóně dostupnosti:

resource "azurerm_kubernetes_cluster" "example" {
  name                = "aks-zones"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = "akszones"
  default_node_pool {
    name       = "system"
    node_count = 1
    vm_size    = "Standard_DS2_v2"
    zones      = ["1", "2", "3"]
  }
  identity {
    type = "SystemAssigned"
  }
}

Přidání fondů uzlů uživatele, které pokrývají zóny, do clusteru AKS

Přidáním následujícího kódu main.tf vytvořte nový fond uzlů uživatele se dvěma uzly v každé zóně dostupnosti:

resource "azurerm_kubernetes_cluster_node_pool" "zonespan" {
  name                  = "userpool"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  vm_size               = "Standard_DS2_v2"
  node_count            = 2
  zones                 = ["1", "2", "3"]
}

Přidejte k clusteru AKS fondy uživatelských uzlů zarovnané se zónou

Přidáním následujícího kódu main.tf vytvořte tři nové fondy uzlů uživatele zarovnané do zóny se dvěma uzly v každé zóně dostupnosti:

resource "azurerm_kubernetes_cluster_node_pool" "zone1" {
  name                  = "userpool1"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  vm_size               = "Standard_DS2_v2"
  node_count            = 1
  zones                 = ["1"]
}
resource "azurerm_kubernetes_cluster_node_pool" "zone2" {
  name                  = "userpool2"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  vm_size               = "Standard_DS2_v2"
  node_count            = 1
  zones                 = ["2"]
}
resource "azurerm_kubernetes_cluster_node_pool" "zone3" {
  name                  = "userpool3"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  vm_size               = "Standard_DS2_v2"
  node_count            = 1
  zones                 = ["3"]
}

Inicializujte Terraform

Inicializace Terraformu v adresáři obsahujícím váš main.tf soubor pomocí terraform init příkazu Tento příkaz stáhne poskytovatele Azure potřebného ke správě prostředků Azure pomocí Terraformu.

terraform init

Vytvoření plánu provádění Terraformu

Pomocí příkazu vytvořte plán provádění Terraformu terraform plan . Tento příkaz ukazuje prostředky, které Terraform vytvoří nebo upraví ve vašem předplatném Azure.

terraform plan

Aplikujte konfiguraci Terraformu

Po kontrole a potvrzení plánu provádění aplikujte konfiguraci Terraformu pomocí příkazu terraform apply. Tento příkaz vytvoří nebo upraví prostředky definované ve vašem main.tf souboru ve vašem předplatném Azure.

terraform apply

Ověření konfigurace zóny dostupnosti

Po vytvoření vašeho clusteru AKS a fondů uzlů můžete ověřit, že jsou vaše uzly distribuovány napříč zónami dostupnosti, použitím příkazu az aks show s parametrem --query pro filtrování výstupu. Například:

az aks show \
 --name example-cluster \
 --resource-group example-rg \
 --query agentPoolProfiles[].availabilityZones \
 --output tsv

Ověření umístění uzlů

Pomocí následujícího kubectl get nodes příkazu ověřte distribuci uzlů napříč zónami dostupnosti:

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

Příklad výstupu:

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

Seznam spuštěných podů a uzlů

Pomocí příkazu kubectl describe zkontrolujte, které pody a uzly běží. Například:

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

Další informace o spolehlivosti v AKS najdete v následujících článcích: