Menyiapkan mesh multi-cluster di GKE
Panduan ini menjelaskan cara menggabungkan dua cluster menjadi satu Cloud Service Mesh menggunakan Mesh CA atau Istio CA, dan mengaktifkan load balancing lintas cluster. Anda dapat dengan mudah memperluas proses ini untuk menggabungkan sejumlah klaster ke dalam {i>mesh<i} Anda.
Konfigurasi Cloud Service Mesh multi-cluster dapat menyelesaikan berbagai masalah yang berbeda, seperti skala, lokasi, dan isolasi. Untuk informasi selengkapnya, lihat Kasus penggunaan multi-cluster.
Prasyarat
Panduan ini mengasumsikan bahwa Anda memiliki dua atau lebih Google Cloud Cluster GKE yang memenuhi persyaratan berikut:
Cloud Service Mesh versi 1.11 atau yang lebih baru yang diinstal pada cluster menggunakan
asmcli install
Anda perluasmcli
, alatistioctl
, dan contoh yang didownloadasmcli
ke yang Anda tentukan di--output_dir
saat menjalankanasmcli install
Jika perlu melakukan penyiapan, ikuti langkah-langkah di Menginstal alat dependen dan memvalidasi cluster menjadi:Cluster di mesh harus memiliki konektivitas antara semua pod sebelum Anda dan mengonfigurasi Cloud Service Mesh. Selain itu, jika Anda bergabung dengan cluster yang tidak dalam proyek yang sama, mereka harus didaftarkan ke project host perangkat, dan cluster harus berada dalam konfigurasi VPC bersama bersama-sama pada jaringan yang sama. Kami juga menyarankan Anda memiliki satu project untuk menghosting VPC bersama, dan dua project layanan untuk membuat cluster. Untuk selengkapnya informasi, lihat Menyiapkan cluster dengan VPC Bersama.
Jika Anda menggunakan Istio CA, gunakan root certificate kustom yang sama untuk kedua cluster.
Jika Cloud Service Mesh Anda dibangun di atas cluster pribadi, sebaiknya membuat satu subnet di VPC yang sama. Jika tidak, Anda harus memastikan bahwa:
- Bidang kontrol bisa menjangkau bidang kontrol cluster pribadi jarak jauh melalui IP pribadi cluster.
- Anda dapat menambahkan bidang kontrol panggilan rentang IP ke remote private klaster jaringan yang diizinkan. Untuk informasi selengkapnya, lihat Mengonfigurasi penemuan endpoint di antara cluster pribadi.
Server API harus dapat dijangkau oleh instance Cloud Service Mesh lainnya bidang kontrol dalam mesh multi-cluster.
- Pastikan bahwa cluster memiliki akses global mengaktifkan pembuatan versi.
- Pastikan IP bidang kontrol Mesh Layanan Cloud telah diizinkan dengan benar melalui daftar 'izinkan' dengan Jaringan Resmi Master.
Menetapkan variabel project dan cluster
Buat variabel lingkungan berikut untuk project ID, cluster zona atau region, nama cluster, dan konteks.
export PROJECT_1=PROJECT_ID_1 export LOCATION_1=CLUSTER_LOCATION_1 export CLUSTER_1=CLUSTER_NAME_1 export CTX_1="gke_${PROJECT_1}_${LOCATION_1}_${CLUSTER_1}" export PROJECT_2=PROJECT_ID_2 export LOCATION_2=CLUSTER_LOCATION_2 export CLUSTER_2=CLUSTER_NAME_2 export CTX_2="gke_${PROJECT_2}_${LOCATION_2}_${CLUSTER_2}"
Jika ini adalah cluster yang baru dibuat, pastikan untuk mengambil kredensial untuk setiap cluster cluster dengan perintah
gcloud
berikut atau yang terkait dengannyacontext
tidak akan dapat digunakan pada langkah berikutnya dalam panduan ini.Perintah ini bergantung pada jenis cluster Anda, baik regional maupun zona:
Regional
gcloud container clusters get-credentials ${CLUSTER_1} --region ${LOCATION_1} gcloud container clusters get-credentials ${CLUSTER_2} --region ${LOCATION_2}
Zonal
gcloud container clusters get-credentials ${CLUSTER_1} --zone ${LOCATION_1} gcloud container clusters get-credentials ${CLUSTER_2} --zone ${LOCATION_2}
Buat aturan firewall
Dalam beberapa kasus, Anda perlu membuat aturan firewall untuk mengizinkan lintas cluster kemacetan. Misalnya, Anda perlu membuat aturan firewall jika:
- Anda akan menggunakan subnet yang berbeda untuk cluster di mesh.
- Pod Anda membuka port selain 443 dan 15002.
GKE secara otomatis menambahkan aturan firewall ke setiap node untuk mengizinkan traffic jaringan dalam subnet yang sama. Jika mesh Anda berisi beberapa subnet, Anda harus secara eksplisit mengatur aturan {i>firewall<i} untuk mengizinkan lalu lintas lintas subnet. Anda harus menambahkan aturan firewall baru untuk setiap subnet agar IP CIDR sumber dapat memblokir dan menargetkan porta dari semua traffic masuk.
Instruksi berikut memungkinkan komunikasi antara semua cluster dalam
project atau hanya antara $CLUSTER_1
dan $CLUSTER_2
.
Kumpulkan informasi tentang cluster Anda jaringan.
Semua cluster project
Jika cluster berada dalam project yang sama, Anda dapat menggunakan perintah berikut untuk memungkinkan komunikasi antara semua klaster dalam proyek Anda. Jika ada cluster dalam project yang tidak ingin Anda tampilkan, gunakan perintah di tab Cluster tertentu.
function join_by { local IFS="$1"; shift; echo "$*"; } ALL_CLUSTER_CIDRS=$(gcloud container clusters list --project $PROJECT_1 --format='value(clusterIpv4Cidr)' | sort | uniq) ALL_CLUSTER_CIDRS=$(join_by , $(echo "${ALL_CLUSTER_CIDRS}")) ALL_CLUSTER_NETTAGS=$(gcloud compute instances list --project $PROJECT_1 --format='value(tags.items.[0])' | sort | uniq) ALL_CLUSTER_NETTAGS=$(join_by , $(echo "${ALL_CLUSTER_NETTAGS}"))
Cluster tertentu
Perintah berikut memungkinkan komunikasi antara
$CLUSTER_1
dan$CLUSTER_2
dan tidak mengekspos cluster lain dalam project Anda.function join_by { local IFS="$1"; shift; echo "$*"; } ALL_CLUSTER_CIDRS=$(for P in $PROJECT_1 $PROJECT_2; do gcloud --project $P container clusters list --filter="name:($CLUSTER_1,$CLUSTER_2)" --format='value(clusterIpv4Cidr)'; done | sort | uniq) ALL_CLUSTER_CIDRS=$(join_by , $(echo "${ALL_CLUSTER_CIDRS}")) ALL_CLUSTER_NETTAGS=$(for P in $PROJECT_1 $PROJECT_2; do gcloud --project $P compute instances list --filter="name:($CLUSTER_1,$CLUSTER_2)" --format='value(tags.items.[0])' ; done | sort | uniq) ALL_CLUSTER_NETTAGS=$(join_by , $(echo "${ALL_CLUSTER_NETTAGS}"))
Membuat aturan firewall.
GKE
gcloud compute firewall-rules create istio-multicluster-pods \ --allow=tcp,udp,icmp,esp,ah,sctp \ --direction=INGRESS \ --priority=900 \ --source-ranges="${ALL_CLUSTER_CIDRS}" \ --target-tags="${ALL_CLUSTER_NETTAGS}" --quiet \ --network=YOUR_NETWORK
Autopilot
TAGS="" for CLUSTER in ${CLUSTER_1} ${CLUSTER_2} do TAGS+=$(gcloud compute firewall-rules list --filter="Name:$CLUSTER*" --format="value(targetTags)" | uniq) && TAGS+="," done TAGS=${TAGS::-1} echo "Network tags for pod ranges are $TAGS" gcloud compute firewall-rules create asm-multicluster-pods \ --allow=tcp,udp,icmp,esp,ah,sctp \ --network=gke-cluster-vpc \ --direction=INGRESS \ --priority=900 --network=VPC_NAME \ --source-ranges="${ALL_CLUSTER_CIDRS}" \ --target-tags=$TAGS
Mengonfigurasi penemuan endpoint
Langkah-langkah yang diperlukan untuk mengonfigurasi penemuan endpoint bergantung pada apakah Anda lebih memilih untuk menggunakan API deklaratif di seluruh cluster dalam suatu armada, atau mengaktifkannya secara manual pada cluster publik atau cluster pribadi.
Mengonfigurasi penemuan endpoint di antara cluster publik
Untuk mengonfigurasi penemuan endpoint di antara cluster GKE, Anda menjalankan
asmcli create-mesh
. Perintah ini:
- Mendaftarkan semua cluster ke fleet yang sama.
- Mengonfigurasi mesh untuk memercayai identitas workload fleet.
- Membuat rahasia jarak jauh.
Anda dapat menentukan URI untuk setiap cluster atau jalur yang file kubeconfig.
URI Cluster
Dalam perintah berikut, ganti FLEET_PROJECT_ID
dengan
project ID dari project host fleet dan URI cluster dengan
nama cluster, zona atau region, dan project ID untuk setiap cluster.
Contoh ini hanya menunjukkan dua klaster, tetapi Anda dapat menjalankan perintah untuk mengaktifkan
penemuan endpoint pada cluster tambahan,
jumlah cluster maksimum yang diizinkan yang dapat Anda tambahkan ke fleet.
./asmcli create-mesh \
FLEET_PROJECT_ID \
${PROJECT_1}/${LOCATION_1}/${CLUSTER_1} \
${PROJECT_2}/${LOCATION_2}/${CLUSTER_2}
file kubeconfig
Dalam perintah berikut, ganti FLEET_PROJECT_ID
dengan
project ID dari
project host perangkat
dan PATH_TO_KUBECONFIG
dengan jalur ke setiap
kubeconfig
. Contoh ini hanya menunjukkan dua klaster, tetapi Anda bisa menjalankan metode
untuk mengaktifkan penemuan endpoint pada cluster tambahan, sesuai dengan
jumlah cluster maksimum yang diizinkan yang dapat Anda tambahkan ke fleet.
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
Mengonfigurasi penemuan endpoint di antara cluster pribadi
Konfigurasikan rahasia jarak jauh untuk mengizinkan akses server API ke cluster ke bidang kontrol Cloud Service Mesh cluster lain. Perintah-perintah tersebut bergantung pada Jenis Cloud Service Mesh (baik dalam cluster maupun terkelola):
A. Untuk Cloud Service Mesh dalam cluster, Anda harus mengonfigurasi IP pribadi IP publik karena IP publik tidak dapat diakses:
PRIV_IP=`gcloud container clusters describe "${CLUSTER_1}" --project "${PROJECT_1}" \ --zone "${LOCATION_1}" --format "value(privateClusterConfig.privateEndpoint)"` ./istioctl x create-remote-secret --context=${CTX_1} --name=${CLUSTER_1} --server=https://${PRIV_IP} > ${CTX_1}.secret
PRIV_IP=`gcloud container clusters describe "${CLUSTER_2}" --project "${PROJECT_2}" \ --zone "${LOCATION_2}" --format "value(privateClusterConfig.privateEndpoint)"` ./istioctl x create-remote-secret --context=${CTX_2} --name=${CLUSTER_2} --server=https://${PRIV_IP} > ${CTX_2}.secret
B. Untuk Mesh Layanan Cloud Terkelola:
PUBLIC_IP=`gcloud container clusters describe "${CLUSTER_1}" --project "${PROJECT_1}" \ --zone "${LOCATION_1}" --format "value(privateClusterConfig.publicEndpoint)"` ./istioctl x create-remote-secret --context=${CTX_1} --name=${CLUSTER_1} --server=https://${PUBLIC_IP} > ${CTX_1}.secret
PUBLIC_IP=`gcloud container clusters describe "${CLUSTER_2}" --project "${PROJECT_2}" \ --zone "${LOCATION_2}" --format "value(privateClusterConfig.publicEndpoint)"` ./istioctl x create-remote-secret --context=${CTX_2} --name=${CLUSTER_2} --server=https://${PUBLIC_IP} > ${CTX_2}.secret
Terapkan secret baru ke dalam cluster:
kubectl apply -f ${CTX_1}.secret --context=${CTX_2}
kubectl apply -f ${CTX_2}.secret --context=${CTX_1}
Mengonfigurasi jaringan resmi untuk cluster pribadi
Ikuti bagian ini hanya jika semua kondisi berikut berlaku untuk mesh Anda:
- Anda menggunakan cluster pribadi.
- Cluster tersebut tidak termasuk dalam subnet yang sama.
- Cluster telah mengaktifkan jaringan yang diizinkan.
Saat men-deploy beberapa cluster pribadi, bidang kontrol Cloud Service Mesh di setiap cluster perlu memanggil bidang kontrol GKE ke cluster jarak jauh. Untuk mengizinkan traffic, Anda perlu menambahkan rentang alamat Pod di bagian memanggil cluster ke jaringan resmi cluster jarak jauh.
Dapatkan blok CIDR IP Pod untuk setiap cluster:
POD_IP_CIDR_1=`gcloud container clusters describe ${CLUSTER_1} --project ${PROJECT_1} --zone ${LOCATION_1} \ --format "value(ipAllocationPolicy.clusterIpv4CidrBlock)"`
POD_IP_CIDR_2=`gcloud container clusters describe ${CLUSTER_2} --project ${PROJECT_2} --zone ${LOCATION_2} \ --format "value(ipAllocationPolicy.clusterIpv4CidrBlock)"`
Tambahkan blok CIDR IP Pod cluster Kubernetes ke cluster jarak jauh:
EXISTING_CIDR_1=`gcloud container clusters describe ${CLUSTER_1} --project ${PROJECT_1} --zone ${LOCATION_1} \ --format "value(masterAuthorizedNetworksConfig.cidrBlocks.cidrBlock)"` gcloud container clusters update ${CLUSTER_1} --project ${PROJECT_1} --zone ${LOCATION_1} \ --enable-master-authorized-networks \ --master-authorized-networks ${POD_IP_CIDR_2},${EXISTING_CIDR_1//;/,}
EXISTING_CIDR_2=`gcloud container clusters describe ${CLUSTER_2} --project ${PROJECT_2} --zone ${LOCATION_2} \ --format "value(masterAuthorizedNetworksConfig.cidrBlocks.cidrBlock)"` gcloud container clusters update ${CLUSTER_2} --project ${PROJECT_2} --zone ${LOCATION_2} \ --enable-master-authorized-networks \ --master-authorized-networks ${POD_IP_CIDR_1},${EXISTING_CIDR_2//;/,}
Untuk informasi selengkapnya, lihat Membuat cluster dengan jaringan yang diizinkan.
Pastikan jaringan yang diizinkan telah diperbarui:
gcloud container clusters describe ${CLUSTER_1} --project ${PROJECT_1} --zone ${LOCATION_1} \ --format "value(masterAuthorizedNetworksConfig.cidrBlocks.cidrBlock)"
gcloud container clusters describe ${CLUSTER_2} --project ${PROJECT_2} --zone ${LOCATION_2} \ --format "value(masterAuthorizedNetworksConfig.cidrBlocks.cidrBlock)"
Aktifkan akses global bidang kontrol
Ikuti bagian ini hanya jika semua kondisi berikut berlaku untuk mesh Anda:
- Anda menggunakan cluster pribadi.
- Anda akan menggunakan region yang berbeda untuk cluster di mesh.
Anda harus mengaktifkan akses global bidang kontrol memungkinkan bidang kontrol Cloud Service Mesh di setiap cluster untuk memanggil Bidang kontrol GKE dari cluster jarak jauh.
Aktifkan akses global bidang kontrol:
gcloud container clusters update ${CLUSTER_1} --project ${PROJECT_1} --zone ${LOCATION_1} \ --enable-master-global-access
gcloud container clusters update ${CLUSTER_2} --project ${PROJECT_2} --zone ${LOCATION_2} \ --enable-master-global-access
Pastikan akses global bidang kontrol diaktifkan:
gcloud container clusters describe ${CLUSTER_1} --project ${PROJECT_1} --zone ${LOCATION_1}
gcloud container clusters describe ${CLUSTER_2} --project ${PROJECT_2} --zone ${LOCATION_2}
Bagian
privateClusterConfig
di output menampilkan statusmasterGlobalAccessConfig
.
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.
Menetapkan variabel untuk direktori contoh
Buka tempat
asmcli
didownload, lalu jalankan perintah berikut untuk menyetelASM_VERSION
export ASM_VERSION="$(./asmcli --version)"
Tetapkan folder kerja ke contoh yang Anda gunakan untuk memverifikasi bahwa load balancing lintas cluster. Sampel terletak di di direktori
--output_dir
yang telah Anda tentukan di dalam perintahasmcli install
. Pada perintah berikut, ubahOUTPUT_DIR
ke direktori yang Anda tentukan di--output_dir
.export SAMPLES_DIR=OUTPUT_DIR/istio-${ASM_VERSION%+*}
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.
Membersihkan layanan HelloWorld
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}