Cloud Service Mesh dengan contoh: deployment canary

Dalam tutorial ini, Anda akan mempelajari kasus penggunaan umum: meluncurkan deployment canary dengan Cloud Service Mesh menggunakan Istio API.

Apa yang dimaksud dengan deployment canary?

Deployment canary merutekan sebagian kecil traffic ke versi baru microservice, lalu secara bertahap meningkatkan persentase tersebut sambil menghentikan dan menonaktifkan versi lama. Jika terjadi masalah selama proses ini, traffic dapat dialihkan kembali ke versi sebelumnya. Dengan Cloud Service Mesh, Anda dapat merutekan traffic untuk memastikan layanan baru diperkenalkan dengan aman.

Biaya

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

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

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

Setelah menyelesaikan tutorial ini, Anda dapat menghindari biaya berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

Men-deploy Online Boutique

  1. Tetapkan konteks saat ini untuk kubectl ke cluster tempat Anda berencana men-deploy Online Boutique. Perintah ini bergantung pada apakah Anda menyediakan Cloud Service Mesh di cluster GKE atau cluster Kubernetes di luar GKE:

    GKE di Google Cloud

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

    GKE di luar Google Cloud

    kubectl config use-context CLUSTER_NAME 
    
  2. Buat namespace untuk aplikasi contoh dan ingress gateway:

    kubectl create namespace onlineboutique
    
  3. Beri label namespace onlineboutique untuk otomatis memasukkan proxy Envoy. Ikuti langkah-langkah tentang cara mengaktifkan injeksi sidecar otomatis.

  4. Deploy aplikasi contoh. Untuk tutorial ini, Anda akan men-deploy Online Boutique, aplikasi demo microservice.

    kubectl apply \
    -n onlineboutique \
    -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/shared/online-boutique/kubernetes-manifests.yaml
    
  5. Tambahkan label version=v1 ke deployment productcatalog dengan menjalankan perintah berikut:

    kubectl patch deployments/productcatalogservice -p '{"spec":{"template":{"metadata":{"labels":{"version":"v1"}}}}}' \
    -n onlineboutique
    

    Lihat layanan yang Anda deploy:

    kubectl get pods -n onlineboutique
    

    Output yang diharapkan:

    NAME                                     READY   STATUS    RESTARTS   AGE
    adservice-85598d856b-m84m6               2/2     Running   0          2m7s
    cartservice-c77f6b866-m67vd              2/2     Running   0          2m8s
    checkoutservice-654c47f4b6-hqtqr         2/2     Running   0          2m10s
    currencyservice-59bc889674-jhk8z         2/2     Running   0          2m8s
    emailservice-5b9fff7cb8-8nqwz            2/2     Running   0          2m10s
    frontend-77b88cc7cb-mr4rp                2/2     Running   0          2m9s
    loadgenerator-6958f5bc8b-55q7w           2/2     Running   0          2m8s
    paymentservice-68dd9755bb-2jmb7          2/2     Running   0          2m9s
    productcatalogservice-84f95c95ff-c5kl6   2/2     Running   0          114s
    recommendationservice-64dc9dfbc8-xfs2t   2/2     Running   0          2m9s
    redis-cart-5b569cd47-cc2qd               2/2     Running   0          2m7s
    shippingservice-5488d5b6cb-lfhtt         2/2     Running   0          2m7s
    

    2/2 di kolom READY menunjukkan bahwa pod sudah aktif dan berjalan dengan proxy Envoy yang berhasil dimasukkan.

  6. Deploy VirtualService dan DestinationRule untuk productcatalog versi 1:

     kubectl apply -f destination-vs-v1.yaml -n onlineboutique
    
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: productcatalogservice
    spec:
      host: productcatalogservice
      subsets:
      - labels:
          version: v1
        name: v1
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: productcatalogservice
    spec:
      hosts:
      - productcatalogservice
      http:
      - route:
        - destination:
            host: productcatalogservice
            subset: v1

    Perhatikan bahwa hanya v1 yang ada di resource.

  7. Buka aplikasi di browser Anda menggunakan alamat IP eksternal ingress gateway Anda:

    kubectl get services -n GATEWAY_NAMESPACE
    

Bagian berikutnya akan membahas UI Cloud Service Mesh dan menunjukkan cara melihat metrik Anda.

Melihat layanan Anda di Google Cloud konsol

  1. Dikonsol, buka halaman Google Kubernetes Engine (GKE) Enterprise edition Services. Google Cloud

    Buka Google Kubernetes Engine (GKE) Enterprise edition Services

  2. Secara default, Anda melihat layanan dalam tampilan List.

    Ringkasan Tabel memungkinkan Anda mengamati semua layanan, serta metrik penting secara sekilas.

  3. Di kanan atas, klik Topology. Di sini, Anda dapat melihat layanan dan interaksinya satu sama lain.

    Anda dapat meluaskan Services dan melihat Requests per second untuk setiap layanan dengan mengarahkan kursor ke layanan tersebut.

  4. Kembali ke Table View.

  5. Di Services Table, pilih productcatalogservice. Tindakan ini akan membawa Anda ke ringkasan layanan.

  6. Di sisi kiri layar, klik Traffic.

  7. Pastikan 100% traffic masuk ke productcatalogservice masuk ke layanan workload.

Bagian berikutnya akan membahas cara membuat productcatalog layanan versi 2.

Men-deploy layanan versi 2

  1. Untuk tutorial ini, productcatalogservice-v2 memperkenalkan latensi 3 detik ke dalam permintaan dengan kolom EXTRA_LATENCY. Tindakan ini akan menyimulasikan a regresi dalam versi baru layanan.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: productcatalogservice-v2
    spec:
      selector:
        matchLabels:
          app: productcatalogservice
      template:
        metadata:
          labels:
            app: productcatalogservice
            version: v2
        spec:
          containers:
          - env:
            - name: PORT
              value: '3550'
            - name: EXTRA_LATENCY
              value: 3s
            name: server
            image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.6
            livenessProbe:
              exec:
                command: ["/bin/grpc_health_probe", "-addr=:3550"]
            ports:
            - containerPort: 3550
            readinessProbe:
              exec:
                command: ["/bin/grpc_health_probe", "-addr=:3550"]
            resources:
              limits:
                cpu: 200m
                memory: 128Mi
              requests:
                cpu: 100m
                memory: 64Mi
          terminationGracePeriodSeconds: 5

    Terapkan resource ini ke namespace onlineboutique.

    kubectl apply -f productcatalog-v2.yaml -n onlineboutique
    
  2. Periksa pod aplikasi Anda.

    kubectl get pods -n onlineboutique
    

    Output yang diharapkan:

    NAME                                     READY   STATUS    RESTARTS   AGE
    adservice-85598d856b-8wqfd                  2/2     Running   0          25h
    cartservice-c77f6b866-7jwcr                 2/2     Running   0          25h
    checkoutservice-654c47f4b6-n8c6x            2/2     Running   0          25h
    currencyservice-59bc889674-l5xw2            2/2     Running   0          25h
    emailservice-5b9fff7cb8-jjr89               2/2     Running   0          25h
    frontend-77b88cc7cb-bwtk4                   2/2     Running   0          25h
    loadgenerator-6958f5bc8b-lqmnw              2/2     Running   0          25h
    paymentservice-68dd9755bb-dckrj             2/2     Running   0          25h
    productcatalogservice-84f95c95ff-ddhjv      2/2     Running   0          25h
    productcatalogservice-v2-6df4cf5475-9lwjb   2/2     Running   0          8s
    recommendationservice-64dc9dfbc8-7s7cx      2/2     Running   0          25h
    redis-cart-5b569cd47-vw7lw                  2/2     Running   0          25h
    shippingservice-5488d5b6cb-dj5gd            2/2     Running   0          25h
    

    Perhatikan bahwa sekarang ada dua productcatalogservices yang tercantum.

  3. Gunakan DestinationRule untuk menentukan subset layanan. Dalam skenario ini, ada subset untuk v1, lalu subset terpisah untuk productcatalogservice versi 2.

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: productcatalogservice
    spec:
      host: productcatalogservice
      subsets:
      - labels:
          version: v1
        name: v1
      - labels:
          version: v2
        name: v2

    Perhatikan kolom labels. Versi productcatalogservice dibedakan setelah traffic dirutekan oleh VirtualService.

    Terapkan DestinationRule:

    kubectl apply -f destination-v1-v2.yaml -n onlineboutique
    

Membagi traffic antara v1 dan v2

  1. Gunakan VirtualService untuk menentukan sebagian kecil traffic yang akan diarahkan ke productcatalogservice versi 2.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: productcatalogservice
    spec:
      hosts:
      - productcatalogservice
      http:
      - route:
        - destination:
            host: productcatalogservice
            subset: v1
          weight: 75
        - destination:
            host: productcatalogservice
            subset: v2
          weight: 25

    Kolom subset menunjukkan versi, dan kolom weight menunjukkan persentase pembagian traffic. 75% traffic masuk ke productcatalog versi 1, dan 25% masuk ke versi 2.

    Terapkan VirtualService:

    kubectl apply -f vs-split-traffic.yaml -n onlineboutique
    

Jika Anda membuka EXTERNAL_IP ingress cluster, Anda akan melihat bahwa frontend terkadang lebih lambat dimuat.

Di bagian berikutnya, pelajari pembagian traffic di Google Cloud konsol.

Mengamati pembagian traffic di Google Cloud konsol

  1. Kembali ke Google Cloud konsol dan buka halaman GKE Enterprise Services. Buka GKE Enterprise Services

  2. Di kanan atas, klik Topology.

    Luaskan workload productcatalogservice dan perhatikan deployment productcatalogservice dan productcatalogservice-v2.

  3. Kembali ke Table View.

  4. Klik productcatalogservice di Services Table.

  5. Kembali ke Traffic di menu navigasi sebelah kiri.

  6. Perhatikan bahwa traffic masuk dibagi antara v1 dan v2 berdasarkan persentase yang ditentukan dalam file VirtualService, dan ada 2 workload layanan productcatalog.

    Di sisi kanan halaman, Anda akan melihat Requests, Error Rate, dan Latency Metrics. Dengan Cloud Service Mesh, setiap layanan memiliki metrik ini yang diuraikan untuk memberi Anda metrik observasi.

Meluncurkan atau melakukan roll back ke versi

Setelah mengamati metrik selama deployment canary, Anda dapat menyelesaikan peluncuran versi layanan baru, atau melakukan roll back ke versi layanan asli dengan memanfaatkan resource VirtualService.

Meluncurkan

Setelah puas dengan perilaku layanan v2, Anda dapat meningkatkan persentase traffic yang diarahkan ke layanan v2 secara bertahap. Pada akhirnya, traffic dapat 100% diarahkan ke layanan baru di resource VirtualService yang Anda buat di atas dengan menghapus pembagian traffic dari resource tersebut.

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: productcatalogservice
spec:
  hosts:
  - productcatalogservice
  http:
  - route:
    - destination:
        host: productcatalogservice
        subset: v2

Untuk mengarahkan semua traffic ke productcatalogservice versi 2:

kubectl apply -f vs-v2.yaml -n onlineboutique

Roll back

Jika Anda perlu melakukan roll back ke layanan v1, terapkan destination-vs-v1.yaml dari sebelumnya. Tindakan ini hanya mengarahkan traffic ke productcatalogservice versi 1.

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: productcatalogservice
spec:
  hosts:
  - productcatalogservice
  http:
  - route:
    - destination:
        host: productcatalogservice
        subset: v1

Untuk mengarahkan semua traffic ke productcatalogservice versi 1:

kubectl apply -f vs-v1.yaml -n onlineboutique

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Agar tidak dikenakan biaya berkelanjutan pada Google Cloud akun Anda untuk resource yang digunakan dalam tutorial ini, Anda dapat menghapus project atau menghapus setiap resource.

Menghapus project

Di Cloud Shell, hapus project:

gcloud projects delete PROJECT_ID

Menghapus resource

Jika Anda ingin mencegah biaya tambahan, hapus cluster:

gcloud container clusters delete  CLUSTER_NAME  \
  --project=PROJECT_ID \
  --zone=CLUSTER_LOCATION 

Jika Anda mendaftarkan cluster ke fleet menggunakan gcloud container fleet memberships (bukan --enable-fleet atau --fleet-project selama pembuatan cluster), hapus keanggotaan yang tidak aktif:

gcloud container fleet memberships delete  MEMBERSHIP  \
  --project=PROJECT_ID

Jika Anda ingin mempertahankan konfigurasi cluster untuk Cloud Service Mesh, tetapi menghapus contoh Online Boutique:

  1. Hapus namespace aplikasi:

    kubectl delete -f namespace onlineboutique
    

    Output yang diharapkan:

    namespace "onlineboutique" deleted
    
  2. Hapus entri layanan:

    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend.yaml -n onlineboutique
    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend-gateway.yaml -n onlineboutique
    

    Output yang diharapkan:

    serviceentry.networking.istio.io "allow-egress-googleapis" deleted
    serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
    

Langkah berikutnya