Konfigurera DNS-belastningsutjämning i Azure Kubernetes Fleet Manager-medlemskluster (förhandsversion)

Azure Kubernetes Fleet Manager DNS-belastningsutjämning kan öka tillgängligheten och sprida belastningen över en arbetsbelastning som distribueras över flera medlemskluster. Eftersom den här funktionen levereras via DNS kan den användas för att tillhandahålla skikt 4- och 7-belastningsutjämning efter behov.

Följ stegen i det här dokumentet för att konfigurera DNS-baserad belastningsutjämning för program med flera kluster som finns i din flotta.

Viktigt!

Förhandsversionsfunktionerna i Azure Kubernetes Fleet Manager är tillgängliga via självbetjäning och opt-in. Förhandsversioner tillhandahålls "i befintligt skick" och "i mån av tillgång," och de är undantagna från servicenivåavtal och begränsad garanti. Förhandsversioner av Azure Kubernetes Fleet Manager omfattas delvis av kundsupport på bästa sätt. Dessa funktioner är därmed inte avsedda för produktionsanvändning.

Våra förhandsversioner av dataplanets nätverk släpps via vårt networking.fleet.azure.com/v1beta1 API. Om du inte ser förhandsgranskningsobjekt kontrollerar du att du begär API:et networking.fleet.azure.com/v1beta1 när du interagerar med Fleet Manager-hubbklustret.

Förutsättningar

Om du inte har något Azure-konto skapar du ett kostnadsfritt konto innan du börjar.

  • Läs den konceptuella översikten över den här funktionen, som innehåller en förklaring av TrafficManagerProfile och TrafficManagerBackend objekt som refereras i det här dokumentet.

  • En Kubernetes Fleet Manager med ett hubbkluster och hanterad identitet. Om du inte har någon kan du läsa Skapa en Azure Kubernetes Fleet Manager och ansluta till medlemskluster med hjälp av Azure CLI.

  • Två medlemskluster aks-member-1 och aks-member-2 till vilka du distribuerar samma arbetsbelastning med hjälp av Fleet Manager-klusterresursplacering (CRP).

  • Användaren som slutför konfigurationen har behörighet att utföra Rolltilldelningar i Azure och få åtkomst till Kubernetes-API:et för Fleet Manager-hubbklustret. Mer information finns i Åtkomst till Kubernetes API för mer information.

  • En befintlig Azure-resursgrupp som är värd för den etablerade Azure Traffic Manager-resursen.

  • Ange följande miljövariabler:

    export SUBSCRIPTION_ID=<subscription>
    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBER_CLUSTER_1=aks-member-1
    export MEMBER_CLUSTER_2=aks-member-2
    export TRAFFIC_MANAGER_GROUP=rg-flt-tm-demo
    export TRAFFIC_MANAGER_RG_ID="/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${TRAFFIC_MANAGER_GROUP}
    
  • Hämta autentiseringsuppgifterna för att komma åt Kubernetes-API:et för Fleet Manager-hubbklustret:

    az fleet get-credentials \
        --resource-group ${GROUP} \
        --name ${FLEET}
    

Konfigurera Fleet Manager-behörigheter

Under förhandsversionen måste du utföra extra steg för att göra det möjligt för Fleet Manager att skapa och hantera Azure Traffic Manager-resurser och hämta offentliga IP-adresser för tjänster som exponeras i medlemskluster.

För att kunna slutföra det här steget måste du skapa din Fleet Manager med hanterad identitet aktiverad. Användaren måste ha behörigheter för Rolltilldelning i Azure RBAC.

  • Hämta identitetsinformationen för din Fleet Manager-resurs.

    az fleet show \ 
        --resource-group ${GROUP} \
        --name ${FLEET} \
        --query identity
    

    Dina utdata bör se ut ungefär som exempelutdata:

    {
      "principalId": "<FLEET-PRINCIPAL-ID>",
      "tenantId": "<ENTRA-ID-TENANT>",
      "type": "SystemAssigned",
      "userAssignedIdentities": null
    }
    
  • Tilldela Azure Kubernetes Fleet Manager Hub Agent-rollen till Fleet Manager-hubbklusteridentiteten, med begränsat omfång till den befintliga resursgruppen där Traffic Manager-resursen har skapats.

    az role assignment create \
        --assignee "<FLEET-PRINCIPAL-ID>" \
        --role "de2b316d-7a2c-4143-b4cd-c148f6a355a1" \
        --scope ${TRAFFIC_MANAGER_RG_ID}
    
  • Fleet Manager-hubbklusteridentiteten behöver också ha rollen i den resursgrupp som innehåller tjänstens offentliga IP-adresser som ska exponeras. Detta är nödvändigt eftersom Fleet Manager måste kunna läsa de offentliga IP-adresserna när de läggs till i en Azure Kubernetes Fleet Manager Hub Agent via en TrafficMangerBackend.

    az role assignment create \
        --assignee "<FLEET-PRINCIPAL-ID>" \
        --role "de2b316d-7a2c-4143-b4cd-c148f6a355a1" \
        --scope "/subscriptions/mySubscriptions/resourceGroups/MyPIPResourceGroup"
    

Distribuera en arbetsbelastning över medlemskluster i Fleet-resursen

Anmärkning

  • Stegen i den här guiden refererar endast till ett exempelprogram i demonstrationssyfte. Du kan ersätta den här arbetsbelastningen med något av dina egna befintliga distributions- och tjänstobjekt.

  • De här stegen distribuerar exempelarbetsbelastningen från Fleet Manager-hubbklustret till medlemskluster med hjälp av Fleet Managers klusterresursplacering (CRP). Du kan också välja att distribuera dessa Kubernetes-konfigurationer till varje medlemskluster separat, en i taget.

  1. Skapa ett namnområde i Fleet Manager-hubbklustret.

    kubectl create namespace kuard-demo
    

    Utdata ser ut ungefär så här:

    namespace/kuard-demo created
    
  2. Mellanlagra objekten Deployment, Service, ServiceExport till Fleet Manager-hubbklustret genom att spara följande i en fil med namnet kuard-export-service.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kuard
      namespace: kuard-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: kuard
      template:
        metadata:
          labels:
            app: kuard
        spec:
          containers:
            - name: kuard
              image: gcr.io/kuar-demo/kuard-amd64:blue
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: kuard-svc
      namespace: kuard-demo
      labels:
        app: kuard
    spec:
      selector:
        app: kuard
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer
    ---
    apiVersion: networking.fleet.azure.com/v1alpha1
    kind: ServiceExport
    metadata:
      name: kuard-export
      namespace: kuard-demo
      annotations:
        networking.fleet.azure.com/weight: "50"
    

    Ställa upp objekten på Fleet Manager-hubbklustret:

    kubectl apply -f kuard-export-service.yaml
    

    Med ServiceExport specifikationen i exemplet kan du exportera en tjänst från medlemskluster till Fleet Manager-hubbklustret. Vi vill dela upp trafiken jämnt mellan de två klustren så att vi anger viktanteckningen ServiceExport till 50. När den har exporterats synkroniseras tjänsten och alla dess slutpunkter till Fleet Manager-hubbklustret och kan sedan användas för att konfigurera DNS-belastningsutjämning över dessa slutpunkter. Utdata ser ut ungefär som i följande exempel:

    deployment.apps/kuard created
    service/kuard-svc created
    serviceexport.networking.fleet.azure.com/kuard-export created
    
  3. Varje tjänst behöver en unik DNS-etikett så att den kan exponeras via Azure Traffic Manager. Använd en Fleet Manager-klusterresursplacering ResourceOverride för att ändra tjänstdefinitionen per medlemskluster för att skapa ett unikt namn baserat på Azure-regionen och klusternamnet. Du måste skapa en åsidosättning per klusterväljare (i vårt exempel per Azure-region).

    apiVersion: placement.kubernetes-fleet.io/v1alpha1
    kind: ResourceOverride
    metadata:
     name: ro-kuard-demo-eastus
     namespace: kuard-demo
    spec:
     placement:
       name: crp-kuard-demo
     resourceSelectors:
       -  group: ""
          kind: Service
          version: v1
          name: kuard-svc
     policy:
       overrideRules:
         - clusterSelector:
             clusterSelectorTerms:
               - labelSelector:
                   matchLabels:
                     fleet.azure.com/location: eastus
           jsonPatchOverrides:
             - op: add
               path: /metadata/annotations
               value:
                 {"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-eastus"}
    

    Anmärkning

    "${MEMBER-CLUSTER-NAME}" är en reserverad variabel för placering av resurser som ersätts med namnet på medlemsklustret när det körs.

    kubectl apply -f ro-kuard-demo-eastus.yaml
    
  4. Skapa följande Fleet Manager klusterresursplacering (CRP) i en fil med namnet crp-dns-demo.yaml. Observera att vi väljer högst två kluster i eastus regionen:

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: crp-dns-demo
    spec:
      resourceSelectors:
        - group: ""
          version: v1
          kind: Namespace
          name: kuard-demo
      policy:
        placementType: PickN
        numberOfClusters: 2
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      fleet.azure.com/location: eastus
    

    Tillämpa CRP:

    kubectl apply -f crp-dns-demo.yaml
    

    Om det lyckas ser utdata ut ungefär så här:

    clusterresourceplacement.placement.kubernetes-fleet.io/crp-dns-demo created
    

Konfigurera DNS-belastningsutjämning med Azure Traffic Manager

  1. TrafficManagerProfile Definiera för att definiera de parametrar som ska användas av Traffic Manager och spara dem i filen kuard-atm-demo.yaml.

    apiVersion: networking.fleet.azure.com/v1beta1
    kind: TrafficManagerProfile
    metadata:
      name: kuard-atm-demo
      namespace: kuard-demo
    spec:
      resourceGroup: "rg-flt-tm-demo"
      monitorConfig:
        port: 80
    

    Tillämpa konfigurationen:

    kubectl apply -f kuard-atm-demo.yaml
    
  2. Definiera en motsvarande TrafficManagerBackend som används för att gruppera exporterade Service inlägg från medlemskluster.

    apiVersion: networking.fleet.azure.com/v1beta1
    kind: TrafficManagerBackend
    metadata:
      name: kuard-atm-demo-backend
      namespace: kuard-demo
    spec:
      profile:
        name: "kuard-atm-demo"
      backend:
        name: "kuard-svc"
      weight: 100
    

    Tillämpa konfigurationen:

    kubectl apply -f kuard-atm-demo-backend.yaml
    
  3. Kontrollera att tjänsten är tillgänglig via Azure Traffic Manager genom att köra följande kommando:

    nslookup kuard-atm-demo.trafficmanager.net
    

    Utdata bör se ut ungefär som följande exempel:

    Server:         10.X.X.254
    Address:        10.X.X.254#53
    
    Non-authoritative answer:
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 123.X.X.16
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 74.X.X.78
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 173.X.X.164
    
  4. Använd en webbläsare för att besöka URL:en och se hur Kuard svarar. Prova att rensa DNS och försök igen för att se om begäran hanteras av en annan tjänstinstans från ett annat kluster.

En skärmbild av en webbsida som visar information från Kuard-demoprogrammet.