Anthos Service Mesh melalui contoh: Deployment Canary


Dalam tutorial ini, Anda akan memandu kasus penggunaan umum meluncurkan deployment canary dengan Anthos Service Mesh.

Apa itu deployment canary?

Deployment canary mengarahkan sebagian kecil traffic ke versi baru microservice, lalu memungkinkan Anda meluncurkannya secara bertahap ke seluruh basis pengguna, sekaligus menghentikan dan menghentikan versi lama. Jika terjadi masalah selama proses ini, traffic dapat dialihkan kembali ke versi lama. Dengan Anthos Service Mesh, Anda dapat merutekan traffic untuk memastikan bahwa layanan baru diperkenalkan dengan aman.

Anda dapat membaca lebih lanjut tentang pengujian canary di Strategi deployment dan pengujian aplikasi.

Biaya

Dalam dokumen ini, Anda akan 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 tutorial ini, Anda dapat menghindari biaya berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

Deploy Butik Online

  1. Tetapkan konteks saat ini untuk kubectl ke cluster tempat Anda men-deploy Online Boutique:

    gcloud container clusters get-credentials CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION
    
  2. Buat namespace untuk aplikasi contoh dan gateway masuknya:

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

  4. Deploy aplikasi contoh. Untuk tutorial ini, Anda akan men-deploy Online Boutique, yaitu 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
    

    Melihat layanan yang telah 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
    

    Semua pod untuk aplikasi Anda harus sudah aktif dan berjalan, dengan 2/2 di kolom READY. Hal ini menunjukkan bahwa pod memiliki proxy file bantuan Envoy yang berhasil dimasukkan.

  6. Deploy VirtualService dan DestinationRule Anda untuk v1 productcatalog:

    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

    Perlu diketahui bahwa hanya v1 yang ada dalam resource.

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

    kubectl get services -n GATEWAY_NAMESPACE
    

Bagian berikutnya akan membahas UI Anthos Service Mesh dan cara melihat metrik.

Men-deploy dan Melihat layanan Anda di Konsol Google Cloud

  1. Di konsol Google Cloud, buka halaman GKE Enterprise Services.

    Buka GKE Enterprise Services

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

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

    semua beban kerja layanan

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

    Anda dapat memperluas layanan dan melihat permintaan per detik untuk setiap layanan dengan mengarahkan kursor ke layanan tersebut.

    topologi semua workload layanan

  4. Kembali ke Tampilan Tabel.

  5. Di Services Table, pilih productcatalogservice. Anda akan diarahkan ke ringkasan layanan.

  6. Di sisi kiri layar, klik Lalu lintas.

  7. Pastikan 100% traffic masuk ke productcatalogservice dialokasikan ke layanan beban kerja.

    traffic svc productcatalog

Bagian berikutnya akan membahas pembuatan layanan productcatalog v2.

Men-deploy v2 layanan

  1. Untuk tutorial ini, productcatalogservice-v2 akan memperkenalkan latensi 3 detik ke dalam permintaan dengan kolom EXTRA_LATENCY.

    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. DestinationRule adalah cara menentukan subset layanan. Dalam skenario ini, ada subset untuk v1 dan untuk v2 dari productcatalogservice.

    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
    

Memisahkan Traffic antara v1 dan v2

  1. VirtualService adalah cara Anda memperkenalkan sebagian kecil traffic untuk mengarahkan ke v2 dari productcatalogservice.

    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

    Isian {i>subset<i} menunjukkan versi, dan bidang {i>bobot<i} menunjukkan pembagian persentase lalu lintas. 75% traffic akan masuk ke v1 dari productcatalog, dan 25% akan masuk ke v2.

    Terapkan VirtualService:

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

Jika mengunjungi EXTERNAL_IP ingress cluster, Anda akan melihat bahwa secara berkala frontend lebih lambat untuk dimuat.

Di bagian berikutnya, Anda akan mempelajari pemisahan traffic di konsol Google Cloud GKE Enterprise.

Mengamati Pembagian Traffic di Konsol Google Cloud

  1. Kembali ke Konsol Google Cloud, lalu buka halaman GKE Enterprise Services Buka GKE Enterprise Services

  2. Di kanan atas, klik Topologi.

    Perluas beban kerja productcatalogservice. Anda akan melihat deployment productcatalogservice dan productcatalogservice-v2.

    tpoplogy traffic productcatalog svc v1 v2

  3. Kembali ke Table View. Klik productcatalogservice di Tabel Layanan. Kembali ke Traffic di menu navigasi sebelah kiri.

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

    Di sisi kanan layar, Anda akan melihat Permintaan, Tingkat Error, dan Metrik Latensi. Dengan Anthos Service Mesh, setiap layanan akan diuraikan metrik ini untuk memberi Anda kemampuan observasi.

    traffic productcatalog svc v1 v2

Meluncurkan atau Melakukan Rollback ke versi

Setelah mengamati metrik selama deployment canary, Anda dapat meluncurkan ke layanan baru, atau melakukan rollback ke layanan lama dengan memanfaatkan resource VirtualService.

Peluncuran

Setelah Anda puas dengan perilaku layanan v2, tingkatkan perilaku traffic ke layanan v2 secara bertahap. Pada akhirnya, traffic dapat diarahkan 100% ke layanan baru.

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 v2 dari productcatalogservice:

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

Rollback

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

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 v1 dari productcatalogservice:

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

Pembersihan

Agar tidak dikenakan 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-nya.

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

Menghapus project

  1. 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 ingin mempertahankan cluster dan menghapus contoh Butik Online:

    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 selanjutnya