Menyiapkan mesh multi-cluster di luar Google Cloud
Panduan ini menjelaskan cara menyiapkan mesh multi-cluster untuk hal berikut platform:
- Google Distributed Cloud (khusus software) untuk VMware
- Google Distributed Cloud (khusus software) untuk bare metal
- GKE on Azure
- GKE on AWS
- Cluster terpasang, termasuk cluster Amazon EKS dan cluster Microsoft AKS
Panduan ini menunjukkan cara menyiapkan dua klaster, tetapi Anda dapat memperluas proses ini ke menggabungkan sejumlah cluster ke dalam {i>mesh<i} Anda.
Sebelum memulai
Panduan ini mengasumsikan Anda telah menginstal Cloud Service Mesh menggunakan
asmcli install
Anda perlu
asmcli
dan paket konfigurasi yang didownload asmcli
ke
yang Anda tentukan di --output_dir
saat menjalankan asmcli install
.
Jika perlu melakukan penyiapan, ikuti langkah-langkah di
Menginstal alat dependen dan memvalidasi cluster
menjadi:
- Menginstal alat yang diperlukan
- Download
asmcli
- Memberikan izin admin cluster
- Memvalidasi project dan cluster
Anda memerlukan akses ke file {i>kubeconfig<i} untuk semua cluster yang disiapkan di jala.
Menyiapkan placeholder dan variabel lingkungan
Anda memerlukan variabel lingkungan berikut saat menginstal lapisan east-west gateway.
Buat variabel lingkungan untuk nomor project. Dalam , ganti FLEET_PROJECT_ID dengan project ID dari project host perangkat.
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
asmcli
memerlukan.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 dengan menggunakan nilai di bawah kolom
NAME
dalam output perintah ini:kubectl config get-contexts
Menetapkan variabel lingkungan ke nama konteks cluster, yang akan disertakan dalam panduan ini gunakan dalam banyak langkah:
export CTX_1=CLUSTER1_CONTEXT_NAME export CTX_2=CLUSTER2_CONTEXT_NAME
Menginstal gateway east-west
Dalam perintah berikut:
Ganti
CLUSTER_NAME_1
danCLUSTER_NAME_2
dengan nama cluster Anda.Ganti
PATH_TO_KUBECONFIG_1
danPATH_TO_KUBECONFIG_2
dengan file kubeconfig untuk ke cluster Anda.
Cluster Anthos
Mesh CA atau CA Service
Instal gateway di cluster1 yang dikhususkan untuk lalu lintas timur-barat ke
$CLUSTER_2
. Secara default, gateway ini akan bersifat publik di Internet. Sistem produksi mungkin memerlukan batasan akses tambahan, untuk contoh aturan {i>firewall<i}, untuk mencegah serangan eksternal.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Instal gateway di
$CLUSTER_2
yang dikhususkan untuk traffic timur-barat untuk$CLUSTER_1
.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Istio CA
Instal gateway di cluster1 yang dikhususkan untuk lalu lintas timur-barat ke
$CLUSTER_2
. Secara default, gateway ini akan bersifat publik di Internet. Sistem produksi mungkin memerlukan batasan akses tambahan, untuk contoh aturan {i>firewall<i}, untuk mencegah serangan eksternal.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instal gateway di
$CLUSTER_2
yang dikhususkan untuk traffic timur-barat untuk$CLUSTER_1
.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS, & Terlampir
Jaring CA
Instal gateway di cluster1 yang dikhususkan untuk lalu lintas timur-barat ke
$CLUSTER_2
. Secara default, gateway ini akan bersifat publik di Internet. Sistem produksi mungkin memerlukan batasan akses tambahan, untuk contoh aturan {i>firewall<i}, untuk mencegah serangan eksternal.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instal gateway di
$CLUSTER_2
yang dikhususkan untuk traffic timur-barat untuk$CLUSTER_1
.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
Instal gateway di cluster1 yang dikhususkan untuk lalu lintas timur-barat ke
$CLUSTER_2
. Secara default, gateway ini akan bersifat publik di Internet. Sistem produksi mungkin memerlukan batasan akses tambahan, untuk contoh aturan {i>firewall<i}, untuk mencegah serangan eksternal.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instal gateway di
$CLUSTER_2
yang dikhususkan untuk traffic timur-barat untuk$CLUSTER_1
.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1233-2 | \ ./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 perlu mengekspos semua layanan
(*.local
) di gateway timur-barat di kedua cluster. Meskipun gateway ini
publik di Internet, layanan di belakangnya hanya
dapat diakses oleh layanan dengan
sertifikat mTLS yang tepercaya dan ID beban kerja, seolah-olah berada di
jaringan.
Mengekspos 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.yaml
Mengekspos 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. Ini
contoh hanya menunjukkan dua klaster, tetapi Anda dapat menjalankan perintah untuk mengaktifkan
penemuan endpoint pada cluster tambahan,
Batas layanan GKE Hub.
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
Memverifikasi konektivitas multicluster
Bagian ini menjelaskan cara men-deploy contoh layanan HelloWorld
dan Sleep
ke lingkungan multi-cluster Anda untuk memverifikasi bahwa beban lintas cluster
cara kerja balancing.
Aktifkan injeksi file bantuan
Buat namespace contoh di setiap cluster.
for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample done
Aktifkan injeksi file bantuan 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 done
Sebaiknya 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 ini,
REVISION_LABEL
adalah nilai revisiistiod
label yang 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 sample
kubectl 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 v1
keCLUSTER_1
danv2
keCLUSTER_2
, yang nantinya akan membantu memverifikasi load balancing lintas 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
Pastikan
HelloWorld v1
danv2
berjalan menggunakan perintah berikut. Pastikan output mirip dengan yang ditampilkan.: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
Men-deploy layanan Tidur
Deploy layanan
Sleep
ke 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 done
Tunggu hingga layanan
Sleep
dimulai di setiap cluster. Pastikan output mirip dengan yang ditampilkan: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
Memverifikasi load balancing lintas cluster
Panggil layanan HelloWorld
beberapa kali dan periksa outputnya 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
HelloWorld
lagi: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 dengan load balancing.
Pembersihan
Setelah Anda selesai memverifikasi load balancing, hapus HelloWorld
dan Sleep
dari cluster Anda.
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}