Condividi tramite


Configurare il bilanciamento del carico DNS nei cluster membri di Azure Kubernetes Fleet Manager (anteprima)

Il bilanciamento del carico DNS di Azure Kubernetes Fleet Manager consente di aumentare la disponibilità e distribuire il carico in un carico di lavoro distribuito tra più cluster membri. Poiché questa funzionalità viene distribuita tramite DNS, può essere usata per fornire il bilanciamento del carico di livello 4 e 7 in base alle esigenze.

Seguire la procedura descritta in questo documento per configurare il bilanciamento del carico basato su DNS per le applicazioni multi-cluster ospitate nella flotta.

Importante

Le funzionalità di anteprima di Gestione flotta Kubernetes di Azure sono disponibili in modalità self-service e opt-in. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime di Gestione flotta Kubernetes di Azure sono parzialmente coperte dal supporto clienti con il massimo sforzo. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione.

Le anteprime di rete del piano dati vengono rilasciate tramite l'API networking.fleet.azure.com/v1beta1. Se non vengono visualizzati oggetti di anteprima, verificare di richiedere l'API networking.fleet.azure.com/v1beta1 quando si interagisce con il cluster hub di Fleet Manager.

Prerequisiti

Se non si ha un account Azure, creare un account gratuito prima di iniziare.

  • Leggere la panoramica concettuale di questa funzionalità, che fornisce una spiegazione degli oggetti TrafficManagerProfile e TrafficManagerBackend a cui si fa riferimento in questo documento.

  • Un'istanza di Gestione flotta Kubernetes con un cluster hub e un'identità gestita. Se non è disponibile, vedere Creare un'istanza di Gestione flotta Kubernetes di Azure e aggiungere cluster membri usando l'interfaccia della riga di comando di Azure.

  • Due cluster membri aks-member-1 e aks-member-2 sui quali si distribuisce lo stesso carico di lavoro usando il posizionamento delle risorse dei cluster (CRP) di Fleet Manager.

  • L'utente che completa la configurazione ha le autorizzazioni per eseguire assegnazioni di ruolo di Azure e per accedere all'API Kubernetes del cluster hub di Fleet Manager. Per altre informazioni, vedere Accedere all'API Kubernetes per altri dettagli.

  • Un gruppo di risorse di Azure esistente, che ospita la risorsa di Gestione traffico di Azure di cui è stato effettuato il provisioning.

  • Impostare le seguenti variabili di ambiente:

    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}
    
  • Ottenere le credenziali per accedere all'API Kubernetes del cluster hub Fleet Manager:

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

Configurare le autorizzazioni di Fleet Manager

Durante l'anteprima, è necessario eseguire passaggi aggiuntivi per consentire a Fleet Manager di creare e gestire le risorse di Gestione traffico di Azure e di ottenere indirizzi IP pubblici dei servizi esposti nei cluster membri.

Per completare questo passaggio, è necessario creare Fleet Manager con l'identità gestita abilitata. L'utente deve disporre delle autorizzazioni per l'assegnazione dei ruoli di Azure RBAC.

  • Ottenere le informazioni sull'identità della risorsa Fleet Manager.

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

    L'output dovrebbe essere simile all'output di esempio:

    {
      "principalId": "<FLEET-PRINCIPAL-ID>",
      "tenantId": "<ENTRA-ID-TENANT>",
      "type": "SystemAssigned",
      "userAssignedIdentities": null
    }
    
  • Assegnare il ruolo Azure Kubernetes Fleet Manager Hub Agent all'identità del cluster hub di Gestione flotta, limitando l'ambito al gruppo di risorse esistente in cui viene creata la risorsa di Gestione traffico.

    az role assignment create \
        --assignee "<FLEET-PRINCIPAL-ID>" \
        --role "de2b316d-7a2c-4143-b4cd-c148f6a355a1" \
        --scope ${TRAFFIC_MANAGER_RG_ID}
    
  • L'identità del cluster dell'hub di Fleet Manager richiede anche il ruolo Azure Kubernetes Fleet Manager Hub Agent nel gruppo di risorse che contiene gli IP pubblici del servizio da esporre, poiché Fleet Manager deve leggere questi indirizzi quando vengono aggiunti a un TrafficMangerBackend tramite un ServiceExport.

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

Distribuire un carico di lavoro tra cluster membri della risorsa Flotta

Annotazioni

  • I passaggi descritti in questa guida pratica fanno riferimento a un'applicazione di esempio solo a scopo dimostrativo. È possibile sostituire questo carico di lavoro per uno dei propri oggetti Distribuzione e Servizio esistenti.

  • Questi passaggi distribuiscono il carico di lavoro di esempio dal cluster hub di Fleet Manager ai cluster membri utilizzando il posizionamento delle risorse del cluster (CRP) di Fleet Manager. In alternativa, è possibile scegliere di distribuire queste configurazioni Kubernetes in ogni cluster membro separatamente, una alla volta.

  1. Creare un namespace nel cluster hub di Fleet Manager.

    kubectl create namespace kuard-demo
    

    L'output è simile al seguente:

    namespace/kuard-demo created
    
  2. Preparare la distribuzione, il servizio, gli oggetti ServiceExport nel cluster hub di Gestione flotta salvando quanto segue in un file denominato 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"
    

    Preparare lo stage degli oggetti nel cluster hub di Gestione flotta:

    kubectl apply -f kuard-export-service.yaml
    

    La ServiceExport specifica nell'esempio consente di esportare un servizio dai cluster membri al cluster hub Fleet Manager. Si vuole suddividere il traffico in modo uniforme tra i due cluster per impostare l'annotazione di peso del ServiceExport su 50. Dopo l'esportazione, il servizio e tutti i relativi endpoint vengono sincronizzati con il cluster hub di Fleet Manager e possono quindi essere usati per configurare il bilanciamento del carico DNS tra questi endpoint. L'output è simile al seguente esempio:

    deployment.apps/kuard created
    service/kuard-svc created
    serviceexport.networking.fleet.azure.com/kuard-export created
    
  3. Ogni servizio necessita di un'etichetta DNS univoca in modo che possa essere esposta tramite Gestione traffico di Azure. Usare un posizionamento ResourceOverride delle risorse del cluster Fleet Manager per modificare la definizione del servizio per ogni cluster membro per creare un nome univoco in base all'area di Azure e al nome del cluster. È necessario creare un override per ogni selettore del cluster (nell'esempio, per area di Azure).

    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"}
    

    Annotazioni

    "${MEMBER-CLUSTER-NAME}" è una variabile riservata di sostituzione del posizionamento delle risorse che viene sostituita con il nome del cluster membro in fase di esecuzione.

    kubectl apply -f ro-kuard-demo-eastus.yaml
    
  4. Creare il posizionamento risorse cluster (CRP) di Gestione flotta in un file denominato crp-dns-demo.yaml. Si noti che si seleziona un massimo di due cluster nell'area eastus :

    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
    

    Applicare il CRP:

    kubectl apply -f crp-dns-demo.yaml
    

    In caso di esito positivo, l'output sarà simile al seguente:

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

Configurare il bilanciamento del carico DNS con Gestione traffico di Azure

  1. Definisci TrafficManagerProfile per stabilire i parametri da utilizzare con Traffic Manager e salvali nel file 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
    

    Applicare la configurazione:

    kubectl apply -f kuard-atm-demo.yaml
    
  2. Definire un oggetto corrispondente TrafficManagerBackend utilizzato per raggruppare le voci esportate Service dai cluster membri.

    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
    

    Applicare la configurazione:

    kubectl apply -f kuard-atm-demo-backend.yaml
    
  3. Verificare che il servizio sia disponibile tramite Gestione traffico di Azure eseguendo il comando seguente:

    nslookup kuard-atm-demo.trafficmanager.net
    

    L'output deve essere simile all'esempio seguente:

    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. Usare un Web browser per visitare l'URL e vedere in che modo Kuard risponde. Prova a svuotare la cache DNS e tenta nuovamente di vedere se la richiesta è servita da un'altra istanza di servizio in un altro cluster.

Screenshot di una pagina Web che mostra i dettagli dell'applicazione demo Kuard.