Configurare un mesh multi-cloud o ibrido
Questa pagina spiega come configurare un mesh multi-cloud o ibrido per le seguenti piattaforme:
- Ibrido: GKE su Google Cloud e GKE su VMware (anteprima)
- Ibrido: GKE su Google Cloud e GKE su Bare Metal (anteprima)
- Multi-cloud: GKE su Google Cloud e Amazon EKS (anteprima)
Prerequisiti
- Tutti i cluster devono essere registrati nello stesso progetto host del parco risorse.
- Tutti i cluster GKE devono trovarsi in una configurazione VPC condiviso sulla stessa rete.
- L'indirizzo del piano di controllo Kubernetes e l'indirizzo del gateway del cluster devono essere raggiungibili da ogni cluster nel mesh. Il progetto Google Cloud in cui si trovano i cluster GKE deve essere autorizzato a creare tipi di bilanciamento del carico esterno. Ti consigliamo di utilizzare le reti autorizzate e le regole firewall VPC per limitare l'accesso.
- I cluster privati, inclusi i cluster privati GKE, non sono supportati. Se utilizzi cluster on-premise, tra cui GKE su VMware e GKE su Bare Metal, l'indirizzo del piano di controllo Kubernetes e l'indirizzo del gateway devono essere raggiungibili dai pod nei cluster GKE. Ti consigliamo di utilizzare CloudVPN per connettere la subnet del cluster GKE alla rete del cluster on-premise.
- Se utilizzi l'autorità di certificazione Istio, usa lo stesso certificato radice personalizzato per tutti i cluster.
Prima di iniziare
Questa guida presuppone che tu abbia installato Anthos Service Mesh utilizzando lo strumento asmcli
. Devi avere asmcli
e il pacchetto di configurazione che asmcli
scarica nella directory specificata in --output_dir quando hai eseguito asmcli install
. Per ulteriori informazioni, consulta Installare strumenti dipendenti e convalidare il cluster per:
- Installare gli strumenti richiesti
- Scarica asmcli
- Concedi le autorizzazioni di amministratore del cluster
- Convalida il progetto e il cluster
Devi accedere ai file kubeconfig per tutti i cluster che stai configurando nel mesh. Per il cluster GKE, al fine di creare un nuovo file kubeconfig per il cluster, puoi esportare KUBECONFIG
env con il percorso completo del file come valore nel tuo terminale e generare la voce kubeconfig.
Configurazione delle variabili di ambiente e dei segnaposto
Quando installi il gateway est-ovest, sono necessarie le seguenti variabili di ambiente.
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)")
Crea una variabile di ambiente per l'identificatore mesh.
export MESH_ID="proj-${PROJECT_NUMBER}"
Crea variabili di ambiente per i nomi di rete.
Per impostazione predefinita, i cluster GKE utilizzano il nome di rete del cluster:
esportazione NETWORK_1="PROJECT_ID-CLUSTER_NETWORK"
Altri cluster utilizzano
default
:esporta NETWORK_2="valore predefinito"
Tieni presente che se hai installato Anthos Service Mesh su altri cluster con valori diversi per
--network_id
, devi passare gli stessi valori al valore di NETWORK_2.
Installa il gateway est-ovest
Installa un gateway in CLUSTER_1 (il tuo cluster GKE) dedicato al traffico est-ovest verso CLUSTER_2 (il tuo cluster multi-cloud o on-premise):
asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --network ${NETWORK_1} \ --revision asm-1167-22 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 install -y -f -
Tieni presente che questo gateway è pubblico su Internet per impostazione predefinita. I sistemi di produzione potrebbero richiedere limitazioni di accesso aggiuntive, ad esempio regole firewall, per prevenire attacchi esterni.
Installa in CLUSTER_2 un gateway dedicato al traffico da est-ovest per CLUSTER_1.
asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --network ${NETWORK_2} \ --revision asm-1167-22 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 install -y -f -
Esposizione dei servizi
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.
Esponi i servizi tramite il gateway est-ovest per ogni cluster
kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
asm/istio/expansion/expose-services.yaml
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
Individua il valore dell'etichetta della revisione, che utilizzerai nei passaggi successivi.
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
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.
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
Esegui il deployment di
HelloWorld v1
inCLUSTER_1
e div2
inCLUSTER_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
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 fini dimostrativi: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 il servizio HelloWorld
più volte e controlla l'output per verificare
le risposte alternative da v1 e 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 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}