Configurazione di un mesh multi-cluster al di fuori di Google Cloud

Questa guida spiega come configurare un mesh multi-cluster per le seguenti piattaforme:

  • GKE su VMware
  • Google Distributed Cloud Virtual for Bare Metal

Questa guida mostra come configurare due cluster, ma puoi estendere questo processo per incorporare un numero qualsiasi di cluster nel tuo mesh.

Prima di iniziare

Questa guida presuppone che tu abbia installato Anthos Service Mesh utilizzando asmcli install. Devi avere asmcli e il pacchetto di configurazione che asmcli scarica nella directory specificata in --output_dir quando hai eseguito asmcli install. Se devi eseguire la configurazione, segui i passaggi descritti in Installare strumenti dipendenti e convalidare il cluster per:

Devi accedere ai file kubeconfig per tutti i cluster che stai configurando nel mesh.

Configurazione delle variabili di ambiente e dei segnaposto

Quando installi il gateway est-ovest, sono necessarie le seguenti variabili di ambiente.

  1. Crea una variabile di ambiente per il numero di progetto. Nel seguente comando, sostituisci FLEET_PROJECT_ID con l'ID progetto del progetto host del parco risorse.

    export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID --format="value(projectNumber)")
    
  2. Crea una variabile di ambiente per l'identificatore mesh.

    export MESH_ID="proj-${PROJECT_NUMBER}"
    
  3. Crea variabili di ambiente per i nomi dei cluster nel formato richiesto da asmcli.

    export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1"
    export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
    
  4. Ottieni il nome del contesto per i cluster utilizzando i valori nella colonna NAME nell'output di questo comando:

    kubectl config get-contexts
  5. Imposta le variabili di ambiente sui nomi di contesto del cluster, che questa guida utilizzerà in molti passaggi successivi:

    export CTX_1=CLUSTER1_CONTEXT_NAME
    export CTX_2=CLUSTER2_CONTEXT_NAME
    

Installa il gateway est-ovest

Nei seguenti comandi:

  • Sostituisci CLUSTER_NAME_1 e CLUSTER_NAME_2 con i nomi dei tuoi cluster.

  • Sostituisci PATH_TO_KUBECONFIG_1 e PATH_TO_KUBECONFIG_2 con i file kubeconfig per i tuoi cluster.

Servizio Mesh CA o CA

  1. Installa un gateway in cluster1 dedicato al traffico est-ovest per $CLUSTER_2. Per impostazione predefinita, questo gateway sarà pubblico su Internet. I sistemi di produzione potrebbero richiedere limitazioni di accesso aggiuntive, ad esempio le regole firewall, per evitare attacchi esterni.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID} \
        --cluster ${CLUSTER_1} \
        --network default \
        --revision asm-1157-23 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
    
  2. Installa in $CLUSTER_2 un gateway dedicato al traffico est-ovest per $CLUSTER_1.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID} \
        --cluster ${CLUSTER_2} \
        --network default \
        --revision asm-1157-23 | \
        ./istioctl install --kubeconfig=PATH_TO_KUBECONFIG_2 -y --set spec.values.global.pilotCertProvider=kubernetes -f -
    

CA Istio

  1. Installa un gateway in cluster1 dedicato al traffico est-ovest per $CLUSTER_2. Per impostazione predefinita, questo gateway sarà pubblico su Internet. I sistemi di produzione potrebbero richiedere limitazioni di accesso aggiuntive, ad esempio le regole firewall, per evitare attacchi esterni.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID} \
        --cluster ${CLUSTER_1} \
        --network default \
        --revision asm-1157-23 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 install -y -f -
    
  2. Installa in $CLUSTER_2 un gateway dedicato al traffico est-ovest per $CLUSTER_1.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID} \
        --cluster ${CLUSTER_2} \
        --network default \
        --revision asm-1157-23 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 install -y -f -
    

Servizi di esposizione

Poiché i cluster si trovano su reti separate, devi esporre tutti i servizi (*.local) sul gateway est-ovest in entrambi i cluster. Sebbene questo gateway sia pubblico su Internet, i servizi sottostanti sono accessibili solo ai servizi con un certificato mTLS attendibile e un ID carico di lavoro, proprio come se si trovassero sulla stessa rete.

  1. Esponi i servizi tramite il gateway est-ovest per CLUSTER_NAME_1.

    kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
        asm/istio/expansion/expose-services.yaml
    
  2. Esponi i servizi tramite il gateway est-ovest per CLUSTER_NAME_2.

    kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \
        asm/istio/expansion/expose-services.yaml
    

Abilita il rilevamento degli endpoint

Esegui il comando asmcli create-mesh per abilitare il rilevamento degli endpoint. Questo esempio mostra solo due cluster, ma puoi eseguire il comando per abilitare il rilevamento degli endpoint su cluster aggiuntivi, in base al limite di servizio GKE Hub.

  ./asmcli create-mesh \
      FLEET_PROJECT_ID \
      PATH_TO_KUBECONFIG_1 \
      PATH_TO_KUBECONFIG_2

Verifica la connettività multicluster

Questa sezione spiega come eseguire il deployment dei servizi HelloWorld e Sleep di esempio nel tuo ambiente multi-cluster per verificare il funzionamento del bilanciamento del carico tra cluster.

Attiva inserimento sidecar

  1. Individua il valore dell'etichetta della revisione, che utilizzerai nei passaggi successivi. Il passaggio dipende dal tipo di Anthos Service Mesh (gestito o nel cluster).

    Gestita

    Utilizza il comando seguente per individuare l'etichetta di revisione, che utilizzerai nei passaggi successivi.

    kubectl get controlplanerevision -n istio-system

    L'output è simile al seguente:

     NAME                RECONCILED   STALLED   AGE
     asm-managed-rapid   True         False     89d
     

    Nell'output, sotto la colonna NAME, prendi nota del valore dell'etichetta di revisione. In questo esempio, il valore è asm-managed-rapid. Utilizza il valore di revisione nei passaggi della sezione successiva.

    Nel cluster

    Utilizza il comando seguente per individuare l'etichetta di revisione, 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

  1. Crea lo spazio dei nomi di esempio e la definizione del servizio in ogni cluster. Nel comando seguente, 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
    done
    

    dove REVISION è l'etichetta di revisione istiod che hai annotato in precedenza.

    L'output è:

    label "istio-injection" not found.
    namespace/sample labeled
    

    Puoi ignorare label "istio-injection" not found.

  2. Crea il servizio HelloWorld in entrambi i cluster:

    kubectl create --context=${CTX_1} \
        -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
        -l service=helloworld -n sample
    
    kubectl create --context=${CTX_2} \
        -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
        -l service=helloworld -n sample
    

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 ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
      -l version=v1 -n sample
    kubectl create --context=${CTX_2} \
      -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
      -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 ${SAMPLES_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:

  1. Chiama il servizio HelloWorld:

    kubectl exec --context="${CTX_1}" -n sample -c sleep \
        "$(kubectl get pod --context="${CTX_1}" -n sample -l \
        app=sleep -o jsonpath='{.items[0].metadata.name}')" \
        -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
    

    L'output è simile a quello mostrato:

    Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
    Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
    ...
  2. Chiama di nuovo il servizio HelloWorld:

    kubectl exec --context="${CTX_2}" -n sample -c sleep \
        "$(kubectl get pod --context="${CTX_2}" -n sample -l \
        app=sleep -o jsonpath='{.items[0].metadata.name}')" \
        -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
    

    L'output è 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

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}