Condividi tramite


Configurare il bilanciamento del carico multi-cluster di livello 4 nei cluster membri di Gestione flotta Kubernetes di Azure (anteprima)

Per le applicazioni distribuite in più cluster, gli amministratori spesso vogliono instradare il traffico in ingresso tra i cluster.

È possibile seguire questo documento per configurare il bilanciamento del carico di livello 4 per tali applicazioni multi-cluster.

Importante

Le funzionalità di anteprima di Gestione flotta Kubernetes di Azure sono disponibili in modalità self-service e acconsentono esplicitamente. 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 in base al massimo impegno. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione.

Prerequisiti

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

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

  • È necessaria una risorsa Flotta con un cluster hub e cluster membri. Se questa risorsa non è disponibile, seguire Avvio rapido: Creare una risorsa Flotta e aggiungere cluster membri.

  • I cluster del Servizio Azure Kubernetes (AKS) di destinazione in cui vengono distribuiti i carichi di lavoro devono essere presenti nella stessa rete virtuale o nelle reti virtuali con peering.

  • È necessario ottenere l'accesso all'API Kubernetes del cluster hub seguendo la procedura descritta nell'API Kubernetes del cluster hub di Access Fleet.

  • Impostare le variabili di ambiente seguenti e ottenere kubeconfigs per la flotta e tutti i cluster membri:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBER_CLUSTER_1=aks-member-1
    export MEMBER_CLUSTER_2=aks-member-2
    
    az fleet get-credentials --resource-group ${GROUP} --name ${FLEET} --file fleet
    
    az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_1} --file aks-member-1
    
    az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_2} --file aks-member-2
    

Distribuire un carico di lavoro tra cluster membri della risorsa Flotta

Nota

  • 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 Flotta ai cluster membri usando la propagazione della configurazione di Kubernetes. In alternativa, è possibile scegliere di distribuire queste configurazioni Kubernetes in ogni cluster membro separatamente, una alla volta.

  1. Creare uno spazio dei nomi nella flotta cluster:

    KUBECONFIG=fleet kubectl create namespace kuard-demo
    

    L'output è simile al seguente esempio:

    namespace/kuard-demo created
    
  2. Applicare gli oggetti Distribuzione, Servizio, ServiceExport:

    KUBECONFIG=fleet kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-export-service.yaml
    

    La specifica ServiceExport nel file precedente consente di esportare un servizio dai cluster membri alla risorsa Flotta. Dopo l'esportazione, il servizio e tutti i relativi endpoint vengono sincronizzati con la flotta cluster e possono quindi essere usati per configurare il bilanciamento del carico multi-cluster tra questi endpoint. L'output è simile al seguente esempio:

    deployment.apps/kuard created
    service/kuard created
    serviceexport.networking.fleet.azure.com/kuard created
    
  3. Creare il seguente ClusterResourcePlacement in un file denominato crp-2.yaml. Si noti che si stanno selezionando i cluster nell'area eastus:

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

    KUBECONFIG=fleet kubectl apply -f crp-2.yaml
    

    Se va a buon fine, l'output è simile al seguente esempio:

    clusterresourceplacement.placement.kubernetes-fleet.io/kuard-demo created
    
  5. Verificare lo stato di ClusterResourcePlacement:

    KUBECONFIG=fleet kubectl get clusterresourceplacements
    

    Se va a buon fine, l'output è simile al seguente esempio:

    NAME            GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
    kuard-demo      1     True        1              True      1            20s
    

Creare MultiClusterService per bilanciare il carico tra gli endpoint di servizio in più cluster membri

  1. Verificare se il servizio è stato esportato correttamente per i cluster membri nell'area eastus:

    KUBECONFIG=aks-member-1 kubectl get serviceexport kuard --namespace kuard-demo
    

    L'output è simile al seguente esempio:

    NAME    IS-VALID   IS-CONFLICTED   AGE
    kuard   True       False           25s
    
    KUBECONFIG=aks-member-2 kubectl get serviceexport kuard --namespace kuard-demo
    

    L'output è simile al seguente esempio:

    NAME    IS-VALID   IS-CONFLICTED   AGE
    kuard   True       False           55s
    

    Si noterà che il servizio è valido per l'esportazione (il campo IS-VALID è true) e non presenta conflitti con altre esportazioni (IS-CONFLICT è false).

    Nota

    La propagazione di ServiceExport può richiedere un minuto o due.

  2. Creare MultiClusterService in un membro per bilanciare il carico tra gli endpoint di servizio in questi cluster:

    KUBECONFIG=aks-member-1 kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-mcs.yaml
    

    Nota

    Per esporre il servizio tramite l'indirizzo IP interno anziché quello pubblico, aggiungere l'annotazione a MultiClusterService:

    apiVersion: networking.fleet.azure.com/v1alpha1
    kind: MultiClusterService
    metadata:
      name: kuard
      namespace: kuard-demo
      annotations:
         service.beta.kubernetes.io/azure-load-balancer-internal: "true"
      ...
    

    L'output è simile al seguente esempio:

    multiclusterservice.networking.fleet.azure.com/kuard created
    
  3. Verificare che MultiClusterService sia valido eseguendo il comando seguente:

    KUBECONFIG=aks-member-1 kubectl get multiclusterservice kuard --namespace kuard-demo
    

    L'output deve essere simile all'esempio seguente:

    NAME    SERVICE-IMPORT   EXTERNAL-IP     IS-VALID   AGE
    kuard   kuard            <a.b.c.d>       True       40s
    

    Il campo IS-VALID deve essere true nell'output. Vedere l'indirizzo IP del servizio di bilanciamento del carico esterno (EXTERNAL-IP) nell'output. Potrebbe essere necessario un po' di tempo prima che l'importazione venga elaborata completamente e che l'indirizzo IP diventi disponibile.

  4. Eseguire il comando seguente più volte usando l'indirizzo IP del servizio di bilanciamento del carico esterno:

    curl <a.b.c.d>:8080 | grep addrs 
    

    Si noti che gli indirizzi IP dei pod che servono la richiesta stanno cambiando e che questi pod provengono da cluster membri aks-member-1 e aks-member-2 dall'area eastus. È possibile verificare gli indirizzi IP dei pod eseguendo i comandi seguenti nei cluster dall'area eastus:

    KUBECONFIG=aks-member-1 kubectl get pods -n kuard-demo -o wide
    
    KUBECONFIG=aks-member-2 kubectl get pods -n kuard-demo -o wide