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

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

  • Google Distributed Cloud (solo software) per VMware
  • Google Distributed Cloud (solo software) per bare metal
  • GKE su Azure
  • GKE su AWS
  • Cluster collegati, inclusi i cluster Amazon EKS e Microsoft AKS

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

Prima di iniziare

Questa guida presuppone che tu abbia installato Cloud Service Mesh utilizzando asmcli install. Devi avere asmcli e il pacchetto di configurazione scaricato da asmcli nella directory specificata in --output_dir quando hai eseguito asmcli install. Se è necessario effettuare la configurazione, segui i passaggi Installa strumenti dipendenti e convalida il cluster a:

Devi accedere ai file kubeconfig per tutti i cluster per la configurazione nella mesh.

Configura le variabili di ambiente e i segnaposto

Quando installi l'architettura east-west, sono necessarie le seguenti variabili di ambiente gateway VPN ad alta disponibilità.

  1. Crea una variabile di ambiente per il numero del progetto. Nel seguente sostituisci FLEET_PROJECT_ID con l'ID progetto 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 dei contesti del cluster, che questa guida utilizza 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 nei cluster.

Cluster Anthos

Mesh CA o CA Service

  1. Installa un gateway nel cluster1 dedicato al traffico est-ovest verso $CLUSTER_2. Per impostazione predefinita, questo gateway sarà pubblico su internet. I sistemi di produzione potrebbero richiedere ulteriori restrizioni di accesso, ad esempio regole firewall, per impedire attacchi esterni.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1225-1 | \
        ./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-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
    

CA Istio

  1. Installa un gateway nel cluster1 dedicato al traffico est-ovest verso $CLUSTER_2. Per impostazione predefinita, questo gateway sarà pubblico su internet. I sistemi di produzione potrebbero richiedere ulteriori restrizioni di accesso, ad esempio regole firewall, per impedire attacchi esterni.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -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-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Azure, AWS e collegati

Mesh CA

  1. Installa un gateway nel cluster1 dedicato traffico est-ovest a $CLUSTER_2. Per impostazione predefinita, questo gateway sarà pubblico su internet. I sistemi di produzione potrebbero richiedere ulteriori restrizioni di accesso, ad esempio regole firewall, per impedire attacchi esterni.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -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-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

CA Istio

  1. Installa un gateway nel cluster1 dedicato traffico est-ovest a $CLUSTER_2. Per impostazione predefinita, questo gateway sarà pubblico su internet. I sistemi di produzione potrebbero richiedere ulteriori limitazioni di accesso, di regole firewall di esempio per prevenire attacchi esterni.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -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-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -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 che si trovano dietro possono essere raggiunti solo da servizi con un certificato mTLS attendibile e un ID carico di lavoro, proprio come se si trovassero nella 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
    

Attivare 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 attivare la scoperta degli endpoint su altri cluster, rispettando il limite del servizio GKE Hub.

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

Verificare la connettività multicluster

Questa sezione spiega come eseguire il deployment dei servizi HelloWorld e Sleep di esempio all'ambiente multi-cluster per verificare il carico tra cluster l'equilibrio.

Attiva l'iniezione di sidecar

  1. Crea lo spazio dei nomi di esempio in ogni cluster.

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl create --context=${CTX} namespace sample
    done
    
  2. Attiva l'inserimento di file collaterali negli spazi dei nomi creati.

    Consigliato: esegui il seguente comando per applicare l'etichetta di inserimento predefinita allo spazio dei nomi:

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl label --context=${CTX} namespace sample \
            istio.io/rev- istio-injection=enabled --overwrite
    done
    

    Consigliamo di utilizzare l'inserimento predefinito, ma l'inserimento basato sulle revisioni è supportato: Segui queste istruzioni:

    1. Utilizza il seguente comando per individuare l'etichetta di revisione su istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
          jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Applica l'etichetta di revisione allo spazio dei nomi. Nel comando seguente, REVISION_LABEL è il valore della revisione istiod che hai annotato nel passaggio precedente.

      for CTX in ${CTX_1} ${CTX_2}
      do
          kubectl label --context=${CTX} namespace sample \
              istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      done
      

Installa il servizio HelloWorld

  • 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 ogni cluster

  1. Esegui il deployment di HelloWorld v1 in CLUSTER_1 e di v2 in CLUSTER_2, il che ti aiuterà in un secondo momento a verificare 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 scopo dimostrativo:

    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

Verificare il bilanciamento del carico tra cluster

Chiama più volte il servizio HelloWorld e controlla l'output per verificare risposte alternate da v1 a 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 mesh di servizi Cloud multi-cluster con bilanciamento del carico.

Esegui la pulizia

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

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