Menyiapkan mesh multi-cloud atau hybrid

Halaman ini menjelaskan cara menyiapkan mesh multi-cloud atau hybrid untuk platform berikut:

  • Hybrid: GKE di Google Cloud dan Google Distributed Cloud (pratinjau)
  • Hybrid: GKE di Google Cloud dan Google Distributed Cloud (pratinjau)
  • Multi-cloud: GKE di Google Cloud dan Amazon EKS (pratinjau)

Dengan mengikuti petunjuk ini, Anda akan menyiapkan dua cluster, tetapi Anda dapat memperluas proses ini untuk menggabungkan sejumlah cluster ke dalam mesh Anda.

Prasyarat

  • Semua cluster harus terdaftar ke project host fleet yang sama.
  • Semua cluster GKE harus berada dalam konfigurasi VPC bersama di jaringan yang sama.
  • Alamat bidang kontrol Kubernetes cluster dan alamat gateway harus dapat dijangkau dari setiap cluster dalam mesh. Project Google Cloud tempat cluster GKE berada harus diizinkan untuk membuat jenis load balancing eksternal. Sebaiknya gunakan jaringan yang diizinkan dan aturan firewall VPC untuk membatasi akses.
  • Cluster pribadi, termasuk cluster pribadi GKE, tidak didukung. Jika Anda menggunakan cluster On-Premises, termasuk Google Distributed Cloud dan Google Distributed Cloud, alamat bidang kontrol Kubernetes dan alamat gateway harus dapat dijangkau dari pod di cluster GKE. Sebaiknya gunakan CloudVPN untuk menghubungkan subnet cluster GKE dengan jaringan cluster Lokal.
  • Jika Anda menggunakan Istio CA, gunakan sertifikat root kustom yang sama untuk semua cluster.

Sebelum memulai

Panduan ini mengasumsikan bahwa Anda telah menginstal Cloud Service Mesh menggunakan alat asmcli. Anda memerlukan asmcli dan paket konfigurasi yang didownload asmcli ke direktori yang Anda tentukan di --output_dir saat menjalankan asmcli install. Untuk mengetahui informasi selengkapnya, lihat Menginstal alat dependen dan memvalidasi cluster untuk:

Anda memerlukan akses ke file kubeconfig untuk semua cluster yang Anda siapkan di mesh. Untuk cluster GKE, guna membuat file kubeconfig baru untuk cluster, Anda dapat mengekspor KUBECONFIG env dengan jalur file lengkap sebagai nilai di terminal dan membuat entri kubeconfig.

Menyiapkan variabel lingkungan dan placeholder

Anda memerlukan variabel lingkungan berikut saat menginstal gateway timur-barat.

Buat variabel lingkungan untuk nama jaringan:

  • Cluster GKE secara default menggunakan nama jaringan cluster:

    export NETWORK_1="PROJECT_ID-CLUSTER_NETWORK"
    ``````
    
  • Cluster lainnya menggunakan default:

    export NETWORK_2="default"
    ``````
    

Jika Anda menginstal Cloud Service Mesh di cluster lain dengan nilai yang berbeda untuk --network_id, Anda harus meneruskan nilai yang sama ke nilai NETWORK_2.

Menginstal gateway timur-barat

  1. Instal gateway di CLUSTER_1 (cluster GKE Anda) yang dikhususkan untuk traffic east-west ke CLUSTER_2 (cluster multi-cloud atau on-premise Anda):

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID} \
        --network ${NETWORK_1}  \
        --revision asm-11910-9 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 install -y -f -
    

    Perhatikan bahwa gateway ini bersifat publik di Internet secara default. Sistem produksi mungkin memerlukan batasan akses tambahan, misalnya aturan firewall, untuk mencegah serangan eksternal.

  2. Instal gateway di CLUSTER_2 yang dikhususkan untuk traffic east-west bagi CLUSTER_1.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID} \
        --network ${NETWORK_2} \
        --revision asm-11910-9 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 install -y -f -
    

Mengekspos layanan

Karena cluster berada di jaringan terpisah, Anda perlu mengekspos semua layanan (\*.local) di gateway east-west di kedua cluster. Meskipun gateway ini bersifat publik di internet, layanan di baliknya hanya dapat diakses oleh layanan dengan sertifikat mTLS dan ID workload tepercaya, sama seperti jika layanan tersebut berada di jaringan yang sama.

Mengekspos layanan melalui gateway east-west untuk setiap cluster

    kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
        asm/istio/expansion/expose-services.yaml
    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 multicluster

Bagian ini menjelaskan cara men-deploy layanan HelloWorld dan Sleep contoh ke lingkungan multi-cluster Anda untuk memverifikasi bahwa load balancing lintas cluster berfungsi.

Mengaktifkan injeksi sidecar

Temukan nilai label revisi, yang akan Anda gunakan pada langkah-langkah berikutnya.

Gunakan perintah berikut untuk menemukan label revisi, yang akan Anda gunakan pada langkah-langkah selanjutnya.

kubectl -n istio-system get pods -l app=istiod --show-labels

Outputnya terlihat mirip dengan yang berikut ini:

NAME                                READY   STATUS    RESTARTS   AGE   LABELS
istiod-asm-173-3-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
istiod-asm-173-3-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586

Dalam output, di kolom LABELS, catat nilai label revisi istiod yang mengikuti awalan istio.io/rev=. Dalam contoh ini, nilainya adalah asm-173-3. Gunakan nilai revisi dalam langkah-langkah di bagian berikutnya.

Menginstal layanan HelloWorld

  1. Buat namespace contoh dan Definisi Layanan di setiap cluster. Pada perintah berikut, ganti REVISION dengan label revisi istiod yang Anda catat dari langkah sebelumnya.

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl create --context=${CTX} namespace sample
        kubectl label --context=${CTX} namespace sample \
            istio-injection- istio.io/rev=REVISION --overwrite
    done
    

    dengan REVISION adalah label revisi istiod yang sebelumnya Anda catat.

    Outputnya adalah:

    label "istio-injection" not found.
    namespace/sample labeled
    

    Anda dapat mengabaikan label "istio-injection" not found. dengan aman

  2. 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
    

Deploy HelloWorld v1 dan v2 ke setiap cluster

  1. Deploy HelloWorld v1 ke CLUSTER_1 dan v2 ke CLUSTER_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 sample
    kubectl create --context=${CTX_2} \
      -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
      -l version=v2 -n sample
  2. Konfirmasi bahwa 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

  1. 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
    
  2. 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 balasan bergantian dari v1 dan v2:

  1. 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
    ...
  2. 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.

Pembersihan

Setelah Anda 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}