Membuat cluster GKE dengan Anthos Service Mesh dan gcloud CLI

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

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

API Fleet

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

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud 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. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

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

    Enable the APIs

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

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

    Enable the APIs

  8. Catat project ID Anda.

Instal alat yang diperlukan

Anda dapat menjalankan alat ini di Cloud Shell atau di komputer lokal. Cloud Shell telah 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 lain yang Anda butuhkan.

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

Di konsol Google Cloud, aktifkan Cloud Shell.

Aktifkan Cloud Shell

Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

Komputer lokal

  1. Pastikan Anda telah menginstal alat berikut:

  2. Lakukan autentikasi dengan Google Cloud CLI:

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

    gcloud components update
    

Membuat cluster GKE

  1. Jalankan perintah berikut untuk membuat cluster dengan jumlah minimum vCPU yang diperlukan oleh Anthos 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
    

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

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

    Output yang diharapkan pada pembuatan yang berhasil mirip dengan yang 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. Setel konteks saat ini untuk kubectl ke cluster.

    kubectl config set-context CLUSTER_NAME
    

    Output yang diharapkan:

    Context "CLUSTER_NAME" created.
    

Menyediakan Anthos Service Mesh

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

  1. Aktifkan Anthos Service Mesh di Armada 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 Armada 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. Menyediakan Anthos 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 Anthos Service Mesh terkelola telah diaktifkan untuk cluster dan siap digunakan:

    gcloud container fleet mesh describe --project PROJECT_ID
    

    Diperlukan waktu sekitar 10 menit untuk menyediakan Anthos Service Mesh dan siap digunakan di cluster. Jika 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 selanjutnya 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

Anthos Service Mesh memberi Anda opsi untuk men-deploy dan mengelola gateway sebagai bagian dari mesh layanan Anda. Gateway menjelaskan load balancer yang beroperasi di edge mesh yang menerima koneksi HTTP/TCP yang 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 masuk jika Anda belum memilikinya. Gateway adalah beban kerja 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. Mengaktifkan injeksi otomatis pada 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 default dan label revisi digunakan oleh webhook injektor bantuan untuk mengaitkan proxy yang dimasukkan dengan revisi bidang kontrol tertentu.

    Label injeksi 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 menghasilkan label revisi yang sesuai dengan versi Anthos Service Mesh, misalnya: asm-1204-0

    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 di output. Artinya, namespace sebelumnya tidak memiliki label istio.io/rev, yang akan muncul di penginstalan baru Anthos Service Mesh atau deployment baru. Karena injeksi otomatis akan gagal jika namespace memiliki label istio.io/rev dan istio-injection, semua perintah kubectl label dalam dokumentasi Anthos Service Mesh secara eksplisit menentukan kedua label tersebut.

    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 dengan webhook.

  3. Download contoh file konfigurasi .yaml gateway masuk dari anthos-service-mesh-packages repository.

  4. Terapkan contoh konfigurasi .yaml ingress gateway sebagaimana adanya, atau modifikasi 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 praktik terbaik untuk gateway lebih lanjut.

Men-deploy contoh Butik Online

Aplikasi contoh Online Boutique di repo anthos-service-mesh-packages diubah dari kumpulan manifes asli di repo microservices-demo. Dengan mengikuti praktik terbaik, setiap layanan akan 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. Mengaktifkan injeksi file bantuan otomatis (injeksi otomatis). Perintah yang diperlukan bergantung pada apakah Anda ingin menggunakan label injeksi default (misalnya, istio-injection=enabled) atau label revisi yang sama dengan yang Anda gunakan untuk menganotasi namespace gateway masuk

    Label injeksi default

    Terapkan label injeksi default ke namespace. Dalam perintah berikut, GATEWAY_NAMESPACE adalah nilai yang sama dengan yang Anda gunakan untuk menganotasi namespace gateway masuk.

    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. Dalam perintah berikut, REVISION adalah nilai yang sama dengan yang Anda gunakan untuk menganotasi namespace gateway masuk.

    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. Men-deploy aplikasi contoh ke cluster.

    1. Buat deployment dan akun layanan:

      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 cara lain guna menampilkan aplikasi Butik Online, lihat bagian mengekspos dan mengakses aplikasi dalam panduan aplikasi contoh Men-deploy 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 masuk, ganti placeholder dengan informasi berikut:

    • GATEWAY_SERVICE_NAME: nama layanan gateway ingress. Jika Anda men-deploy gateway contoh tanpa modifikasi, konfigurasinya akan menjadi istio-ingressgateway.
    • GATEWAY_NAMESPACE: namespace tempat Anda men-deploy gateway masuk:
    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 masuk adalah 35.239.7.64.

  3. Buka aplikasi pada browser Anda untuk mengonfirmasi penginstalan:

    http://EXTERNAL_IP/
    

Melihat dasbor Service Mesh

Setelah workload Anda di-deploy di cluster dengan proxy file bantuan dimasukkan, Anda dapat menjelajahi halaman Anthos Service Mesh di Konsol Google Cloud untuk melihat semua fitur kemampuan observasi yang ditawarkan Anthos Service Mesh. Perlu diperhatikan bahwa perlu waktu sekitar satu atau dua menit agar data telemetri ditampilkan di Konsol Google Cloud setelah Anda men-deploy workload.

Akses ke Anthos Service Mesh di Konsol Google Cloud dikontrol oleh Identity and Access Management (IAM). Untuk mengakses halaman Anthos Service Mesh, Project Owner harus memberi pengguna peran Project Editor atau Viewer, atau peran yang lebih ketat seperti yang dijelaskan dalam Mengontrol akses ke Anthos Service Mesh di Konsol Google Cloud.

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

    Buka Anthos Service Mesh

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

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

Untuk mempelajari lebih lanjut, lihat Menjelajahi Anthos Service Mesh di Konsol Google Cloud.

Pembersihan

Sebelum melakukan pembersihan, jika Anda tertarik untuk mempelajari TLS bersama lebih lanjut, lihat Anthos Service Mesh melalui 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 biaya 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 selanjutnya