Configura un mesh multi-cluster al di fuori di Google Cloud
Questa guida spiega come configurare un mesh multi-cluster per le piattaforme seguenti:
- 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 questo processo per incorporare qualsiasi numero 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 che asmcli scarica nella directory specificata in --output_dir quando hai eseguito asmcli install.
Se devi eseguire la configurazione, segui i passaggi descritti in Installa strumenti dipendenti e convalida il cluster per:
- Installare gli strumenti richiesti
- Scaricare
asmcli - Concedere le autorizzazioni amministrative del cluster
- Convalidare il progetto e il cluster
Devi avere accesso ai file kubeconfig per tutti i cluster che stai configurando nel mesh.
Configura le variabili di ambiente e i segnaposto
Quando installi il gateway est-ovest, hai bisogno delle seguenti variabili di ambiente.
Crea una variabile di ambiente per il numero di progetto. Nel comando seguente, 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)")Crea una variabile di ambiente per l'identificatore del mesh.
export MESH_ID="proj-${PROJECT_NUMBER}"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"Recupera il nome del contesto per i cluster utilizzando i valori nella colonna
NAMEnell'output di questo comando:kubectl config get-contexts
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_1eCLUSTER_NAME_2con i nomi dei tuoi cluster.Sostituisci
PATH_TO_KUBECONFIG_1ePATH_TO_KUBECONFIG_2con i file kubeconfig per i tuoi cluster.
Cluster Anthos
CA mesh o servizio CA
Installa un gateway in cluster1 dedicato al 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, 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-1215-34 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -Installa un gateway in
$CLUSTER_2dedicato al traffico est-ovest per$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1215-34 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
CA Istio
Installa un gateway in cluster1 dedicato al 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, 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-1215-34 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -Installa un gateway in
$CLUSTER_2dedicato al traffico est-ovest per$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1215-34 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS e collegati
CA mesh
Installa un gateway in cluster1 dedicato al 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, 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-1215-34 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -Installa un gateway in
$CLUSTER_2dedicato al traffico est-ovest per$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1215-34 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
CA Istio
Installa un gateway in cluster1 dedicato al 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, 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-1215-34 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -Installa un gateway in
$CLUSTER_2dedicato al traffico est-ovest per$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1215-34 | \ ./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 accessibili solo da servizi con un certificato mTLS e un ID workload attendibili, proprio come se si trovassero sulla stessa rete.
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.yamlEsponi 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 di GKE Hub.
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
Verifica la connettività multi-cluster
Questa sezione spiega come eseguire il deployment dei servizi HelloWorld e Sleep di esempio nell'ambiente multi-cluster per verificare che il bilanciamento del carico tra cluster funzioni.
Abilita l'inserimento di sidecar
Crea lo spazio dei nomi di esempio in ogni cluster.
for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample doneAbilita l'inserimento di sidecar negli spazi dei nomi creati.
Consigliato: esegui questo 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 doneTi consigliamo di utilizzare l'inserimento predefinito, ma è supportato anche l'inserimento basato sulla revisione: Segui queste istruzioni:
Utilizza il comando seguente per individuare l'etichetta della revisione su
istiod:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'Applica l'etichetta di revisione allo spazio dei nomi. Nel comando seguente,
REVISION_LABELè il valore dell'etichetta di revisioneistiodche 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 samplekubectl 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
Esegui il deployment di
HelloWorld v1suCLUSTER_1e div2suCLUSTER_2. Questa operazione 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 samplekubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sampleVerifica che
HelloWorld v1ev2siano in esecuzione utilizzando i comandi seguenti. Verifica che l'output sia simile a quello mostrato:kubectl get pod --context=${CTX_1} -n sampleNAME READY STATUS RESTARTS AGE helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
kubectl get pod --context=${CTX_2} -n sampleNAME READY STATUS RESTARTS AGE helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
Esegui il deployment del servizio Sleep
Esegui il deployment del servizio
Sleepin 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 doneAttendi l'avvio del servizio
Sleepin ogni cluster. Verifica che l'output sia simile a quello mostrato:kubectl get pod --context=${CTX_1} -n sample -l app=sleepNAME READY STATUS RESTARTS AGE sleep-754684654f-n6bzf 2/2 Running 0 5s
kubectl get pod --context=${CTX_2} -n sample -l app=sleepNAME 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 la presenza di risposte alternate dalle versioni 1 e 2:
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 ...
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 Cloud Service Mesh multi-cluster con bilanciamento del carico.
Esegui la pulizia
Al termine della verifica del bilanciamento del carico, rimuovi i servizi HelloWorld e Sleep dal cluster.
kubectl delete ns sample --context ${CTX_1}
kubectl delete ns sample --context ${CTX_2}