Použití několika nástrojů pro vyrovnávání zatížení ve službě Azure Kubernetes Service (Preview)

Azure Kubernetes Service (AKS) obvykle zřizuje jeden Standard Load Balancer (SLB) pro všechny LoadBalancer služby v clusteru. Vzhledem k tomu, že každá síťová karta uzlu je omezená na 300 pravidel vyrovnávání zatížení a 8 služeb privátních propojení, můžou velké clustery nebo úlohy náročné na porty tyto limity rychle vyčerpat.

Ukázka s více SLB odstraňuje toto úzké místo tím, že vám umožní vytvořit několik SLB ve stejném clusteru a rozdělit uzly a služby napříč nimi. Definujete konfigurace load balanceru, z nichž každá je spojena s primárním fondem agentů a volitelným jmenným prostorem, štítkem nebo selektory uzlů – a AKS automaticky umístí uzly a služby do příslušného SLB. Chování odchozího SNAT je beze změny, pokud outboundType je loadBalancer. Odchozí provoz stále prochází přes první SLB.

Pomocí této funkce můžete:

  • Škálování nad rámec 300 příchozích pravidel bez přidání clusterů
  • Izolujte provoz tenanta nebo úlohy tím, že přiřadíte dedikovaný SLB jeho vlastnímu poolu agentů.
  • Při přístupu k limitu pro jednotlivé služby SLB distribuujte služby privátního propojení napříč několika smlouvami SLA.

Požadavky

  • aks-preview rozšíření 18.0.0b1 nebo novější.
  • Příznak funkce předplatného Microsoft.ContainerService/MultipleStandardLoadBalancersPreview byl registrován.
  • Kubernetes verze 1.28 nebo novější
  • Cluster vytvořený pomocí --load-balancer-backend-pool-type nodeIP nebo aktualizovaný existující cluster pomocí az aks update.

Instalace rozšíření Azure CLI aks-Preview

Důležité

Funkce AKS ve verzi Preview jsou k dispozici na bázi samoobsluhy a dobrovolného přihlášení. Ukázky jsou poskytovány "jak jsou" a "podle aktuální dostupnosti" a jsou vyloučené ze smluv o úrovni služeb a omezené záruky. Předběžné verze AKS jsou částečně pokryty zákaznickou podporou podle možností. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:

  • Nainstalujte rozšíření aks-preview pomocí az extension add příkazu.

    az extension add --name aks-preview
    
  • Aktualizujte na nejnovější verzi rozšíření pomocí příkazu az extension update.

    az extension update --name aks-preview
    

Zaregistruj příznak funkce MultipleStandardLoadBalancersPreview

  1. Příznak funkce MultipleStandardLoadBalancersPreview zaregistrujte pomocí příkazu az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "MultipleStandardLoadBalancersPreview"
    

    Zobrazení stavu Zaregistrované trvá několik minut.

  2. Pomocí příkazu ověřte stav az feature show registrace:

    az feature show --namespace "Microsoft.ContainerService" --name "MultipleStandardLoadBalancersPreview"
    
  3. Jakmile se stav projeví jako zaregistrovaný, aktualizujte registraci poskytovatele prostředků Microsoft.ContainerService pomocí az provider register příkazu.

    az provider register --namespace Microsoft.ContainerService
    

Jak AKS zvolí nástroj pro vyrovnávání zatížení (umístění uzlu a služby)

AKS používá více vstupů k určení umístění uzlů a zveřejnění služeb LoadBalancer Services. Tyto vstupy jsou definovány v každé konfiguraci nástroje pro vyrovnávání zatížení a ovlivňují, který nástroj pro vyrovnávání zatížení je vybrán pro každý prostředek.

Typ vstupu Vztahuje se na Popis
Primární fond agentů
--primary-agent-pool-name
Nodes Povinné. Všechny uzly v tomto fondu se vždy přidají do back-endového fondu SLB. Zajišťuje, že každý SLB má alespoň jeden uzel, který je v pořádku.
Selektor uzlu
--node-selector
Nodes Volitelný. Přidá do softwarového nástroje pro vyrovnávání zatížení (SLB), kromě primárního fondu, jakýkoli uzel s odpovídajícími štítky.
Selektor oboru názvů služby
--service-namespace-selector
Služby Volitelný. Pro SLB se považují pouze služby ve jmenných prostorech s odpovídajícími štítky.
Selektor popisků služeb
--service-label-selector
Služby Volitelný. Pro tento SLB jsou způsobilé pouze služby s odpovídajícími štítky.
Poznámka ke službě
service.beta.kubernetes.io/azure-load-balancer-configurations
Služby Volitelný. Omezuje přiřazení na jednu nebo více konkrétně pojmenovaných konfigurací SLB. Bez něj je vhodná jakákoli odpovídající konfigurace.

Poznámka:

Selektory definují způsobilost. Anotace (pokud se používá) omezuje kontroler na konkrétní podmnožinu SLB.

Jak AKS používá tyto vstupy

Řídicí rovina AKS průběžně synchronizuje uzly a stav služby pomocí výše uvedených pravidel:

Umístění uzlu

Když se uzel přidá nebo aktualizuje, AKS zkontroluje, pro které sady SLA se kvalifikuje na základě primárního fondu a selektoru uzlů.

  • Pokud se shoduje více jednotek SLB, řadič vybere tu s nejmenším počtem aktuálních uzlů.
  • Uzel je přidán do fondu backendu SLB.

Umístění služby

Při vytvoření nebo aktualizaci služby LoadBalancer:

  1. AKS najde SLB, jejichž jmenný prostor a selektory štítků odpovídají službě.
  2. Pokud je přítomna anotace služby, zvažují se pouze tyto pojmenované SLB.
  3. Smlouvy SLA, které mají allowServicePlacement=false nebo které by překročily limity Azure (300 pravidel nebo 8 služeb private-link) jsou vyloučené.
  4. Mezi platnými možnostmi je zvolen Server Load Balancer s nejmenším počtem pravidel.

externalTrafficPolicy (ETP) – chování

AKS zpracovává služby odlišně v závislosti na hodnotě externalTrafficPolicy.

Režim Jak funguje výběr nástroje pro vyrovnávání zatížení Jak se sestavuje členství v backendovém poolu Poznámky
Cluster (výchozí) Kontroler se řídí standardními pravidly umístění popsanými výše. Jedno pravidlo vyrovnávání zatížení cílí na sdílený fond backendů Kubernetes ve zvoleném nástroji SLB (Server Load Balancer) pro vyrovnávání zatížení. Všechny uzly ve fondu SLB kubernetes jsou zdravé cíle. Uzly bez odpovídajících podů jsou automaticky odstraněny zdravotními kontrolami. Stejné chování jako dnes v clusterech s jedním SLB.
Místní Kontroler stále používá selektorový algoritmus k výběru SLB, ale místo použití sdíleného poolu vytvoří vyhrazený back-endový pool pro každou službu. Členství se synchronizuje z objektů služby EndpointSlice , takže se přidají jenom uzly, které skutečně hostují připravené pody. Sondy stavu se nadále používají healthCheckNodePort k vyřazení uzlů, které nejsou v pořádku. Zaručuje zachování IP adres klienta a vyhne se směrování přes uzly, které nemají pody, i když jsou uzly horizontálně dělené napříč několika smlouvami SLA.

Proč vyhrazený bazén pro ETP Local?
V režimu multi-SLB se uzly, které hostí pody pro danou službu, mohou nacházet na různých SLB, které se liší od klientsky orientované VIP. Sdílený back-endový fond by často mohl neobsahovat žádné oprávněné uzly, což naruší provoz. Přidělením fondu specifického pro službu a jeho synchronizací ze EndpointSlice zajistí AKS, že SLB služby vždy směřuje ke správným uzlům.

Dopad na kvóty

  • Každá místní služba ETP přidá do svého SLB jeden back-endový fond a jedno pravidlo rozložení zátěže.
  • Tyto hodnoty se započítávají do limitu 300 pravidel, takže sledujte využití pravidel, pokud máte mnoho místních služeb ETP.

Žádná změna odchozího provozu

Odchozí SNAT stále prochází prvním nástrojem SLB aksOutboundBackendPool , když outboundType je loadBalancer, nezávisle na nastavení protokolu ETP.

Volitelné: Vyrovnávání

Distribuci uzlů můžete později ručně znovu vyvážit pomocí az aks loadbalancer rebalance.

Tento návrh umožňuje definovat flexibilní směrování řízené nálepkami pro infrastrukturu i úlohy, zatímco AKS automaticky zpracovává umístění pro zachování rovnováhy a zabránění problémům s kvótami.

Přidání první konfigurace nástroje pro vyrovnávání zatížení

Přidejte konfiguraci s názvem kubernetes a vytvořte vazbu s primárním fondem agentů, který má vždy alespoň jeden uzel. Odebrání každé konfigurace přepne cluster zpět do režimu s jedním serverovým load balancerem (SLB).

Důležité

Pokud chcete povolit režim multiple-SLB, musíte přidat konfiguraci nástroje pro vyrovnávání zatížení s názvem kubernetes a připojit ji k primárnímu fondu agentů, který má vždy alespoň jeden připravený uzel.
Přítomnost této konfigurace přepíná podporu více SLB; ve výběru služby nemá žádnou zvláštní prioritu a považuje se za jakoukoli jinou konfiguraci nástroje pro vyrovnávání zatížení.
Pokud odstraníte každou konfiguraci vyrovnávače zatížení, cluster se automaticky vrátí do režimu s jedním SLB, což může krátce narušit směrování služeb nebo toky SNAT.

  1. Nastavte proměnné prostředí pro použití během tohoto tutoriálu. Všechny zástupné hodnoty můžete nahradit vlastními hodnotami s výjimkou DEFAULT_LB_NAME, které musí zůstat jako kubernetes.

    RESOURCE_GROUP="rg-aks-multislb"
    CLUSTER_NAME="aks-multi-slb"
    LOCATION="westus"
    DEFAULT_LB_NAME="kubernetes"
    PRIMARY_POOL="nodepool1"
    
  2. Pomocí příkazu az group create vytvořte skupinu prostředků.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Vytvořte cluster AKS pomocí az aks create příkazu.\

    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME \
      --load-balancer-backend-pool-type nodeIP \
      --node-count 3
    
  4. Přidejte výchozí vyrovnávač zatížení pomocí příkazu az aks loadbalancer add.

    az aks loadbalancer add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME \
      --name $DEFAULT_LB_NAME \
      --primary-agent-pool-name $PRIMARY_POOL \
      --allow-service-placement true
    

Přidání dalších nástrojů pro vyrovnávání zatížení

Vytvořte konfigurace specifické pro tenanta zadáním jiného primárního poolu a volitelných oborů názvů, štítků nebo selektorů uzlů.

  1. Tým 1 bude spouštět vlastní úlohy v samostatném fondu uzlů. Přiřaďte tenant=team1 popisek, aby bylo možné úlohy naplánovat pomocí selektorů:

    TEAM1_POOL="team1pool"
    TEAM1_LB_NAME="team1-lb"
    
  2. Pomocí příkazu az aks nodepool add vytvořte druhý fond uzlů pro tým 1.

    az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME \
      --name $TEAM1_POOL \
      --labels tenant=team1 \
      --node-count 2
    
  3. Pomocí příkazu vytvořte nástroj pro vyrovnávání zatížení pro tým 1 az aks loadbalancer add .

    az aks loadbalancer add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME \
      --name $TEAM1_LB_NAME \
      --primary-agent-pool-name $TEAM1_POOL \
      --service-namespace-selector "tenant=team1" \
      --node-selector "tenant=team1"
    
  4. Pomocí příkazu team1-apps označte cílový obor názvů (např. az aks command invoke) tak, aby odpovídal selektoru.

    az aks command invoke \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --command "
    kubectl create namespace team1-apps --dry-run=client -o yaml | kubectl apply -f -
    kubectl label namespace team1-apps tenant=team1 --overwrite
    "
    
  5. Pomocí příkazu teď můžete zobrazit seznam nástrojů pro vyrovnávání zatížení v clusteru az aks loadbalancer list , abyste viděli více konfigurací.

    az aks loadbalancer list --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --output table
    

    Příklad výstupu:

    AllowServicePlacement    ETag     Name        PrimaryAgentPoolName    ProvisioningState    ResourceGroup
    -----------------------  -------  ----------  ----------------------  -------------------  ---------------
    True                     <ETAG>   kubernetes  nodepool1               Succeeded            rg-aks-multislb
    True                     <ETAG>   team1-lb    team1pool               Succeeded            rg-aks-multislb
    

Nasazení služby do konkrétního nástroje pro vyrovnávání zatížení

Přidejte poznámku service.beta.kubernetes.io/azure-load-balancer-configurations se seznamem názvů konfigurací oddělených čárkami. Pokud je anotace vynechána, ovladač se vybere automaticky.

az aks command invoke \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --command "
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: lb-svc-1
  namespace: team1-apps
  labels:
    app: nginx-test
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-configurations: \"team1-lb\"
    # service.beta.kubernetes.io/azure-load-balancer-internal: "true" # If you want to create an internal load balancer. 
spec:
  selector:
    app: nginx-test
  ports:
  - name: port1
    port: 80
    targetPort: 80
    protocol: TCP
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  namespace: team1-apps
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: \"150m\"
            memory: \"300Mi\"
EOF
"

Změna rovnováhy uzlů (volitelné)

Po škálování spusťte operaci vyrovnávání, pokud se počet pravidel stane nevyváženým pomocí az aks loadbalancer rebalance příkazu. Tento příkaz naruší aktivní toky, takže ho naplánujte během časového období údržby.

az aks loadbalancer rebalance --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME

Monitorování a řešení potíží

  • Sledujte události kontroléru (kubectl get events …) a ověřte, že jsou služby synchronizovány.
  • Pokud je externí připojení zablokované, otevřete shell uzlu a spusťte příkaz curl pro virtuální IP adresu služby k ověření směrování kube-proxy.

Omezení a známé problémy

Omezení Podrobnosti
Odchozí SNAT Vždy používá první SLB; odchozí datové toky se nerozdělují.
Typ back-endových poolů Vytvořte nebo aktualizujte existující cluster pro použití nodeIP back-endových poolů.
Nuly automatického škálování Primární fond agentů se nemůže škálovat na 0 uzlů.
Růst pravidla ETP local Každá služba ETP local používá vlastní pravidlo a backendový fond, takže počet pravidel může růst rychleji než při použití módu cluster.
Rebalancování přerušení Odebrání uzlu z back-endového fondu ukončí aktivní připojení. Plánování časových období údržby
Časování opětovného načítání konfigurace Po spuštění az aks loadbalancerse změny nemusí projevit okamžitě. Operace AKS se dokončí rychle, ale cloud-controller-manager může při instalaci aktualizací trvat déle. Počkejte, až událost EnsuredLoadBalancer potvrdí, že jsou změny aktivní.

Vyčistěte zdroje

Jakmile dokončíte, odstraňte skupinu prostředků pomocí příkazu az group delete, abyste odebrali cluster a vyrovnávače zatížení.

az group delete --name $RESOURCE_GROUP --yes --no-wait

Další kroky

Funkce více SLB pomáhá škálovat a izolovat úlohy na síťové vrstvě a přitom udržovat jednoduchost prostřednictvím konfigurace spravované Azure. Další informace najdete v následujících zdrojích informací: