Menyiapkan mesh multi-cluster di luar Google Cloud
Panduan ini hanya mendukung Cloud Service Mesh dengan Istio API dan tidak mendukung API. Google Cloud Untuk mengetahui informasi selengkapnya, lihat Ringkasan Cloud Service Mesh.Panduan ini menjelaskan cara menyiapkan mesh multi-cluster untuk platform berikut:
- Google Distributed Cloud (khusus software) untuk VMware
- Google Distributed Cloud (khusus software) untuk bare metal
- GKE di Azure (tidak digunakan lagi)
- GKE di AWS (tidak digunakan lagi)
- Cluster terlampir, termasuk cluster Amazon EKS dan cluster Microsoft AKS (tidak digunakan lagi)
Panduan ini menunjukkan cara menyiapkan dua cluster, tetapi Anda dapat memperluas proses ini untuk menggabungkan sejumlah cluster ke dalam mesh.
Sebelum memulai
Panduan ini mengasumsikan bahwa Anda telah menginstal Cloud Service Mesh menggunakan
asmcli install. Anda memerlukan
asmcli dan paket konfigurasi yang asmcli didownload ke
direktori yang Anda tentukan di --output_dir saat menjalankan asmcli install.
Jika perlu menyiapkan, ikuti langkah-langkah di
Menginstal alat dependen dan memvalidasi cluster
untuk:
- Menginstal alat yang diperlukan
- Mendownload
asmcli - Memberikan izin admin cluster
- Memvalidasi project dan cluster Anda
Anda memerlukan akses ke file kubeconfig untuk semua cluster yang Anda siapkan di mesh.
Menyiapkan variabel lingkungan dan placeholder
Anda memerlukan variabel lingkungan berikut saat menginstal gateway timur-barat.
Buat variabel lingkungan untuk nomor project. Pada perintah berikut, ganti FLEET_PROJECT_ID dengan project ID project host fleet.
export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)")Buat variabel lingkungan untuk ID mesh.
export MESH_ID="proj-${PROJECT_NUMBER}"Buat variabel lingkungan untuk nama cluster dalam format yang diperlukan
asmcli.export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1" export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"Dapatkan nama konteks untuk cluster menggunakan nilai di kolom
NAMEdalam output perintah ini:kubectl config get-contexts
Tetapkan variabel lingkungan ke nama konteks cluster, yang digunakan panduan ini di banyak langkah nanti:
export CTX_1=CLUSTER1_CONTEXT_NAME export CTX_2=CLUSTER2_CONTEXT_NAME
Menginstal gateway timur-barat
Dalam perintah berikut:
Ganti
CLUSTER_NAME_1danCLUSTER_NAME_2dengan nama cluster Anda.Ganti
PATH_TO_KUBECONFIG_1danPATH_TO_KUBECONFIG_2dengan file kubeconfig untuk cluster Anda.
Cluster GKE
Mesh CA atau CA Service
Instal gateway di cluster1 yang didedikasikan untuk traffic timur-barat ke
$CLUSTER_2. Secara default, gateway ini akan bersifat publik di Internet. Sistem produksi mungkin memerlukan batasan akses tambahan, misalnya aturan firewall, untuk mencegah serangan eksternal.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1287-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -Instal gateway di
$CLUSTER_2yang didedikasikan untuk traffic timur-barat untuk$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1287-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
CA Istio
Instal gateway di cluster1 yang didedikasikan untuk traffic timur-barat ke
$CLUSTER_2. Secara default, gateway ini akan bersifat publik di Internet. Sistem produksi mungkin memerlukan batasan akses tambahan, misalnya aturan firewall, untuk mencegah serangan eksternal.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1287-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -Instal gateway di
$CLUSTER_2yang didedikasikan untuk traffic timur-barat untuk$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1287-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS, &Terlampir
Mesh CA
Instal gateway di cluster1 yang didedikasikan untuk traffic timur-barat ke
$CLUSTER_2. Secara default, gateway ini akan bersifat publik di Internet. Sistem produksi mungkin memerlukan batasan akses tambahan, misalnya aturan firewall, untuk mencegah serangan eksternal.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1287-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -Instal gateway di
$CLUSTER_2yang didedikasikan untuk traffic timur-barat untuk$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1287-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
CA Istio
Instal gateway di cluster1 yang didedikasikan untuk traffic timur-barat ke
$CLUSTER_2. Secara default, gateway ini akan bersifat publik di Internet. Sistem produksi mungkin memerlukan batasan akses tambahan, misalnya aturan firewall, untuk mencegah serangan eksternal.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1287-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -Instal gateway di
$CLUSTER_2yang didedikasikan untuk traffic timur-barat untuk$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1287-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Layanan yang menampakkan
Karena cluster berada di jaringan terpisah, Anda harus mengekspos semua layanan (*.local) di gateway timur-barat di kedua cluster. Meskipun gateway ini bersifat publik di Internet, layanan di baliknya hanya dapat diakses oleh layanan dengan sertifikat mTLS tepercaya dan ID beban kerja, sama seperti jika berada di jaringan yang sama.
Ekspos layanan melalui gateway timur-barat untuk
CLUSTER_NAME_1.kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \ asm/istio/expansion/expose-services.yamlEkspos layanan melalui gateway timur-barat untuk
CLUSTER_NAME_2.kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
Mengaktifkan penemuan endpoint
Jalankan perintah asmcli create-mesh untuk mengaktifkan penemuan endpoint. Contoh
ini hanya menampilkan dua cluster, tetapi Anda dapat menjalankan perintah untuk mengaktifkan
penemuan endpoint di cluster tambahan, yang tunduk pada
batas layanan GKE Hub.
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
Memverifikasi konektivitas multi-cluster
Bagian ini menjelaskan cara men-deploy contoh layanan HelloWorld dan Sleep ke lingkungan multi-cluster Anda untuk memverifikasi bahwa load balancing lintas cluster berfungsi.
Mengaktifkan injeksi sidecar
Buat namespace contoh di setiap cluster.
for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample doneAktifkan injeksi sidecar pada namespace yang dibuat.
Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:
for CTX in ${CTX_1} ${CTX_2} do kubectl label --context=${CTX} namespace sample \ istio.io/rev- istio-injection=enabled --overwrite doneSebaiknya gunakan injeksi default, tetapi injeksi berbasis revisi didukung: Gunakan petunjuk berikut:
Gunakan perintah berikut untuk menemukan label revisi di
istiod:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'Terapkan label revisi ke namespace. Dalam perintah berikut,
REVISION_LABELadalah nilai label revisiistiodyang Anda catat pada langkah sebelumnya.for CTX in ${CTX_1} ${CTX_2} do kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite done
Menginstal layanan HelloWorld
Buat layanan HelloWorld di kedua 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
Men-deploy HelloWorld v1 dan v2 ke setiap cluster
Deploy
HelloWorld v1keCLUSTER_1danv2keCLUSTER_2, yang akan membantu memverifikasi load balancing lintas cluster nanti: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 sampleKonfirmasi bahwa
HelloWorld v1danv2berjalan menggunakan perintah berikut. Pastikan outputnya mirip dengan yang ditampilkan.: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
Men-deploy layanan Sleep
Deploy layanan
Sleepke kedua cluster. Pod ini menghasilkan traffic jaringan buatan untuk tujuan demonstrasi:for CTX in ${CTX_1} ${CTX_2} do kubectl apply --context=${CTX} \ -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample doneTunggu hingga layanan
Sleepdimulai di setiap cluster. Pastikan outputnya mirip dengan yang ditampilkan: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
Memverifikasi load balancing lintas cluster
Panggil layanan HelloWorld beberapa kali dan periksa output untuk memverifikasi balasan alternatif dari v1 dan v2:
Panggil layanan
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'Outputnya mirip dengan yang ditampilkan:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Panggil layanan
HelloWorldlagi: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'Outputnya mirip dengan yang ditampilkan:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Selamat, Anda telah memverifikasi Cloud Service Mesh multi-cluster yang di-load balance.
Pembersihan
Setelah selesai memverifikasi load balancing, hapus layanan HelloWorld dan Sleep dari cluster Anda.
kubectl delete ns sample --context ${CTX_1}
kubectl delete ns sample --context ${CTX_2}