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:

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.

  1. 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)")
    
  2. Buat variabel lingkungan untuk ID mesh.

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

    kubectl config get-contexts
  5. 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 dan CLUSTER_NAME_2 dengan nama cluster Anda.

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

Cluster Anthos

Mesh CA atau CA Service

  1. 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 -
    
  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-1233-2 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
    

Istio CA

  1. 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 -
    
  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-1233-2 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Azure, AWS, & Terlampir

Jaring CA

  1. 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 -
    
  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-1233-2 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Istio CA

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

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

  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 injeksi default, tetapi injeksi 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 ini, REVISION_LABEL adalah nilai revisi istiod 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

  1. 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
  2. Pastikan HelloWorld v1 dan v2 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

  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 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:

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