Membuat cluster GKE dengan Cloud Service Mesh dan gcloud CLI

Dalam tutorial ini, Anda akan menyediakan Cloud Service Mesh terkelola menggunakan API Fleet Google Kubernetes Engine (GKE) di cluster publik GKE baru. Tutorial ini akan memandu Anda:

  1. Mengonfigurasi Google Cloud project Anda.
  2. Membuat cluster GKE dengan jumlah vCPU minimum yang diperlukan oleh Cloud Service Mesh.
  3. Mendaftarkan cluster GKE ke Fleet project Anda.
  4. Menyediakan Cloud Service Mesh terkelola di cluster menggunakan Fleet API.
  5. Men-deploy gateway masuk untuk mengekspos aplikasi.
  6. Men-deploy aplikasi contoh sehingga Anda dapat melihat data telemetri di dasbor Cloud Service Mesh di konsol Google Cloud .
  7. Mengekspos dan mengakses aplikasi contoh.

Fleet API

Panduan ini mengasumsikan bahwa Anda sudah memahami Fleet, yang merupakan pengelompokan logis cluster GKE dan resource lain yang dapat dikelola bersama. Fleet adalah konsep GKE, bukan konsep Kubernetes. Dengan mendaftarkan cluster ke Fleet, Anda dapat menyediakan Cloud Service Mesh terkelola di cluster tersebut menggunakan perintah gcloud container fleet mesh update. Penggunaan Kumpulan Armada diaktifkan oleh Fleet API (gkehub.googleapis.com) yang Anda aktifkan saat memulai tutorial ini.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan panduan memulai ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus cluster. Untuk informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  8. Catat project ID Anda.
  9. Menginstal alat yang diperlukan

    Anda dapat menjalankan alat ini di Cloud Shell atau di komputer lokal Anda. Cloud Shell sudah menginstal semua alat yang diperlukan.

    Cloud Shell

    Cloud Shell menyediakan virtual machine (VM) Compute Engine g1-small yang menjalankan sistem operasi Linux berbasis Debian. Keuntungan menggunakan Cloud Shell adalah:

    • Cloud Shell mencakup gcloud, kubectl, git, dan alat command line lainnya yang Anda perlukan.

    • Direktori $HOME Cloud Shell Anda memiliki ruang penyimpanan persisten sebesar 5 GB.

    • Anda dapat memilih editor teks:

      • Editor kode, yang Anda akses dengan mengklik di bagian atas jendela Cloud Shell.

      • Emacs, Vim, atau Nano, yang Anda akses dari command line di Cloud Shell.

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    Komputer lokal

    1. Pastikan Anda telah menginstal alat berikut:

    2. Lakukan autentikasi dengan Google Cloud CLI:

      gcloud auth login --project PROJECT_ID
      
    3. Perbarui komponen:

      gcloud components update
      

    Membuat cluster GKE

    1. Jalankan perintah berikut untuk membuat cluster dengan jumlah vCPU minimum yang diperlukan oleh Cloud Service Mesh. Dalam perintah, ganti placeholder dengan informasi berikut:

      • CLUSTER_NAME: nama cluster Anda. Nama hanya boleh berisi karakter alfanumerik huruf kecil dan -, harus diawali dengan huruf dan diakhiri dengan alfanumerik, serta tidak boleh lebih dari 40 karakter.
      • PROJECT_ID: project ID tempat cluster akan dibuat.
      • CLUSTER_LOCATION: zona untuk cluster, seperti us-central1-a.
      gcloud container clusters create CLUSTER_NAME \
          --project=PROJECT_ID \
          --zone=CLUSTER_LOCATION \
          --machine-type=e2-standard-4 \
          --num-nodes=2 \
          --workload-pool=PROJECT_ID.svc.id.goog
      

      Proses pembuatan cluster memerlukan waktu beberapa menit. Saat cluster sedang dibuat, perintah gcloud akan menampilkan hal berikut:

      Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
      

      Output yang diharapkan saat pembuatan berhasil akan mirip dengan berikut ini:

      Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done.
      Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
      To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID
      kubeconfig entry generated for CLUSTER_NAME.
      NAME: CLUSTER_NAME
      LOCATION: CLUSTER_LOCATION
      MASTER_VERSION: 1.20.10-gke.1600
      MASTER_IP: 198.51.100.1
      MACHINE_TYPE: e2-standard-4
      NODE_VERSION: 1.20.10-gke.1600
      NUM_NODES: 2
      STATUS: RUNNING
      
    2. Dapatkan kredensial autentikasi untuk berinteraksi dengan cluster.

      gcloud container clusters get-credentials CLUSTER_NAME \
          --project=PROJECT_ID \
          --zone=CLUSTER_LOCATION
      

      Output yang diharapkan:

      Fetching cluster endpoint and auth data.
      kubeconfig entry generated for CLUSTER_NAME.
      
    3. Tetapkan konteks saat ini untuk kubectl ke cluster.

      kubectl config set-context CLUSTER_NAME
      

      Output yang diharapkan:

      Context "CLUSTER_NAME" created.
      

    Menyediakan Cloud Service Mesh

    Jika Anda belum menutup halaman ini sejak membuat cluster, placeholder akan memiliki nilai yang Anda masukkan untuk perintah gcloud container clusters create.

    1. Aktifkan Cloud Service Mesh di Fleet project Anda.

      gcloud container fleet mesh enable --project PROJECT_ID
      

      Outputnya mirip dengan:

      Waiting for Feature Service Mesh to be created...done.
      
    2. Daftarkan cluster ke Fleet project:

      gcloud container fleet memberships register CLUSTER_NAME-membership \
        --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \
        --enable-workload-identity \
        --project PROJECT_ID
      

      Outputnya mirip dengan:

       Waiting for membership to be created...done.
       Finished registering to the Fleet.
      
    3. Sediakan Cloud Service Mesh terkelola di cluster menggunakan Fleet API:

      gcloud container fleet mesh update \
        --management automatic \
        --memberships CLUSTER_NAME-membership \
        --project PROJECT_ID
      

      Outputnya mirip dengan:

      Waiting for Feature Service Mesh to be updated...done.
      
    4. Pastikan bahwa Managed Cloud Service Mesh telah diaktifkan untuk cluster dan siap digunakan:

      gcloud container fleet mesh describe --project PROJECT_ID
      

      Mungkin perlu waktu sekitar 10 menit agar Cloud Service Mesh dapat melakukan penyediaan dan siap digunakan di cluster. Jika Anda melihat controlPlaneManagement.state: DISABLED atau controlPlaneManagement.state: PROVISIONING, Anda harus menjalankan kembali perintah sebelumnya setiap beberapa menit hingga Anda melihat controlPlaneManagement.state: ACTIVE.

      Outputnya mirip dengan:

      createTime: '2022-07-06T01:05:39.110120474Z'
      membershipSpecs:
        projects/123456789123/locations/global/memberships/your-cluster-membership:
          mesh:
            management: MANAGEMENT_AUTOMATIC
      membershipStates:
        projects/123456789123/locations/global/memberships/your-cluster-membership:
          servicemesh:
            controlPlaneManagement:
              details:
              - code: REVISION_READY
                details: 'Ready: asm-managed'
              state: ACTIVE
            dataPlaneManagement:
              details:
              - code: OK
                details: Service is running.
              state: ACTIVE
          state:
            code: OK
            description: 'Revision(s) ready for use: asm-managed.'
            updateTime: '2022-07-06T01:19:24.243993678Z'
      name: projects/your-project-id/locations/global/features/servicemesh
      resourceState:
        state: ACTIVE
      spec: {}
      state:
        state: {}
      updateTime: '2022-07-06T01:19:27.475885687Z'
      

    Download kode contoh

    Clone repositori git yang berisi kode contoh yang digunakan dalam tutorial ini:

       git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git
    

    Bagian berikutnya dari tutorial ini menggunakan variabel DIR_PATH. Tetapkan variabel ini ke jalur repositori anthos-service-mesh-packages yang Anda clone (misalnya, ./anthos-service-mesh-packages).

    Men-deploy gateway masuk

    Cloud Service Mesh memberi Anda opsi untuk men-deploy dan mengelola gateway sebagai bagian dari service mesh Anda. Gateway menjelaskan load balancer yang beroperasi di tepi mesh yang menerima koneksi HTTP/TCP masuk atau keluar. Gateway adalah proxy Envoy yang memberi Anda kontrol terperinci atas traffic yang masuk dan keluar dari mesh.

    1. Buat namespace untuk gateway ingress jika Anda belum memilikinya. Gateway adalah workload pengguna, dan sebagai praktik terbaik, gateway tidak boleh di-deploy di namespace bidang kontrol. Ganti GATEWAY_NAMESPACE dengan nama namespace Anda.

      kubectl create namespace GATEWAY_NAMESPACE
      

      Output yang diharapkan:

      namespace/GATEWAY_NAMESPACE created
      
    2. Aktifkan injeksi otomatis di gateway. Langkah-langkah yang diperlukan bergantung pada apakah Anda ingin menggunakan label injeksi default (misalnya, istio-injection=enabled) atau label revisi di namespace gateway. Tag revisi dan label revisi default digunakan oleh webhook penyuntik sidecar untuk mengaitkan proxy yang disuntikkan dengan revisi bidang kontrol tertentu.

      Label penyisipan default

      Terapkan label injeksi default ke namespace.

      kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
      

      Label revisi

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

        Perintah ini menampilkan label revisi yang sesuai dengan versi Cloud Service Mesh, misalnya: asm-11910-9

      2. Terapkan label revisi ke namespace. Dalam perintah berikut, REVISION adalah nilai label revisi istiod yang Anda catat di langkah sebelumnya.

        kubectl label namespace GATEWAY_NAMESPACE \
          istio.io/rev=REVISION --overwrite
        

        Output yang diharapkan:

        namespace/GATEWAY_NAMESPACE labeled
        

      Anda dapat mengabaikan pesan "istio.io/rev" not found dalam output. Artinya, namespace sebelumnya tidak memiliki label istio.io/rev, yang seharusnya Anda harapkan dalam penginstalan baru Cloud Service Mesh atau deployment baru. Karena injeksi otomatis gagal jika namespace memiliki label istio.io/rev dan istio-injection, semua perintah kubectl label dalam dokumentasi Cloud Service Mesh secara eksplisit menentukan kedua label.

      Jika namespace gateway tidak diberi label, pod istio-ingressgateway akan gagal dengan error ImagePullBackOff saat gateway mencoba menarik dan image auto. Gambar ini harus diganti oleh webhook.

    3. Download contoh file konfigurasi .yaml gateway ingress dari repositori anthos-service-mesh-packages.

    4. Terapkan konfigurasi .yaml gateway ingress contoh apa adanya, atau ubah sesuai kebutuhan.

      kubectl apply -n GATEWAY_NAMESPACE \
        -f CONFIG_PATH/istio-ingressgateway
      

      Output yang diharapkan:

      deployment.apps/istio-ingressgateway created
      poddisruptionbudget.policy/istio-ingressgateway created
      horizontalpodautoscaler.autoscaling/istio-ingressgateway created
      role.rbac.authorization.k8s.io/istio-ingressgateway created
      rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created
      service/istio-ingressgateway created
      serviceaccount/istio-ingressgateway created
      

    Pelajari lebih lanjut praktik terbaik untuk gateway.

    Men-deploy contoh Butik Online

    Contoh aplikasi Butik Online di repositori anthos-service-mesh-packages dimodifikasi dari kumpulan manifes asli di repositori microservices-demo. Dengan mengikuti praktik terbaik, setiap layanan di-deploy di namespace terpisah dengan akun layanan yang unik.

    1. Buat namespace untuk aplikasi:

      kubectl apply -f \
        DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
      

      Output yang diharapkan:

      namespace/ad created
      namespace/cart created
      namespace/checkout created
      namespace/currency created
      namespace/email created
      namespace/frontend created
      namespace/loadgenerator created
      namespace/payment created
      namespace/product-catalog created
      namespace/recommendation created
      namespace/shipping created
      
    2. Aktifkan penyisipan sidecar otomatis (penyisipan otomatis). Perintah yang diperlukan bergantung pada apakah Anda ingin menggunakan label injeksi default (misalnya, istio-injection=enabled) atau label revisi yang sama yang Anda gunakan untuk membuat anotasi namespace gateway ingress

      Label penyisipan default

      Terapkan label injeksi default ke namespace. Dalam perintah berikut, GATEWAY_NAMESPACE adalah nilai yang sama dengan yang Anda gunakan untuk memberi anotasi pada namespace gateway ingress.

      for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
        kubectl label namespace $ns istio-injection=enabled istio.io/rev-
      done;
      

      Output yang diharapkan:

      namespace/ad labeled
      namespace/cart labeled
      namespace/checkout labeled
      namespace/currency labeled
      namespace/email labeled
      namespace/frontend labeled
      namespace/loadgenerator labeled
      namespace/payment labeled
      namespace/product-catalog labeled
      namespace/recommendation labeled
      namespace/shipping labeled
      

      Label revisi

      Terapkan label revisi ke namespace aplikasi. Pada perintah berikut, REVISION adalah nilai yang sama dengan yang Anda gunakan untuk memberi anotasi pada namespace gateway ingress.

      for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
        kubectl label namespace $ns istio.io/rev=REVISION --overwrite
      done;
      

      Output yang diharapkan:

      namespace/ad labeled
      namespace/cart labeled
      namespace/checkout labeled
      namespace/currency labeled
      namespace/email labeled
      namespace/frontend labeled
      namespace/loadgenerator labeled
      namespace/payment labeled
      namespace/product-catalog labeled
      namespace/recommendation labeled
      namespace/shipping labeled
      
    3. Deploy aplikasi contoh ke cluster.

      1. Buat akun layanan dan deployment:

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
        

        Output yang diharapkan:

        serviceaccount/ad created
        deployment.apps/adservice created
        serviceaccount/cart created
        deployment.apps/cartservice created
        serviceaccount/checkout created
        deployment.apps/checkoutservice created
        serviceaccount/currency created
        deployment.apps/currencyservice created
        serviceaccount/email created
        deployment.apps/emailservice created
        serviceaccount/frontend created
        deployment.apps/frontend created
        serviceaccount/loadgenerator created
        deployment.apps/loadgenerator created
        serviceaccount/payment created
        deployment.apps/paymentservice created
        serviceaccount/product-catalog created
        deployment.apps/productcatalogservice created
        serviceaccount/recommendation created
        deployment.apps/recommendationservice created
        serviceaccount/shipping created
        deployment.apps/shippingservice created
        
      2. Buat layanan:

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/kubernetes-manifests/services
        

        Output yang diharapkan:

        service/adservice created
        service/cartservice created
        service/checkoutservice created
        service/currencyservice created
        service/emailservice created
        service/frontend created
        service/frontend-external created
        service/paymentservice created
        service/productcatalogservice created
        service/recommendationservice created
        service/shippingservice created
        
      3. Buat entri layanan:

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
        

        Output yang diharapkan:

        serviceentry.networking.istio.io/allow-egress-googleapis created
        serviceentry.networking.istio.io/allow-egress-google-metadata created
        

    Mengekspos dan mengakses aplikasi

    Ada beberapa cara untuk mengekspos aplikasi. Dalam panduan ini, kita akan menggunakan gateway masuk yang kita deploy di atas untuk melakukannya. Untuk mengetahui cara lain dalam mengekspos aplikasi Butik Online, lihat bagian mengekspos dan mengakses aplikasi dalam panduan Men-deploy contoh aplikasi Butik Online.

    1. Men-deploy Gateway dan VirtualService untuk layanan frontend

      kubectl apply -f \
          DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
      

      Output yang diharapkan:

      gateway.networking.istio.io/frontend-gateway created
      virtualservice.networking.istio.io/frontend-ingress created
      
    2. Dapatkan alamat IP eksternal gateway ingress, ganti placeholder dengan informasi berikut:

      • GATEWAY_SERVICE_NAME: nama layanan gateway ingress. Jika Anda men-deploy gateway contoh tanpa modifikasi, hasilnya adalah istio-ingressgateway.
      • GATEWAY_NAMESPACE: namespace tempat Anda men-deploy gateway ingress:
      kubectl get service GATEWAY_SERVICE_NAME \
          -n GATEWAY_NAMESPACE
      

      Outputnya mirip dengan:

      NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
      istio-ingressgateway   LoadBalancer   10.19.247.233   35.239.7.64   80:31380/TCP,443:31390/TCP,31400:31400/TCP   27m

      Dalam contoh ini, alamat IP gateway ingress adalah 35.239.7.64.

    3. Buka aplikasi di browser Anda untuk mengonfirmasi penginstalan:

      http://EXTERNAL_IP/
      

    Melihat dasbor Service Mesh

    Setelah men-deploy workload di cluster dengan proxy sidecar yang disuntikkan, Anda dapat menjelajahi halaman Cloud Service Mesh di konsol Google Cloud untuk melihat semua fitur kemampuan pengamatan yang ditawarkan Cloud Service Mesh. Perhatikan bahwa diperlukan waktu sekitar satu atau dua menit agar data telemetri ditampilkan di konsol Google Cloud setelah Anda men-deploy workload.

    Akses ke Cloud Service Mesh di konsol Google Cloud dikontrol oleh Identity and Access Management (IAM). Untuk mengakses halaman Cloud Service Mesh, Pemilik Project harus memberikan peran Project Editor atau Viewer kepada pengguna, atau peran yang lebih ketat yang dijelaskan dalam Mengontrol akses ke Cloud Service Mesh di konsol. Google Cloud

    1. Di konsol Google Cloud , buka Cloud Service Mesh.

      Buka Cloud Service Mesh

    2. Pilih project Google Cloud dari menu drop-down di menu bar.

    3. Jika Anda memiliki lebih dari satu mesh layanan, pilih mesh dari menu drop-down Service Mesh.

    Untuk mempelajari lebih lanjut, lihat Mempelajari Cloud Service Mesh di konsol Google Cloud .

    Pembersihan

    Sebelum membersihkan, jika Anda tertarik untuk mempelajari lebih lanjut TLS bersama, lihat Cloud Service Mesh menurut contoh: mTLS.

    • Jika Anda ingin mempertahankan cluster dan menghapus contoh Butik Online:

      1. Hapus namespace aplikasi:

        kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
        

        Output yang diharapkan:

        namespace "ad" deleted
        namespace "cart" deleted
        namespace "checkout" deleted
        namespace "currency" deleted
        namespace "email" deleted
        namespace "frontend" deleted
        namespace "loadgenerator" deleted
        namespace "payment" deleted
        namespace "product-catalog" deleted
        namespace "recommendation" deleted
        namespace "shipping" deleted
        
      2. Hapus entri layanan:

        kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
        

        Output yang diharapkan:

        serviceentry.networking.istio.io "allow-egress-googleapis" deleted
        serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
        
    • Jika Anda ingin mencegah tagihan tambahan, hapus cluster:

      1. Jalankan perintah berikut:

        gcloud container clusters delete CLUSTER_NAME \
            --project=PROJECT_ID \
            --zone=CLUSTER_LOCATION
        
      2. Pada perintah Do you want to continue (Y/n)?, masukkan y.

        Setelah beberapa menit, Anda akan melihat output berikut:

        Deleting cluster CLUSTER_NAME...done.
        Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
        

    Langkah berikutnya