Delen via


Meerdere load balancers gebruiken in Azure Kubernetes Service (preview)

Azure Kubernetes Service (AKS) richt normaal gesproken één Standard Load Balancer (SLB) in voor alle LoadBalancer services in een cluster. Omdat elke knooppunt-NIC is beperkt tot 300 regels voor binnenkomende taakverdeling en 8 privékoppelingsservices, kunnen grote clusters of werkbelastingen met veel poorten deze limieten snel uitputten.

Met de preview van meerdere SLB's wordt dat knelpunt verwijderd door u in staat te stellen meerdere SLB's in hetzelfde cluster te maken en nodes en services over hen te verdelen. U definieert load balancer-configuraties, die elk zijn gekoppeld aan een primaire agentgroep en optionele naamruimte, label of knooppuntkiezer, en AKS plaatst automatisch knooppunten en services op de juiste SLB. Uitgaand SNAT-gedrag blijft ongewijzigd als outboundTypeloadBalancer is. Uitgaand verkeer loopt nog steeds door de eerste SLB.

Gebruik deze functie voor het volgende:

  • Schaal meer dan 300 regels voor inkomend verkeer zonder clusters toe te voegen.
  • Isoleer tenant- of workloadverkeer door een toegewezen SLB te koppelen aan een eigen agentpool.
  • Distribueer private-linkdiensten over meerdere SLB's wanneer u de limiet per SLB nadert.

Vereiste voorwaarden

  • aks-preview extensie 18.0.0b1 of hoger.
  • Vlag abonnementsfunctie Microsoft.ContainerService/MultipleStandardLoadBalancersPreview geregistreerd.
  • Kubernetes versie 1.28 of hoger.
  • Cluster gemaakt met --load-balancer-backend-pool-type nodeIP of bijgewerkt en bestaand cluster met behulp van az aks update.

De Azure CLI-extensie aks-preview installeren

Belangrijk

AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals het is' en 'voor zover beschikbaar' en zijn uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning naar best vermogen. Zodoende zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:

  • Installeer de aks-preview-extensie met behulp van de az extension add opdracht.

    az extension add --name aks-preview
    
  • Werk bij naar de nieuwste versie van de extensie die is uitgebracht met behulp van de az extension update opdracht.

    az extension update --name aks-preview
    

MultipleStandardLoadBalancersPreview De functievlag registreren

  1. Registreer de MultipleStandardLoadBalancersPreview functievlag met behulp van de az feature register opdracht.

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

    Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven.

  2. Controleer de registratiestatus met behulp van de az feature show opdracht:

    az feature show --namespace "Microsoft.ContainerService" --name "MultipleStandardLoadBalancersPreview"
    
  3. Wanneer de status Geregistreerd aangeeft, vernieuwt u de registratie van de Microsoft.ContainerService-resourceprovider met behulp van de az provider register-opdracht.

    az provider register --namespace Microsoft.ContainerService
    

Hoe AKS een load balancer kiest (plaatsing van knooppunten en services)

AKS gebruikt meerdere invoer om te bepalen waar knooppunten moeten worden geplaatst en LoadBalancer Services beschikbaar moet worden gemaakt. Deze invoeren worden gedefinieerd in elke load balancer-configuratie en beïnvloeden welke SLB voor elke resource wordt geselecteerd.

Invoertype Van toepassing op: Beschrijving
Primaire agentgroep
--primary-agent-pool-name
Knooppunten Verplicht. Alle knooppunten in deze pool worden altijd toegevoegd aan de back-end pool van de SLB. Zorgt ervoor dat elke SLB ten minste één goed knooppunt heeft.
Knooppuntkiezer
--node-selector
Knooppunten Facultatief. Voegt een knooppunt met overeenkomende labels toe aan de SLB, naast de primaire pool.
Servicenaamruimtekiezer
--service-namespace-selector
Diensten Facultatief. Alleen services in naamruimten met overeenkomende labels worden in aanmerking genomen voor deze SLB.
Servicelabelkiezer
--service-label-selector
Diensten Facultatief. Alleen services met overeenkomende labels komen in aanmerking voor deze SLB.
Serviceaantekening
service.beta.kubernetes.io/azure-load-balancer-configurations
Diensten Facultatief. Beperkt de plaatsing tot een of meer expliciet benoemde SLB-configuraties. Zonder deze configuratie komt elke overeenkomende configuratie in aanmerking.

Opmerking

Selectors definiëren geschiktheid. De aantekening (indien gebruikt) beperkt de controller tot een specifieke subset van SLB's.

Hoe AKS deze invoer gebruikt

Met het AKS-besturingsvlak worden knooppunten en servicestatus continu afgestemd met behulp van de bovenstaande regels:

Plaatsing van knooppunten

Wanneer een knooppunt wordt toegevoegd of bijgewerkt, controleert AKS op welke SLB's het in aanmerking komt op basis van primaire pool en knooppuntkeuzer.

  • Als er meerdere SLB's overeenkomen, kiest de controller degene met het minste aantal huidige knooppunten.
  • Het knooppunt wordt toegevoegd aan de back-endpool van die SLB.

Serviceplaatsing

Wanneer een LoadBalancer-service wordt gemaakt of bijgewerkt:

  1. AKS vindt SLB's waarvan de naamruimte en labelkiezers overeenkomen met de Service.
  2. Als de Service-annotatie aanwezig is, worden alleen de benoemde SLB's overwogen.
  3. SLB's met allowServicePlacement=false of die de Azure-limieten overschrijden (300 regels of 8 private-link-services) worden uitgesloten.
  4. Onder geldige opties wordt de SLB met de minste regels gekozen.

gedrag van externalTrafficPolicy (ETP)

AKS verwerkt Services anders, afhankelijk van de waarde van externalTrafficPolicy.

Wijze Hoe load balancer-selectie werkt Hoe de samenstelling van de back-end pool tot stand komt Opmerkingen
Cluster (standaard) De controller volgt de standaardplaatsingsregels die hierboven worden beschreven. Eén taakverdelingsregel is gericht op de gedeelde kubernetes-back-endpool op de gekozen SLB. Alle knooppunten in die pool van kubernetes SLB zijn gezonde doelen. Knooppunten zonder overeenkomende Pods worden automatisch verwijderd door statustests. Hetzelfde gedrag als vandaag in clusters met één SLB.
Lokaal De controller gebruikt nog steeds het selector-gebaseerd algoritme om een SLB te kiezen, maar maakt een dedicated back-endpool per service in plaats van de gedeelde pool te gebruiken. Lidmaatschap wordt gesynchroniseerd vanuit de objecten van EndpointSlice de service, zodat alleen knooppunten die daadwerkelijk gereede pods hosten, worden toegevoegd. Statustests blijven gebruiken healthCheckNodePort om beschadigde knooppunten te verwijderen. Garandeert behoud van client-IP en vermijd routering via knooppunten die geen pods hebben, zelfs wanneer knooppunten worden geshard in meerdere SLO's.

Waarom een toegewezen pool voor ETP Local?
In de multi-SLB-modus kunnen knooppunten die Pods voor een bepaalde Service hosten, zich bevinden op verschillende SLB's dan het klantgerichte VIP. Een gedeelde back-endpool zou vaak geen in aanmerking komende knooppunten bevatten, waardoor het verkeer verstoord wordt. Door een pool per service toe te wijzen en deze te synchroniseren, EndpointSlicezorgt AKS ervoor dat de SLB van de service altijd naar de juiste knooppunten verwijst.

Gevolgen voor quota

  • Elke lokale ETP-service voegt één backendpool en één load-balancerregel toe aan de SLB.
  • Deze tellen mee voor de limiet van 300 regels, dus bewaak het gebruik van regels wanneer u veel lokale ETP-services hebt.

Geen wijziging in uitgaand verkeer

Uitgaande SNAT loopt nog steeds door van de eerste SLB aksOutboundBackendPool wanneer outboundType gelijk is aan loadBalancer, onafhankelijk van de ETP-instellingen.

Optioneel: Herbalanceren

U kunt de distributie van knooppunten later handmatig opnieuw verdelen met behulp van az aks loadbalancer rebalance.

Met dit ontwerp kunt u flexibele, labelgestuurde routering definiëren voor zowel infrastructuur als workloads, terwijl AKS de plaatsing automatisch afhandelt om de balans te behouden en quotumproblemen te voorkomen.

De eerste load balancer-configuratie toevoegen

Voeg een configuratie toe met de naam kubernetes en bind deze aan een primaire agentgroep die altijd ten minste één knooppunt heeft. Als u elke configuratie verwijdert, wordt het cluster teruggezet naar de single-SLB-modus.

Belangrijk

Als u meerdere SLB-modus wilt inschakelen , moet u een load balancer-configuratie met de naam kubernetes toevoegen en koppelen aan een primaire agentgroep die altijd ten minste één gereed knooppunt heeft.
De aanwezigheid van deze configuratie schakelt multi-SLB-ondersteuning in; in de serviceselectie heeft deze geen speciale prioriteit en wordt deze behandeld als elke andere load balancer-configuratie.
Als u elke load balancer-configuratie verwijdert, valt het cluster automatisch terug naar de modus single-SLB, waardoor serviceroutering of SNAT-stromen kort kunnen worden onderbroken.

  1. Stel omgevingsvariabelen in voor gebruik in deze zelfstudie. U kunt alle tijdelijke aanduidingen vervangen door uw eigen waarden, behalve DEFAULT_LB_NAME, die als kubernetes moeten blijven.

    RESOURCE_GROUP="rg-aks-multislb"
    CLUSTER_NAME="aks-multi-slb"
    LOCATION="westus"
    DEFAULT_LB_NAME="kubernetes"
    PRIMARY_POOL="nodepool1"
    
  2. Maak een resourcegroep met behulp van de az group create opdracht.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Maak een AKS-cluster met behulp van de az aks create opdracht.\

    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME \
      --load-balancer-backend-pool-type nodeIP \
      --node-count 3
    
  4. Voeg een standaard load balancer toe met behulp van de az aks loadbalancer add opdracht.

    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
    

Extra load balancers toevoegen

Maak tenantspecifieke configuraties door een andere primaire pool op te geven plus optionele naamruimte, label of knooppuntkiezers.

  1. Team 1 voert zijn eigen workloads uit in een afzonderlijke knooppuntgroep. Wijs een tenant=team1 label toe zodat workloads kunnen worden gepland met behulp van selectors:

    TEAM1_POOL="team1pool"
    TEAM1_LB_NAME="team1-lb"
    
  2. Maak een tweede knooppuntgroep voor team 1 met behulp van de az aks nodepool add opdracht.

    az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME \
      --name $TEAM1_POOL \
      --labels tenant=team1 \
      --node-count 2
    
  3. Maak een load balancer voor team 1 met behulp van de az aks loadbalancer add opdracht.

    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. Geef de doel-naamruimte (bijvoorbeeld team1-apps) een label dat overeenkomt met de selector met behulp van de az aks command invoke opdracht.

    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. U kunt nu de load balancers in het cluster weergeven om de meerdere configuraties te bekijken met behulp van de az aks loadbalancer list opdracht.

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

    Voorbeelduitvoer:

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

Een service implementeren in een specifieke load balancer

Voeg de aantekening service.beta.kubernetes.io/azure-load-balancer-configurations toe met een door komma's gescheiden lijst met configuratienamen. Als de aantekening wordt weggelaten, kiest de controller automatisch.

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
"

Knooppunten opnieuw verdelen (optioneel)

Voer een herbalance-bewerking uit na het schalen als regelaantallen met behulp van de az aks loadbalancer rebalance opdracht niet meer in balans zijn. Met deze opdracht worden actieve datastromen onderbroken, dus voer deze uit tijdens een onderhoudsvenster.

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

Bewaking en problemen oplossen

  • Bekijk controller-gebeurtenissen (kubectl get events …) om te verifiëren dat diensten zijn afgestemd.
  • Als externe connectiviteit is geblokkeerd, opent u een node-shell en gebruikt u de curl-opdracht om de Service-VIP aan te spreken om de kube-proxy routing te bevestigen.

Beperkingen en bekende problemen

Beperking Bijzonderheden
Uitgaande SNAT Maakt altijd gebruik van de eerste SLB; uitgaande stromen worden niet opgesplitst.
Type back-end pool Maak of werk een bestaand cluster bij om de back-endpools te gebruiken nodeIP.
Autoscaler op nul zetten Een primaire agentpool kan niet worden geschaald naar 0 knooppunten.
Groei van ETP-regels local Elke ETP-service local maakt gebruik van een eigen regel- en back-endpool, zodat regelaantallen sneller kunnen groeien dan met cluster de modus.
Onderbreking opnieuw verdelen Als u een knooppunt uit een back-endpool verwijdert, worden de verbindingen tijdens de vlucht verwijderd. Onderhoudsvensters plannen.
Tijdstip voor het opnieuw laden van configuratie Nadat az aks loadbalancer is uitgevoerd, worden wijzigingen mogelijk niet onmiddellijk van kracht. De AKS-bewerking wordt snel voltooid, maar het kan langer duren voordat updates worden toegepast in de cloudcontrollerbeheer. Wacht totdat de EnsuredLoadBalancer gebeurtenis bevestigt dat de wijzigingen actief zijn.

De hulpbronnen opschonen

Verwijder de resourcegroep wanneer u klaar bent om het cluster en de load balancers te verwijderen met behulp van de az group delete opdracht.

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

Volgende stappen

Met de functie meerdere SLB kunt u workloads op de netwerklaag schalen en isoleren, terwijl u de eenvoud behoudt via de door Azure beheerde configuratie. Zie de volgende bronnen voor meer informatie: