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
- Google Distributed Cloud
- GKE su Azure
- GKE su AWS
- Cluster collegati, inclusi i cluster Amazon EKS e i cluster Microsoft AKS
Questa guida mostra come configurare due cluster, ma puoi estendere questo processo a incorporare un numero qualsiasi di cluster nella tua rete mesh.
Prima di iniziare
Questa guida presuppone che tu abbia installato Cloud Service Mesh utilizzando
asmcli install
Ti servono
asmcli
e il pacchetto di configurazione che asmcli
scarica nell'account
che hai specificato in --output_dir
quando hai eseguito asmcli install
.
Se è necessario effettuare la configurazione, segui i passaggi
Installa strumenti dipendenti e convalida il cluster
a:
- Installa gli strumenti necessari
- Scarica
asmcli
- Concedi le autorizzazioni di amministratore del cluster
- Convalida il progetto e il cluster
Devi accedere ai file kubeconfig per tutti i cluster per la configurazione nella mesh.
Configurare variabili di ambiente e segnaposto
Quando installi l'architettura east-west, sono necessarie le seguenti variabili di ambiente gateway VPN ad alta disponibilità.
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)")
Crea una variabile di ambiente per l'identificatore mesh.
export MESH_ID="proj-${PROJECT_NUMBER}"
Crea variabili di ambiente per i nomi dei cluster nel formato Richiede
asmcli
.export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1" export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
Ottieni il nome contesto per i cluster utilizzando i valori nella colonna
NAME
nell'output di questo comando:kubectl config get-contexts
Imposta le variabili di ambiente sui nomi di contesto del cluster, che questa guida 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
eCLUSTER_NAME_2
con i nomi dei tuoi cluster.Sostituisci
PATH_TO_KUBECONFIG_1
ePATH_TO_KUBECONFIG_2
con i file kubeconfig per nei cluster.
Cluster Anthos
Servizio Mesh CA o CA
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-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
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-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
CA Istio
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-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
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-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS e Allegato
CA mesh
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-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
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-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
CA Istio
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-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
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-1232-2 | \ ./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. Mentre questo gateway è
su internet, i servizi sottostanti sono accessibili solo
un certificato mTLS attendibile e un ID carico di lavoro, proprio come se si trovassero sullo stesso indirizzo
in ogni 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.yaml
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 rilevamento endpoint
Esegui il comando asmcli create-mesh
per abilitare il rilevamento degli endpoint. Questo
mostra solo due cluster, ma puoi eseguire il comando per abilitare
il rilevamento degli endpoint su cluster aggiuntivi, in base alle
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
all'ambiente multi-cluster per verificare il carico tra cluster
l'equilibrio.
Attiva inserimento file collaterale
Individua il valore dell'etichetta di revisione, che utilizzerai nei passaggi successivi.
Usa questo comando per individuare l'etichetta di revisione, che dovrai 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 del parametro istiod
etichetta di revisione, 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. Nella questo comando, sostituisci REVISION con
istiod
l'etichetta di revisione annotata 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 precedentemente prendere nota.L'output è:
label "istio-injection" not found. namespace/sample labeled
Puoi ignorare tranquillamente
label "istio-injection" not found.
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
Esegui il deployment di
HelloWorld v1
inCLUSTER_1
e div2
suCLUSTER_2
, che consentono 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
Verifica che
HelloWorld v1
ev2
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
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
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 più volte il servizio HelloWorld
e controlla l'output per verificare
risposte alternate da v1 a v2:
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 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}