Condividi tramite


Usare più servizi di bilanciamento del carico nel servizio Azure Kubernetes (anteprima)

Azure Kubernetes Service (AKS) esegue in genere il provisioning di uno Standard Load Balancer (SLB) per tutti i Servizi LoadBalancer in un cluster. Poiché ogni scheda di interfaccia di rete del nodo è limitata a 300 regole di bilanciamento del carico in ingresso e 8 servizi di collegamento privato, i cluster di grandi dimensioni o carichi di lavoro con molti porti possono esaurire rapidamente questi limiti.

L'anteprima SLB multipla rimuove il collo di bottiglia consentendo di creare diversi SBS all'interno dello stesso cluster e nodi di partizione e servizi tra di essi. Si definiscono le configurazioni del servizio di bilanciamento del carico, ognuna associata a un pool di agenti primari e a uno spazio dei nomi facoltativo, un'etichetta o un selettore di nodo, e AKS inserisce automaticamente nodi e servizi nel SLB appropriato. Il comportamento SNAT in uscita rimane invariato se outboundType è loadBalancer. Il traffico in uscita passa comunque attraverso il primo bilanciamento del carico software.

Utilizza questa funzione per:

  • Espandi oltre 300 regole di ingresso senza necessità di aggiungere cluster.
  • Isolare il traffico del tenant o del carico di lavoro associando un SLB dedicato al proprio pool di agenti.
  • Distribuire i servizi di collegamento privato tra più SLB quando si avvicina il limite per SLB.

Prerequisiti

  • aks-preview estensione 18.0.0b1 o successiva.
  • Flag della funzionalità di sottoscrizione Microsoft.ContainerService/MultipleStandardLoadBalancersPreview registrato.
  • Kubernetes versione 1.28 o successiva.
  • Cluster creato con --load-balancer-backend-pool-type nodeIP o aggiornare e il cluster esistente usando az aks update.

Installare l'estensione dell'interfaccia della riga di comando di Azure aks-preview

Importante

Le funzionalità di anteprima di AKS sono disponibili su base self-service, su scelta. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:

  • Installare l'estensione aks-preview usando il comando az extension add.

    az extension add --name aks-preview
    
  • Eseguire l'aggiornamento alla versione più recente dell'estensione rilasciata usando il comando az extension update.

    az extension update --name aks-preview
    

Registrare il flag di funzionalità MultipleStandardLoadBalancersPreview

  1. Registrare il flag della funzionalità MultipleStandardLoadBalancersPreview usando il comando az feature register.

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

    Sono necessari alcuni minuti per visualizzare lo stato Registered.

  2. Verificare lo stato della registrazione usando il comando az feature show:

    az feature show --namespace "Microsoft.ContainerService" --name "MultipleStandardLoadBalancersPreview"
    
  3. Quando lo stato riflette Registrato, aggiornare la registrazione del provider di risorse Microsoft.ContainerService usando il comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Come AKS (Azure Kubernetes Service) sceglie un bilanciatore del carico (posizionamento del nodo e del servizio)

Il servizio AKS utilizza più input per determinare dove posizionare i nodi ed esporre i servizi di bilanciamento del carico. Questi input vengono definiti in ogni configurazione del servizio di bilanciamento del carico e influiscono sulla selezione del bilanciamento del carico software per ogni risorsa.

Tipo di input Si applica a Descrizione
Pool di agenti primari
--primary-agent-pool-name
Nodi Obbligatorio. Tutti i nodi in questo pool vengono sempre aggiunti al pool back-end dello SLB. Garantisce che ogni SLB (Server Load Balancer) includa almeno un nodo integro.
Selettore di nodo
--node-selector
Nodi Opzionale. Aggiunge qualsiasi nodo con etichette corrispondenti al bilanciamento del carico software, oltre al pool primario.
Selettore dello spazio dei nomi del servizio
--service-namespace-selector
Servizi Opzionale. Solo i servizi negli spazi dei nomi con etichette corrispondenti vengono considerati per questo bilanciamento del carico software.
Selettore di etichette del servizio
--service-label-selector
Servizi Opzionale. Solo i servizi con etichette corrispondenti sono idonei per questo SLB.
Annotazione del servizio
service.beta.kubernetes.io/azure-load-balancer-configurations
Servizi Opzionale. Limita il posizionamento a una o più configurazioni SLB denominate in modo esplicito. Senza di esso, qualsiasi configurazione corrispondente è idonea.

Annotazioni

I selettori definiscono l'idoneità. L'annotazione (se utilizzata) limita il controller a un subset specifico di SLB.

Come AKS utilizza questi input

Il piano di controllo del servizio Azure Kubernetes riconcilia continuamente lo stato del nodo e del servizio usando le regole precedenti:

Posizionamento dei nodi

Quando un nodo viene aggiunto o aggiornato, AKS verifica per quali SLB è idoneo in base al pool primario e al selettore del nodo.

  • Se più SLBs corrispondono, il controller seleziona quello con il minor numero di nodi correnti.
  • Il nodo viene inserito nel pool back-end del Software Load Balancer (SLB).

Posizione del servizio

Quando viene creato o aggiornato un servizio LoadBalancer:

  1. Il servizio Azure Kubernetes trova SBS i cui selettori di spazio dei nomi e etichette corrispondono al servizio.
  2. Se l'annotazione del servizio è presente, vengono considerati solo i SBS denominati.
  3. I SBS con allowServicePlacement=false o che superano i limiti di Azure (300 regole o 8 servizi di collegamento privato) vengono esclusi.
  4. Tra le opzioni valide, viene scelto l'SLB con il minor numero di regole.

Comportamento di externalTrafficPolicy (ETP)

AKS gestisce i servizi in modo diverso a seconda del valore di externalTrafficPolicy.

Mode Funzionamento della selezione del bilanciamento del carico Come viene compilata l'appartenenza al pool back-end Note
Cluster (impostazione predefinita) Il controller segue le regole di posizionamento standard descritte in precedenza. Una singola regola di bilanciamento del carico si applica al pool back-end kubernetes condiviso nel SLB scelto. Tutti i nodi nel pool di bilanciamento del carico software kubernetes sono destinazioni integre. I nodi senza pod corrispondenti vengono rimossi automaticamente dai probe di integrità. Stesso comportamento di oggi nei cluster con bilanciamento del carico software singolo.
Locale Il controller usa ancora l'algoritmo basato sul selettore per selezionare un bilanciamento del carico software, ma crea un pool back-end dedicato per ogni servizio invece di usare il pool condiviso. L'appartenenza viene sincronizzata dagli oggetti del EndpointSlice servizio, quindi vengono aggiunti solo i nodi che ospitano pod pronti. I probe di integrità continuano a usare healthCheckNodePort per eliminare nodi non integri. Garantisce la conservazione degli indirizzi IP client ed evita il routing attraverso nodi che non dispongono di pod, anche quando i nodi vengono partizionati tra più SBS.

Perché un pool dedicato per ETP Local?
In modalità multi-SLB, i nodi che ospitano pod per un determinato servizio possono risiedere in SBS diversi dall'indirizzo VIP rivolto al client. Un pool back-end condiviso contiene spesso zero nodi idonei, interrompendo il traffico. Allocando un pool per Servizio e sincronizzandolo da EndpointSlice, AKS garantisce che il SLB del Servizio punti sempre ai nodi corretti.

Impatto sulle quote

  • Ogni servizio locale ETP aggiunge un pool back-end e una regola di bilanciamento del carico al bilanciamento del carico software.
  • Questi conteggi vengono conteggiati per il limite di 300 regole, quindi monitorare l'utilizzo delle regole quando si dispone di molti servizi locali ETP.

Nessuna modifica al traffico in uscita

SNAT in uscita scorre comunque attraverso il primo SLB aksOutboundBackendPool quando outboundType è loadBalancer, indipendentemente dalle impostazioni ETP.

Facoltativo: ribilanciamento

È possibile ribilanciare manualmente la distribuzione dei nodi in un secondo momento usando az aks loadbalancer rebalance.

Questa progettazione consente di definire il routing flessibile basato su etichette sia per l'infrastruttura che per i carichi di lavoro, mentre AKS gestisce automaticamente il posizionamento per bilanciare ed evitare problemi di quota.

Aggiungere la prima configurazione del servizio di bilanciamento del carico

Aggiungere una configurazione denominata kubernetes e associarla a un pool di agenti primario che ha sempre almeno un nodo. La rimozione di ogni configurazione ripristina la modalità a singolo SLB del cluster.

Importante

Per abilitare la modalità SLB multipla, è necessario aggiungere una configurazione del servizio di bilanciamento del carico denominata kubernetes e collegarla a un pool di agenti primario con almeno un nodo pronto.
La presenza di questa configurazione attiva/disattiva il supporto multi-SLB; nella selezione del servizio, non ha priorità speciale e viene trattato come qualsiasi altra configurazione di bilanciamento del carico.
Se si eliminano ogni configurazione dei bilanciatori di carico, il cluster esegue automaticamente il fallback alla modalità singola SLB, che può causare brevi interruzioni nel routing del servizio o nei flussi SNAT.

  1. Impostare le variabili di ambiente da usare in questa esercitazione. È possibile sostituire tutti i valori segnaposto con il proprio tranne DEFAULT_LB_NAME, che deve rimanere come kubernetes.

    RESOURCE_GROUP="rg-aks-multislb"
    CLUSTER_NAME="aks-multi-slb"
    LOCATION="westus"
    DEFAULT_LB_NAME="kubernetes"
    PRIMARY_POOL="nodepool1"
    
  2. Creare un gruppo di risorse usando il az group create comando .

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Creare un cluster AKS usando il comando az aks create.

    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME \
      --load-balancer-backend-pool-type nodeIP \
      --node-count 3
    
  4. Aggiungere un servizio di bilanciamento del carico predefinito usando il az aks loadbalancer add comando .

    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
    

Aggiungere altri servizi di bilanciamento del carico

Creare configurazioni specifiche del tenant specificando un pool primario diverso e selettori facoltativi di spazio dei nomi, etichette o nodi.

  1. Il team 1 eseguirà i propri carichi di lavoro in un pool di nodi separato. Assegnare un'etichetta tenant=team1 in modo che i carichi di lavoro possano essere pianificati usando selettori:

    TEAM1_POOL="team1pool"
    TEAM1_LB_NAME="team1-lb"
    
  2. Creare un secondo pool di nodi per il team 1 usando il az aks nodepool add comando .

    az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME \
      --name $TEAM1_POOL \
      --labels tenant=team1 \
      --node-count 2
    
  3. Creare un servizio di bilanciamento del carico per il team 1 usando il az aks loadbalancer add comando .

    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. Etichettare lo spazio dei nomi di destinazione, ad esempio team1-apps, in modo che corrisponda al selettore utilizzando il comando az aks command invoke.

    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. È ora possibile elencare i servizi di bilanciamento del carico nel cluster per visualizzare più configurazioni usando il az aks loadbalancer list comando .

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

    Output di esempio:

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

Distribuire un servizio a un bilanciatore del carico specifico

Aggiungere l'annotazione service.beta.kubernetes.io/azure-load-balancer-configurations con un elenco delimitato da virgole di nomi di configurazione. Se l'annotazione viene omessa, il controller sceglie automaticamente.

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
"

Ribilanciare i nodi (facoltativo)

Eseguire un'operazione di ribilanciamento dopo il ridimensionamento se i conteggi delle regole diventano sbilanciati usando il az aks loadbalancer rebalance comando . Questo comando interrompe i flussi attivi, quindi pianificali durante una finestra di manutenzione.

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

Monitoraggio e risoluzione dei problemi

  • Controllare gli eventi del controller (kubectl get events …) per verificare che i servizi siano riconciliati.
  • Se la connettività esterna è bloccata, aprire una shell del nodo e curl l'indirizzo VIP del servizio per confermare il routing kube-proxy.

Limitazioni e problemi noti

Limitazione Dettagli
SNAT in uscita Usa sempre il primo SLB; i flussi in uscita non vengono partizionati.
Tipo di pool back-end Creare o aggiornare un cluster esistente per utilizzare i pool back-end nodeIP.
Zeri di scalabilità automatica Un pool di agenti primari non può essere ridimensionato a 0 nodi.
Evoluzione delle regole ETP local Ogni servizio ETP local utilizza la propria regola e il proprio pool back-end, quindi i conteggi delle regole possono aumentare più velocemente rispetto alla modalità cluster.
Ribilanciamento delle perturbazioni La rimozione di un nodo da un pool back-end elimina le connessioni in anteprima. Pianificare le finestre di manutenzione.
Tempistica del ricaricamento della configurazione Dopo l'esecuzione di az aks loadbalancer, le modifiche potrebbero non essere effettive immediatamente. L'operazione AKS viene completata rapidamente, ma il cloud-controller-manager potrebbe richiedere più tempo per applicare gli aggiornamenti. Attendere che l'evento EnsuredLoadBalancer conferma che le modifiche siano attive.

Pulire le risorse

Elimina il gruppo di risorse una volta terminato per rimuovere il cluster e i bilanciatori del carico usando il comando az group delete.

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

Passaggi successivi

La funzionalità SLB multipla consente di ridimensionare e isolare i carichi di lavoro a livello di rete mantenendo al tempo stesso la semplicità tramite la configurazione gestita da Azure. Per altre informazioni, vedere le risorse seguenti: