Aggiunta di cluster a Anthos Service Mesh

Questa guida spiega come unire due cluster in un singolo Anthos Service Mesh utilizzando Mesh CA o Citadel e come abilitare il bilanciamento del carico tra cluster. Puoi estendere facilmente questo processo per incorporare un numero qualsiasi di cluster nel tuo mesh.

Una configurazione multi-cluster Anthos Service Mesh può risolvere diversi scenari aziendali cruciali, come scalabilità, località e isolamento. Per maggiori informazioni, consulta Casi d'uso multi-cluster. Inoltre, devi ottimizzare le applicazioni per ottenere il massimo da un mesh di servizi. Per ulteriori informazioni, consulta Preparazione di un'applicazione per Anthos Service Mesh.

Prerequisiti

Questa guida presuppone che tu disponga di due o più cluster Google Cloud GKE che soddisfano i seguenti requisiti:

  • Anthos Service Mesh 1.6.8 o versioni successive installato sui cluster. Vedi Panoramica dell'installazione per installare o eseguire l'upgrade dei cluster alla versione richiesta.
  • Se unisci cluster che non sono nello stesso progetto, devono essere installati utilizzando il profilo asm-gcp-multiproject e i cluster devono trovarsi insieme in una configurazione VPC condiviso sulla stessa rete. Inoltre, ti consigliamo di avere un progetto per l'hosting del VPC condiviso e due progetti di servizio per la creazione dei cluster. Per ulteriori informazioni, consulta Configurazione di cluster con VPC condiviso.
  • Se utilizzi Citadel CA, utilizza la stessa CA radice personalizzata per entrambi i cluster.

Impostazione delle variabili di progetto e cluster

  1. Per praticità, imposta una cartella di lavoro. Questa è la cartella in cui hai scaricato ed estratto i file Anthos Service Mesh nel passaggio del prerequisito, Preparazione all'installazione di Anthos Service Mesh.

    export PROJECT_DIR=YOUR_WORKING_FOLDER
  2. Crea una variabile di contesto per ogni cluster. Il contesto è una stringa creata da ID progetto cluster, nomi cluster e località. Per i valori della località, utilizza la località del cluster, ad esempio us-west2-a. In questo esempio, un mesh contiene già un cluster e ne stai aggiungendo un altro:

    export CTX_1=gke_CLUSTER_1_PROJECT_ID_CLUSTER_1_LOCATION_CLUSTER_1_NAME
    export CTX_2=gke_CLUSTER_2_PROJECT_ID_CLUSTER_2_LOCATION_CLUSTER_2_NAME

Configura il rilevamento degli endpoint tra i cluster

Configura il rilevamento degli endpoint per il bilanciamento del carico tra cluster utilizzando i comandi seguenti. Questo passaggio esegue le seguenti attività:

  • Il comando istioctl crea un secret che concede l'accesso al server API Kube per un cluster.
  • Il comando kubectl applica il secret a un altro cluster, in modo che il secondo cluster possa leggere gli endpoint di servizio del primo.
istioctl x create-remote-secret --context=${CTX_1} --name=${CLUSTER_1_NAME} | \
  kubectl apply -f - --context=${CTX_2}
istioctl x create-remote-secret --context=${CTX_2} --name=${CLUSTER_2_NAME} | \
  kubectl apply -f - --context=${CTX_1}

Verifica il deployment

Questa sezione spiega come eseguire il deployment di un servizio HelloWorld di esempio nel tuo ambiente multi-cluster per verificare che il bilanciamento del carico tra cluster funzioni.

Attiva inserimento sidecar

  1. Utilizza il seguente comando per individuare il valore dell'etichetta di revisione dal servizio istiod, che utilizzerai nei passaggi successivi.

    kubectl -n istio-system get pods -l app=istiod --show-labels

    L'output è simile al seguente:

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-173-3-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-173-3-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586

    Nell'output, sotto la colonna LABELS, prendi nota del valore dell'etichetta di revisione istiod, che segue il prefisso istio.io/rev=. In questo esempio, il valore è asm-173-3. Utilizza il valore della revisione nei passaggi della sezione successiva.

Installa il servizio HelloWorld

Crea lo spazio dei nomi di esempio e la definizione del servizio in ogni cluster. Nel seguente comando, sostituisci REVISION con l'etichetta di revisione istiod che hai annotato nel passaggio precedente.

for CTX in ${CTX_1} ${CTX_2}
  do
    kubectl create --context=${CTX} namespace sample
    kubectl label --context=${CTX} namespace sample \
      istio-injection- istio.io/rev=REVISION --overwrite
    kubectl create --context=${CTX} \
      -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \
      -l app=helloworld -n sample
  done

Esegui il deployment di HelloWorld v1 e v2 in ciascun cluster

  1. Esegui il deployment di HelloWorld v1 in CLUSTER_1 e di v2 in CLUSTER_2, che consente di verificare in un secondo momento il bilanciamento del carico tra cluster:

    kubectl create --context=${CTX_1} \
      -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \
      -l app=helloworld -l version=v1 -n sample
    kubectl create --context=${CTX_2} \
      -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \
      -l app=helloworld -l version=v2 -n sample
  2. Verifica che HelloWorld v1 e v2 siano in esecuzione utilizzando i seguenti comandi. Verifica che l'output sia simile a quello mostrato:

    kubectl get pod --context=${CTX_1} -n sample
    NAME                            READY     STATUS    RESTARTS   AGE
    helloworld-v1-86f77cd7bd-cpxhv  2/2       Running   0          40s
    kubectl get pod --context=${CTX_2} -n sample
    NAME                            READY     STATUS    RESTARTS   AGE
    helloworld-v2-758dd55874-6x4t8  2/2       Running   0          40s

Esegui il deployment del servizio Sleep

  1. Esegui il deployment del servizio Sleep in entrambi i cluster. Questo pod genera traffico di rete artificiale a fini dimostrativi:

    for CTX in ${CTX_1} ${CTX_2}
      do
        kubectl apply --context=${CTX} \
          -f ${PROJECT_DIR}/samples/sleep/sleep.yaml -n sample
      done
  2. Attendi l'avvio del servizio Sleep in ogni cluster. Verifica che l'output sia simile a quello mostrato:

    kubectl get pod --context=${CTX_1} -n sample -l app=sleep
    NAME                             READY   STATUS    RESTARTS   AGE
    sleep-754684654f-n6bzf           2/2     Running   0          5s
    kubectl get pod --context=${CTX_2} -n sample -l app=sleep
    NAME                             READY   STATUS    RESTARTS   AGE
    sleep-754684654f-dzl9j           2/2     Running   0          5s

Verifica il bilanciamento del carico tra cluster

Chiama il servizio HelloWorld più volte e controlla l'output per verificare le risposte alternative da v1 e v2:

kubectl exec --context=${CTX_1} -it -n sample -c sleep \
   $(kubectl get pod --context=${CTX_1} -n sample -l \
   app=sleep -o jsonpath='{.items[0].metadata.name}') -- curl \
   helloworld.sample:5000/hello
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
...
kubectl exec --context=${CTX_2} -it -n sample -c sleep \
   $(kubectl get pod --context=${CTX_2} -n sample -l \
   app=sleep -o jsonpath='{.items[0].metadata.name}') -- curl \
   helloworld.sample:5000/hello

Verifica che l'output sia simile a quello mostrato:

Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
...

Congratulazioni, hai verificato il tuo Anthos Service Mesh multi-cluster con bilanciamento del carico.

Esegui la pulizia del servizio HelloWorld

Al termine della verifica del bilanciamento del carico, rimuovi il servizio HelloWorld e Sleep dal cluster.

kubectl delete ns sample --context ${CTX_1}
kubectl delete ns sample --context ${CTX_2}