Menyiapkan mesh multi-cluster di luar Google Cloud

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

Sebelum memulai

Panduan ini mengasumsikan bahwa Anda telah menginstal Cloud Service Mesh menggunakan asmcli install. Anda memerlukan asmcli dan paket konfigurasi yang didownload asmcli 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:

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.

  1. Buat variabel lingkungan untuk nomor project. Dalam perintah berikut, ganti FLEET_PROJECT_ID dengan project ID project host fleet.

    export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \
    --format="value(projectNumber)")
    
  2. Buat variabel lingkungan untuk ID mesh.

    export MESH_ID="proj-${PROJECT_NUMBER}"
    
  3. 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"
    
  4. Dapatkan nama konteks untuk cluster menggunakan nilai di kolom NAME dalam output perintah ini:

    kubectl config get-contexts
  5. Tetapkan variabel lingkungan ke nama konteks cluster, yang digunakan panduan ini di banyak langkah selanjutnya:

    export CTX_1=CLUSTER1_CONTEXT_NAME
    export CTX_2=CLUSTER2_CONTEXT_NAME
    

Menginstal gateway timur-barat

Dalam perintah berikut:

  • Ganti CLUSTER_NAME_1 dan CLUSTER_NAME_2 dengan nama cluster Anda.

  • Ganti PATH_TO_KUBECONFIG_1 dan PATH_TO_KUBECONFIG_2 dengan file kubeconfig untuk cluster Anda.

Cluster GKE

Mesh CA atau CA Service

  1. Instal gateway di cluster1 yang dikhususkan 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-1264-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 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-1264-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

CA Istio

  1. Instal gateway di cluster1 yang dikhususkan 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-1264-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 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-1264-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Azure, AWS, & Terlampir

Mesh CA

  1. Instal gateway di cluster1 yang dikhususkan 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-1264-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 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-1264-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

CA Istio

  1. Instal gateway di cluster1 yang dikhususkan 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-1264-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 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-1264-1 | \
        ./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 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.

  1. Mengekspos layanan melalui gateway east-west untuk CLUSTER_NAME_1.

    kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
        asm/istio/expansion/expose-services.yaml
    
  2. Mengekspos layanan melalui gateway east-west 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 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

  1. Buat namespace contoh di setiap cluster.

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl create --context=${CTX} namespace sample
    done
    
  2. 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 penyisipan default, tetapi penyisipan berbasis revisi didukung: Gunakan petunjuk berikut:

    1. 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"}'
      
    2. 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

  • 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}