Panduan
Mesh
Panduan ini menjelaskan cara menggabungkan dua cluster ke dalam 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 cluster ke dalam mesh.
Konfigurasi Cloud Service Mesh multi-cluster dapat menyelesaikan beberapa skenario perusahaan
penting, seperti skala, lokasi, dan isolasi. Untuk mengetahui informasi selengkapnya, lihat
Kasus penggunaan multi-cluster .
Prasyarat
Panduan ini mengasumsikan bahwa Anda memiliki dua atau beberapa cluster GKE Google Cloud yang memenuhi persyaratan berikut:
Cloud Service Mesh versi 1.11 atau yang lebih baru diinstal di cluster menggunakan asmcli install
. Anda memerlukan
asmcli
, alat istioctl
, dan sampel yang didownload asmcli
ke
direktori yang Anda tentukan di --output_dir
saat menjalankan asmcli install
Jika perlu disiapkan, ikuti langkah-langkah di
Menginstal alat dependen dan memvalidasi cluster
untuk:
Cluster dalam mesh Anda harus memiliki konektivitas di antara semua pod sebelum Anda
mengonfigurasi Cloud Service Mesh. Selain itu, jika Anda bergabung ke cluster yang tidak berada dalam project yang sama, cluster tersebut harus terdaftar ke project host fleet yang sama, dan cluster harus berada dalam konfigurasi VPC bersama bersama-sama di jaringan yang sama. Sebaiknya Anda juga memiliki satu project untuk menghosting VPC bersama, dan dua project layanan untuk membuat cluster. Untuk informasi
selengkapnya, lihat
Menyiapkan cluster dengan VPC Bersama .
Jika Anda menggunakan CA Istio, gunakan sertifikat root kustom yang sama untuk kedua cluster.
Jika Cloud Service Mesh Anda dibuat di cluster pribadi, sebaiknya
buat satu subnet
di VPC yang sama. Jika tidak, Anda harus memastikan bahwa:
Bidang kontrol dapat menjangkau bidang kontrol cluster pribadi jarak jauh melalui
IP pribadi cluster .
Anda dapat menambahkan rentang IP bidang kontrol panggilan ke jaringan yang diizinkan cluster pribadi jarak jauh.
Untuk mengetahui informasi selengkapnya, lihat
Mengonfigurasi penemuan endpoint di antara cluster pribadi .
Server API harus dapat dijangkau oleh instance lain dari control plane Cloud Service Mesh
di mesh multi-cluster.
Pastikan cluster telah mengaktifkan akses global .
Pastikan IP bidang kontrol Cloud Service Mesh telah diizinkan dengan benar melalui daftar yang diizinkan dengan Master Authorized Network .
Menetapkan variabel project dan cluster
Buat variabel lingkungan berikut untuk project ID, zona atau region cluster, 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 dengan perintah gcloud
berikut. Jika tidak, context
terkait
tidak akan tersedia untuk digunakan di langkah berikutnya dalam panduan ini.
Perintah bergantung pada jenis cluster Anda, baik regional maupun zonal:
gcloud container clusters get-credentials ${ CLUSTER_1 } --region ${ LOCATION_1 }
gcloud container clusters get-credentials ${ CLUSTER_2 } --region ${ LOCATION_2 }
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 traffic lintas cluster. Misalnya, Anda perlu membuat aturan firewall jika:
Anda menggunakan subnet yang berbeda untuk cluster dalam mesh.
Pod Anda membuka port selain 443 dan 15002.
GKE otomatis menambahkan aturan firewall ke setiap node untuk mengizinkan
traffic dalam subnet yang sama. Jika mesh Anda berisi beberapa subnet, Anda harus
menyiapkan aturan firewall secara eksplisit untuk mengizinkan traffic lintas subnet. Anda harus
menambahkan aturan firewall baru
untuk setiap subnet guna mengizinkan blok CIDR IP sumber dan menargetkan port dari semua
traffic masuk.
Petunjuk berikut memungkinkan komunikasi antara semua cluster dalam project Anda atau hanya antara $CLUSTER_1
dan $CLUSTER_2
.
Kumpulkan informasi tentang jaringan cluster Anda.
Jika cluster berada dalam project yang sama, Anda dapat menggunakan perintah berikut untuk mengizinkan komunikasi antar-cluster di project Anda. Jika ada cluster dalam project yang tidak ingin Anda ekspos, gunakan perintah di tab Specific clusters .
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 } " ))
Perintah berikut memungkinkan komunikasi antara $CLUSTER_1
dan
$CLUSTER_2
serta 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 } " ))
Buat aturan firewall.
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
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
Langkah-langkah yang diperlukan untuk mengonfigurasi penemuan endpoint bergantung pada apakah Anda lebih suka menggunakan API deklaratif di seluruh cluster dalam fleet, atau mengaktifkannya secara manual di cluster publik atau cluster pribadi .
Peringatan: Jika penemuan endpoint diaktifkan di antara cluster, layanan antar-cluster
tidak dapat berkomunikasi satu sama lain tanpa konfigurasi DNS
yang tepat. Hal ini karena layanan GKE bergantung pada nama domain yang sepenuhnya memenuhi syarat (FQDN) setiap layanan untuk pemilihan rute traffic. Anda dapat mengaktifkan
proxy DNS ,
untuk mengizinkan penemuan antar-cluster. Proxy DNS menangkap semua permintaan DNS dan
menyelesaikannya menggunakan informasi dari Control Plane.
Untuk mengonfigurasi penemuan endpoint di antara cluster GKE, Anda menjalankan
asmcli create-mesh
. Perintah ini:
Mendaftarkan semua cluster ke fleet yang sama.
Mengonfigurasi mesh agar memercayai workload identity fleet.
Membuat secret jarak jauh.
Anda dapat menentukan URI untuk setiap cluster atau jalur
file kubeconfig .
Dalam perintah berikut, ganti FLEET_PROJECT_ID
dengan project ID project host fleet dan URI cluster dengan nama cluster, zona, atau region, dan project ID untuk setiap cluster.
Contoh ini hanya menampilkan dua cluster, tetapi Anda dapat menjalankan perintah untuk mengaktifkan
penemuan endpoint di cluster tambahan, sesuai dengan
jumlah maksimum cluster 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 }
Dalam perintah berikut, ganti FLEET_PROJECT_ID
dengan project ID project host fleet dan PATH_TO_KUBECONFIG
dengan jalur ke setiap file kubeconfig
. Contoh ini hanya menampilkan dua cluster, tetapi Anda dapat menjalankan perintah untuk mengaktifkan penemuan endpoint di cluster tambahan, sesuai dengan jumlah maksimum cluster 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 antar-cluster pribadi
Konfigurasikan secret jarak jauh untuk mengizinkan akses server API ke cluster ke
control plane Cloud Service Mesh cluster lain. Perintah ini bergantung pada jenis Cloud Service Mesh Anda (dalam cluster atau terkelola):
Catatan: Pastikan Anda menjalankan perintah berikut menggunakan istioctl
dari lokasi --output_dir
yang Anda tentukan saat menjalankan asmcli install
dengan menjalankan perintah istioctl
dengan cara ../output_dir/istioctl
.
A. Untuk Cloud Service Mesh dalam cluster, Anda harus mengonfigurasi IP pribadi, bukan 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 Cloud Service Mesh 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 cluster:
kubectl apply -f ${CTX_1}.secret --context=${CTX_2}
kubectl apply -f ${CTX_2}.secret --context=${CTX_1}
Mengonfigurasi jaringan yang diizinkan untuk cluster pribadi
Ikuti bagian ini hanya jika semua kondisi berikut berlaku untuk mesh Anda:
Saat men-deploy beberapa cluster pribadi, bidang kontrol Cloud Service Mesh di
setiap cluster perlu memanggil bidang kontrol GKE dari
cluster jarak jauh. Untuk mengizinkan traffic, Anda harus menambahkan rentang alamat Pod di
cluster panggilan ke jaringan yang diizinkan dari 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 mengetahui informasi selengkapnya, lihat
Membuat cluster dengan jaringan yang diotorisasi .
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)"
Mengaktifkan akses global bidang kontrol
Ikuti bagian ini hanya jika semua kondisi berikut berlaku untuk mesh Anda:
Anda menggunakan cluster pribadi.
Anda menggunakan region yang berbeda untuk cluster di mesh.
Anda harus mengaktifkan akses global bidang kontrol
untuk mengizinkan bidang kontrol Cloud Service Mesh di setiap cluster 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
dalam output menampilkan status
masterGlobalAccessConfig
.
Memverifikasi konektivitas multicluster
Bagian ini menjelaskan cara men-deploy contoh layanan HelloWorld
dan Sleep
ke lingkungan multi-cluster untuk memverifikasi bahwa load balancing lintas cluster
berfungsi.
Catatan: Contoh layanan ini terletak di
direktori samples
Istio
yang disertakan dalam tarball istioctl
(terletak di
OUTPUT_DIR /istio-${ASM_VERSION%+*}/samples
), bukan
direktori samples
yang didownload oleh asmcli
(terletak di
OUTPUT_DIR /samples
).
Menetapkan variabel untuk direktori contoh
Buka tempat asmcli
didownload, lalu jalankan perintah berikut untuk menetapkan ASM_VERSION
export ASM_VERSION = " $( ./asmcli --version) "
Tetapkan folder kerja ke sampel yang Anda gunakan untuk memverifikasi bahwa load balancing lintas cluster berfungsi. Contoh tersebut terletak di subdirektori dalam direktori --output_dir
yang Anda tentukan dalam perintah asmcli install
. Dalam perintah berikut, ubah
OUTPUT_DIR
ke direktori yang Anda tentukan di
--output_dir
.
export SAMPLES_DIR = OUTPUT_DIR /istio-${ ASM_VERSION %+* }
Mengaktifkan injeksi sidecar
Buat contoh namespace di setiap cluster.
for CTX in ${ CTX_1 } ${ CTX_2 }
do
kubectl create --context= ${ CTX } namespace sample
done
Aktifkan injeksi sidecar di 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,
REVISION_LABEL
adalah nilai label revisi
istiod
yang Anda catat di 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
Catatan: Contoh layanan HelloWorld menggunakan Docker Hub . Dalam cluster
pribadi, runtime container dapat mengambil image container dari Artifact Registry
secara default. Runtime container tidak dapat mengambil image dari registry image
container lainnya di internet. Anda dapat mendownload image dan mengirimkannya ke Artifact Registry atau menggunakan Cloud NAT untuk memberikan akses internet keluar bagi node pribadi tertentu. Untuk
mengetahui informasi selengkapnya, lihat Memigrasikan penampung eksternal
dan Membuat cluster pribadi .
Men-deploy HelloWorld v1 dan v2 ke setiap cluster
Deploy HelloWorld v1
ke CLUSTER_1
dan v2
ke CLUSTER_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
dan v2
berjalan menggunakan perintah berikut. Pastikan output-nya 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-nya 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 output untuk memverifikasi
respons 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 yang di-load balance.
Membersihkan layanan HelloWorld
Setelah Anda selesai memverifikasi load balancing, hapus layanan HelloWorld
dan Sleep
dari cluster.
kubectl delete ns sample --context ${CTX_1}
kubectl delete ns sample --context ${CTX_2}