Menyiapkan mesh multi-cluster di luar Google Cloud

Panduan ini menjelaskan cara menyiapkan mesh multi-cluster untuk hal berikut platform:

  • Google Distributed Cloud
  • Google Distributed Cloud
  • 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

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

Gunakan perintah berikut untuk menemukan label revisi, yang akan gunakan di 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

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

Menginstal layanan HelloWorld

  1. Buat contoh namespace dan Service Definition di setiap cluster. Di beberapa perintah berikut, ganti REVISION dengan istiod label revisi 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 dicatat.

    Output-nya 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
    

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}