In questo articolo spiegherò passo dopo passo come ho distribuito un service mesh multi-cluster e multi-regione usando Anthos Service Mesh. Durante la mia proof of concept, ho letto la documentazione su https://cloud.google.com/service-mesh/docs/install, ma nessuna delle guide copriva esattamente i miei requisiti, che sono:
Service mesh multi-cluster e multi-regione
Piano di controllo Istio gestito da Google (per maggiore resilienza e per minimizzare il mio intervento)
Certificati CA gestiti da Google per Istio mTLS
Distribuire i cluster GKE
Distribuisci i due cluster GKE. Li ho chiamati asm-a e asm-b (più facili da ricordare) e li ho distribuiti in due regioni diverse (us-west2-a e us-central1-a). Poiché Anthos Service Mesh richiede nodi con almeno 4 vCPU (e alcuni altri requisiti, vedi la lista completa su: https://cloud.google.com/service-mesh/docs/scripted-install/asm-onboarding), usa almeno le macchine e2-standard-4.
Come preparazione, archivia il Project ID di Google Cloud in una variabile d'ambiente in modo che i comandi successivi possano essere copiati e incollati direttamente.
export PROJECT_ID=$(gcloud info --format='value(config.project)')Poi, per distribuire i cluster, esegui:
gcloud container clusters create asm-a --zone us-west2-a --machine-type "e2-standard-4" --disk-size "100" --num-nodes "2" --workload-pool=${PROJECT_ID}.svc.id.goog --async
gcloud container clusters create asm-b --zone us-central1-a --machine-type "e2-standard-4" --disk-size "100" --num-nodes "2" --workload-pool=${PROJECT_ID}.svc.id.goog --asyncI comandi abilitano anche la Workload Identity, su cui puoi leggere di più su: https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity.
Recuperare le credenziali per i cluster
Una volta creati i cluster, recupera le credenziali necessarie per connetterti ad essi tramite kubectl. Usa i seguenti comandi:
gcloud container clusters get-credentials asm-a --zone us-west2-a --project ${PROJECT_ID}
gcloud container clusters get-credentials asm-b --zone us-central1-a --project ${PROJECT_ID}Cambiare contesto kubectl facilmente con kubectx
kubectx rende semplice passare tra cluster e namespace in kubectl (noto anche come context) creando un alias memorabile per ciascuno di essi (in questo caso, asma e asmb). Scopri di più sullo strumento su: https://github.com/ahmetb/kubectx.
kubectx asma=gke_${PROJECT_ID}_us-west2-a_asm-a
kubectx asmb=gke_${PROJECT_ID}_us-central1-a_asm-bImpostare il label Mesh ID per i cluster
Imposta il label mesh_id sui cluster prima di installare Anthos Service Mesh, necessario affinché Anthos possa identificare quali cluster appartengono a quale mesh. Il mesh_id è sempre nel formato proj-<numero-progetto>, e il numero di progetto può essere trovato eseguendo:
gcloud projects listUsa questi comandi per creare il label mesh_id su entrambi i cluster (sostituisci <your-project-number> con il numero di progetto trovato con il comando precedente):
export MESH_ID="proj-<your-project-number>"
gcloud container clusters update asm-a --region us-west2-a --project=${PROJECT_ID} --update-labels=mesh_id=${MESH_ID}
gcloud container clusters update asm-b --region us-central1-a --project=${PROJECT_ID} --update-labels=mesh_id=${MESH_ID}Abilitare StackDriver
Abilita StackDriver sui cluster per poter vedere i log in caso di problemi durante la configurazione!
gcloud container clusters update asm-a --region us-west2-a --project=${PROJECT_ID} --enable-stackdriver-kubernetes
gcloud container clusters update asm-b --region us-central1-a --project=${PROJECT_ID} --enable-stackdriver-kubernetesCreare regole firewall per la comunicazione inter-regione
I cluster si trovano in regioni diverse, quindi è necessario creare una nuova regola firewall per consentire la comunicazione tra di loro e i loro pod. Preparati a un po' di Bash!
ASMA_POD_CIDR=$(gcloud container clusters describe asm-a --zone us-west2-a --format=json | jq -r '.clusterIpv4Cidr')
ASMB_POD_CIDR=$(gcloud container clusters describe asm-b --zone us-central1-a --format=json | jq -r '.clusterIpv4Cidr')
ASMA_PRIMARY_CIDR=$(gcloud compute networks subnets describe default --region=us-west2 --format=json | jq -r '.ipCidrRange')
ASMB_PRIMARY_CIDR=$(gcloud compute networks subnets describe default --region=us-central1 --format=json | jq -r '.ipCidrRange')
ALL_CLUSTER_CIDRS=$ASMA_POD_CIDR,$ASMB_POD_CIDR,$ASMA_PRIMARY_CIDR,$ASMB_PRIMARY_CIDR
gcloud compute firewall-rules create asm-multicluster-rule \
--allow=tcp,udp,icmp,esp,ah,sctp \
--direction=INGRESS \
--priority=900 \
--source-ranges="${ALL_CLUSTER_CIDRS}" \
--target-tags="${ALL_CLUSTER_NETTAGS}" --quietInstallare Anthos Service Mesh
Prima di tutto, installa gli strumenti locali richiesti come spiegato qui: https://cloud.google.com/service-mesh/docs/scripted-install/asm-onboarding#installing\_required\_tools.
Lo strumento install_asm installerà Anthos Service Mesh sui cluster. Passa queste opzioni per soddisfare i requisiti iniziali:
--managed: Piano di controllo Istio gestito da Google--ca mesh_ca: Certificati CA gestiti da Google per Istio mTLS--enable_registration: registra automaticamente i cluster con Anthos (può essere fatto anche manualmente in seguito)--enable_all: tutte le API Google richieste dall'installazione verranno abilitate automaticamente dallo script
./install_asm --project_id ${PROJECT_ID} --cluster_name asm-a --cluster_location us-west2-a --mode install --managed --ca mesh_ca --output_dir asma --enable_registration --enable_all
./install_asm --project_id ${PROJECT_ID} --cluster_name asm-b --cluster_location us-central1-a --mode install --managed --ca mesh_ca --output_dir asmb --enable_registration --enable_allConfigurare la scoperta degli endpoint tra i cluster
La scoperta degli endpoint consente ai cluster di comunicare tra loro, ad esempio abilita la scoperta degli endpoint dei servizi tra i cluster.
Installa gli strumenti locali richiesti come spiegato qui: https://cloud.google.com/service-mesh/docs/downloading-istioctl, poi esegui i seguenti comandi:
istioctl x create-remote-secret --context=asma --name=asm-a| kubectl apply -f - --context=asmb
istioctl x create-remote-secret --context=asmb --name=asm-b| kubectl apply -f - --context=asmaTestare il service mesh
Anthos Service Mesh è ora pronto! Distribuiamo un'applicazione di esempio per verificare il traffico cross-cluster e i failover.
Creare il namespace per l'app Hello World
Crea un nuovo namespace su entrambi i cluster e abilita l'iniezione automatica del sidecar Istio per entrambi. Poiché il piano di controllo Istio è gestito da Google, il label istio-injection- istio.io/rev= viene impostato su asm-managed.
kubectl create --context=asma namespace sample
kubectl label --context=asma namespace sample istio-injection- istio.io/rev=asm-managed --overwrite
kubectl create --context=asmb namespace sample
kubectl label --context=asmb namespace sample istio-injection- istio.io/rev=asm-managed --overwriteCreare il servizio Hello World
Distribuisci i servizi per l'app Hello World su entrambi i cluster con:
kubectl create --context=asma -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/helloworld/helloworld.yaml -l service=helloworld -n sample
kubectl create --context=asmb -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/helloworld/helloworld.yaml -l service=helloworld -n sampleCreare il deployment Hello World
Distribuisci l'app di esempio Hello World, che fornisce un endpoint che restituirà il numero di versione dell'applicazione (il numero di versione è diverso nei due cluster) e un messaggio Hello World come accompagnamento.
kubectl create --context=asma -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/helloworld/helloworld.yaml -l version=v1 -n sample
kubectl create --context=asmb -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/helloworld/helloworld.yaml -l version=v2 -n sampleDistribuire il pod Sleep
L'applicazione Sleep simula un'interruzione del servizio. Usiamola per testare la resilienza del service mesh! Per distribuire l'applicazione Sleep, usa:
kubectl apply --context=asma -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/sleep/sleep.yaml -n sample
kubectl apply --context=asmb -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/sleep/sleep.yaml -n sampleVerificare il traffico cross-cluster
Per verificare che il load balancing cross-cluster funzioni come previsto (in altre parole: il service mesh riesce a sopravvivere a un guasto regionale?), chiama il servizio HelloWorld più volte usando il pod Sleep. Per assicurarti che il load balancing funzioni correttamente, chiama il servizio HelloWorld da tutti i cluster nel tuo deployment.
kubectl exec --context=asma -n sample -c sleep "$(kubectl get pod --context=asma -n sample -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- curl -sS helloworld.sample:5000/hello
kubectl exec --context=asmb -n sample -c sleep "$(kubectl get pod --context=asmb -n sample -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- curl -sS helloworld.sample:5000/helloRipeti questa richiesta più volte e verifica che la versione di HelloWorld alterni tra v1 e v2. Ciò significa che la richiesta viene indirizzata al cluster sano quando l'altro non risponde!
Riepilogo
In questo articolo ho spiegato come ho distribuito Anthos Service Mesh su due cluster GKE in regioni diverse, con piano di controllo Istio e certificati CA gestiti da Google. Anthos Service Mesh semplifica la distribuzione di un service mesh multi-cluster perché la maggior parte della complessità di Istio è ora gestita da Google.
lucavallin

