Tutorial: Menggunakan strategi penyebaran kenari untuk penyebaran Kubernetes

Layanan Azure DevOps | Azure DevOps Server 2022

Strategi penyebaran kenari berarti menyebarkan versi baru aplikasi di samping versi produksi yang stabil. Anda kemudian dapat melihat bagaimana versi kenari dibandingkan dengan garis besar, sebelum mempromosikan atau menolak penyebaran.

Panduan langkah demi langkah ini mencakup cara menggunakan strategi kenari tugas manifes Kubernetes. Secara khusus, Anda akan mempelajari cara menyiapkan penyebaran kenari untuk Kubernetes, dan alur kerja terkait untuk mengevaluasi kode. Anda kemudian menggunakan kode tersebut untuk membandingkan penyebaran aplikasi dasar dan kenari, sehingga Anda dapat memutuskan apakah akan mempromosikan atau menolak penyebaran kenari.

Jika Anda menggunakan Azure Kubernetes Service, jenis koneksi layanan Azure Resource Manager adalah cara terbaik untuk terhubung ke kluster privat, atau kluster yang menonaktifkan akun lokal.

Prasyarat

Kode Sampel

Fork repositori berikut di GitHub.

https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s

Berikut adalah gambaran umum singkat file di repositori yang digunakan selama panduan ini:

  • ./app:
    • app.py - Server web sederhana berbasis Flask yang diinstrumentasikan dengan menggunakan pustaka instrumentasi Prometheus untuk aplikasi Python. Penghitung kustom disiapkan untuk jumlah respons baik dan buruk yang diberikan, berdasarkan nilai success_rate variabel.
    • Dockerfile - Digunakan untuk membangun gambar dengan setiap perubahan yang dilakukan pada app.py. Dengan setiap perubahan, alur build dipicu dan gambar dibangun dan didorong ke registri kontainer.
  • ./manifests:
    • deployment.yml - Berisi spesifikasi sampleapp beban kerja penyebaran yang sesuai dengan gambar yang diterbitkan sebelumnya. Anda menggunakan file manifes ini tidak hanya untuk versi stabil objek penyebaran, tetapi juga untuk menurunkan varian garis besar dan kenari dari beban kerja.
    • service.yml - Membuat sampleapp layanan. Layanan ini merutekan permintaan ke pod yang dipisahkan oleh penyebaran (stabil, garis besar, dan kenari) yang disebutkan sebelumnya.
  • ./Misc
    • service-monitor.yml - Digunakan untuk menyiapkan objek ServiceMonitor . Objek ini menyiapkan pengikisan metrik Prometheus.
    • fortio-deploy.yml - Digunakan untuk menyiapkan penyebaran fortio. Penyebaran ini kemudian digunakan sebagai alat pengujian beban, untuk mengirim aliran permintaan ke layanan yang sampleapp disebarkan sebelumnya. Aliran permintaan yang dikirim ke sampleapp dirutekan ke pod di bawah ketiga penyebaran (stabil, garis besar, dan kenari).

Catatan

Dalam panduan ini, Anda menggunakan Prometheus untuk instrumentasi dan pemantauan kode. Solusi yang setara, seperti Azure Application Insights, dapat digunakan sebagai alternatif.

Menginstal prometheus-operator

Untuk menginstal Prometheus pada kluster Anda, gunakan perintah berikut dari komputer pengembangan Anda. Anda harus menginstal kubectl dan Helm, dan Anda harus mengatur konteks ke kluster yang ingin Anda sebarkan. Grafana, yang Anda gunakan nanti untuk memvisualisasikan metrik garis besar dan kenari di dasbor, diinstal sebagai bagian dari bagan Helm ini.

Pertama-tama Anda akan menambahkan repositori Bagan Helm Kubernetes Komunitas Prometheus ke penginstalan Helm Anda. Kemudian kamu akan menginstal tumpukan kube-prometheus, kumpulan manifes Kubernetes, dasbor Grafana, dan aturan Prometheus.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update # update local cache
helm install --name sampleapp  prometheus-community/kube-prometheus-stack

Membuat koneksi layanan

  1. Buka Pengaturan>proyek Koneksi Layanan Alur>di menu Azure DevOps.
  2. Buat koneksi layanan registri Docker yang terkait dengan registri kontainer Anda. Beri nama azure-pipelines-canary-k8s.
  3. Buat koneksi layanan Kubernetes untuk kluster Kubernetes dan namespace yang ingin Anda sebarkan. Beri nama azure-pipelines-canary-k8s.

Catatan

Jika Anda menggunakan Azure Kubernetes Service, jenis koneksi layanan Azure Resource Manager adalah cara terbaik untuk terhubung ke kluster privat, atau kluster yang menonaktifkan akun lokal.

Menyiapkan integrasi berkelanjutan

  1. Buka Alur>Buat Alur, dan pilih repositori Anda.

  2. Pada tab Konfigurasi , pilih Alur pemula.

  3. Pada tab Tinjau , ganti YAML alur dengan kode ini.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s
    
    steps:
    - task: Docker@2
      displayName: Build and push image
      inputs:
        containerRegistry: azure-pipelines-canary-k8s #replace with name of your Docker registry service connection
        repository: $(imageName)
        command: buildAndPush
        Dockerfile: app/Dockerfile
        tags: |
          $(Build.BuildId)
    

    Jika koneksi layanan registri Docker yang Anda buat dikaitkan dengan example.azurecr.io, maka gambarnya adalah example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId), berdasarkan konfigurasi sebelumnya.

Mengedit file manifes

Dalam manifests/deployment.yml, ganti <example> dengan URL registri kontainer Anda. Misalnya, setelah penggantian, bidang gambar akan terlihat seperti contosodemo.azurecr.io/azure-pipelines-canary-k8s.

Menyiapkan penyebaran berkelanjutan

Bagian berikut ini menyediakan langkah-langkah untuk menyiapkan penyebaran berkelanjutan, termasuk cara menyebarkan tahap kenari, dan cara mempromosikan atau menolak kenari melalui intervensi manual.

Menyebarkan tahap kenari

Anda dapat menyebarkan dengan YAML atau Klasik.

  1. Buka Lingkungan>Alur>Buat lingkungan.

  2. Buat lingkungan baru.

    • Nama: akscanary
    • Sumber Daya: Pilih Kubernetes.
  3. Pilih Berikutnya, dan konfigurasikan sumber daya Kubernetes Anda sebagai berikut:

    • Penyedia: Azure Kubernetes Service
    • Langganan Azure: Pilih langganan yang menyimpan kluster Kubernetes Anda.
    • Kluster: Pilih kluster Anda.
    • Namespace: Buat namespace baru, dengan nama canarydemo.
  4. Pilih Validasi dan Buat.

  5. Buka Alur. Pilih alur yang Anda buat, dan pilih Edit.

  6. Ubah langkah yang Anda buat sebelumnya untuk sekarang menggunakan tahapan. Tambahkan dua langkah lagi untuk menyalin manifes dan direktori misc sebagai artefak untuk digunakan oleh tahap berturut-turut. Anda mungkin juga ingin memindahkan beberapa nilai ke variabel, untuk penggunaan yang lebih mudah nanti di alur Anda. YAML lengkap Anda sekarang akan terlihat seperti ini.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s
      dockerRegistryServiceConnection: dockerRegistryServiceConnectionName #replace with name of your Docker registry service connection
      imageRepository: 'azure-pipelines-canary-k8s'
      containerRegistry: example.azurecr.io #replace with the name of your container registry, Should be in the format example.azurecr.io
      tag: '$(Build.BuildId)'
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:  
      - job: Build
        displayName: Build
        pool:
          vmImage: ubuntu-latest
        steps:
        - task: Docker@2
          displayName: Build and push image
          inputs:
            containerRegistry: $(dockerRegistryServiceConnection)
            repository: $(imageName)
            command: buildAndPush
            Dockerfile: app/Dockerfile
            tags: |
              $(tag)
    
        - publish: manifests
          artifact: manifests
    
        - publish: misc
          artifact: misc
    
  7. Tambahkan tahap di akhir file YAML Anda untuk menyebarkan versi kenari.

    - stage: DeployCanary
      displayName: Deploy canary
      dependsOn: Build
      condition: succeeded()
    
      jobs:
      - deployment: Deploycanary
        displayName: Deploy canary
        pool:
          vmImage: ubuntu-latest
        environment: 'akscanary.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:
              - task: KubernetesManifest@0
                displayName: Create imagePullSecret
                inputs:
                  action: createSecret
                  secretName: azure-pipelines-canary-k8s
                  dockerRegistryEndpoint: azure-pipelines-canary-k8s
    
              - task: KubernetesManifest@0
                displayName: Deploy to Kubernetes cluster
                inputs:
                  action: 'deploy'
                  strategy: 'canary'
                  percentage: '25'
                  manifests: |
                    $(Pipeline.Workspace)/manifests/deployment.yml
                    $(Pipeline.Workspace)/manifests/service.yml
                  containers: '$(containerRegistry)/$(imageRepository):$(tag)'
                  imagePullSecrets: azure-pipelines-canary-k8s
    
              - task: KubernetesManifest@0
                displayName: Deploy Forbio and ServiceMonitor
                inputs:
                  action: 'deploy'
                  manifests: |
                    $(Pipeline.Workspace)/misc/*
    
  8. Simpan alur Anda dengan menerapkan langsung ke cabang utama. Penerapan ini seharusnya sudah berhasil menjalankan alur Anda.

Intervensi manual untuk mempromosikan atau menolak kenari

Anda dapat melakukan intervensi secara manual dengan YAML atau Klasik.

  1. Buka Lingkungan Alur>Lingkungan> baru.

  2. Konfigurasikan lingkungan baru.

    • Nama: akspromote
    • Sumber Daya: Pilih Kubernetes.
  3. Pilih Berikutnya, dan konfigurasikan sumber daya Kubernetes Anda sebagai berikut:

    • Penyedia: Azure Kubernetes Service
    • Langganan Azure: Pilih langganan yang menyimpan kluster Kubernetes Anda.
    • Kluster: Pilih kluster Anda.
    • Namespace: Pilih namespace, canarydemo, yang Anda buat sebelumnya.
  4. Pilih Validasi dan Buat.

  5. Pilih lingkungan baru akspromote Anda dari daftar lingkungan.

  6. Pilih Persetujuan dan pemeriksaan> Persetujuan. Kemudian pilih ikon elipsis (tiga titik).

  7. Konfigurasikan persetujuan Anda sebagai berikut:

    • Pemberi persetujuan: Tambahkan akun pengguna Anda sendiri.
    • Tingkat Lanjut: Pastikan bahwa kotak Izinkan pemberi persetujuan menyetujui eksekusi mereka sendiri dipilih.
  8. Pilih Buat.

  9. Buka Alur, dan pilih alur yang Anda buat. Kemudian pilih Edit.

  10. Tambahkan tahap lain, PromoteRejectCanary, di akhir file YAML Anda, untuk mempromosikan perubahan.

    - stage: PromoteRejectCanary
      displayName: Promote or Reject canary
      dependsOn: DeployCanary
      condition: succeeded()
    
      jobs:
      - deployment: PromoteCanary
        displayName: Promote Canary
        pool: 
          vmImage: ubuntu-latest
        environment: 'akspromote.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:            
              - task: KubernetesManifest@0
                displayName: promote canary
                inputs:
                  action: 'promote'
                  strategy: 'canary'
                  manifests: '$(Pipeline.Workspace)/manifests/*'
                  containers: '$(containerRegistry)/$(imageRepository):$(tag)'
                  imagePullSecrets: '$(imagePullSecret)'
    
  11. Tambahkan tahap lain, RejectCanary, di akhir file YAML Anda, untuk mengembalikan perubahan.

    - stage: RejectCanary
      displayName: Reject canary
      dependsOn: PromoteRejectCanary
      condition: failed()
    
      jobs:
      - deployment: RejectCanary
        displayName: Reject Canary
        pool: 
          vmImage: ubuntu-latest
        environment: 'akscanary.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:            
              - task: KubernetesManifest@0
                displayName: reject canary
                inputs:
                  action: 'reject'
                  strategy: 'canary'
                  manifests: '$(Pipeline.Workspace)/manifests/*'
    
  12. Simpan alur YAML Anda dengan memilih Simpan, lalu terapkan langsung ke cabang utama.

Menyebarkan versi yang stabil

Anda dapat menyebarkan versi stabil dengan YAML atau Klasik.

Untuk eksekusi pertama alur, versi beban kerja yang stabil, dan versi garis besar atau kenarinya tidak ada di kluster. Untuk menyebarkan versi stabil:

  1. Di app/app.py, ubah success_rate = 5 ke success_rate = 10. Perubahan ini memicu alur, yang mengarah ke build dan dorongan gambar ke registri kontainer. Ini juga akan memicu tahap.DeployCanary
  2. Karena Anda mengonfigurasi persetujuan tentang lingkungan, rilis akan menunggu sebelum menjalankan tahap tersebut akspromote .
  3. Dalam ringkasan eksekusi, pilih Tinjau>Setujui. Ini menyebarkan versi beban kerja yang stabil ( sampleapp penyebaran dalam manifests/deployment.yml) ke namespace layanan.

Memulai alur kerja kenari

Versi beban sampleapp kerja yang stabil sekarang ada di kluster. Selanjutnya, buat perubahan berikut pada aplikasi simulasi:

Di app/app.py, ubah success_rate = 10 ke success_rate = 20.

Perubahan ini memicu alur build, menghasilkan build dan dorongan gambar ke registri kontainer. Proses ini pada gilirannya memicu alur rilis dan memulai tahap Sebarkan kenari .

Mensimulasikan permintaan

Pada komputer pengembangan Anda, jalankan perintah berikut, dan tetap jalankan untuk mengirim aliran permintaan konstan di sampleapp layanan. sampleapp merutekan permintaan ke pod yang dipisahkan oleh penyebaran yang stabil sampleapp , dan ke pod yang dipisahkan sampleapp-baseline oleh penyebaran dan sampleapp-canary . Pemilih yang ditentukan untuk sampleapp berlaku untuk semua pod ini.

FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio /usr/bin/fortio -- load -allow-initial-errors -t 0 http://sampleapp:8080/

Menyiapkan dasbor Grafana

  1. Jalankan perintah penerusan port berikut pada komputer pengembangan lokal Anda untuk dapat mengakses Grafana.

    kubectl port-forward svc/sampleapp-grafana 3000:80
    
  2. Di browser, buka URL berikut.

    http://localhost:3000/login
    
  3. Saat Dimintai kredensial, kecuali adminPassword nilainya ditimpa selama prometheus-operator penginstalan bagan Helm, Anda bisa menggunakan nilai berikut:

    • nama pengguna: admin
    • password: prom-operator
  4. Dari menu di sebelah kiri, pilih +>Grafik Dasbor.>

  5. Pilih di mana saja pada panel yang baru ditambahkan, dan ketik e untuk mengedit panel.

  6. Pada tab Metrik , masukkan kueri berikut ini:

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. Pada tab Umum , ubah nama panel ini menjadi Semua pod sampleapp.

  8. Di bilah gambaran umum di bagian atas halaman, ubah rentang durasi menjadi 5 menit terakhir atau 15 menit terakhir.

  9. Untuk menyimpan panel ini, pilih ikon simpan di bilah gambaran umum.

  10. Panel sebelumnya memvisualisasikan metrik tingkat keberhasilan dari semua varian. Ini termasuk stabil (dari sampleapp penyebaran), garis besar (dari sampleapp-baseline penyebaran), dan kenari (dari sampleapp-canary penyebaran). Anda dapat memvisualisasikan hanya metrik garis besar dan kenari dengan menambahkan panel lain, dengan konfigurasi berikut:

    • Pada tab Umum , untuk Judul, pilih garis besar sampleapp dan kenari.
    • Pada tab Metrik , gunakan kueri berikut ini:
    rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
    

    Catatan

    Panel untuk metrik garis besar dan kenari hanya akan memiliki metrik yang tersedia untuk perbandingan dalam kondisi tertentu. Kondisi ini adalah ketika tahap Sebarkan kenari telah berhasil diselesaikan, dan tahap Kenari Promosikan/tolak sedang menunggu intervensi manual.

    Tip

    Siapkan anotasi untuk dasbor Grafana untuk menggambarkan peristiwa penyelesaian tahap secara visual untuk Menyebarkan kenari dan Mempromosikan/menolak kenari. Ini sangat membantu sehingga Anda tahu kapan harus mulai membandingkan garis besar dengan kenari, dan ketika promosi atau penolakan kenari telah selesai, masing-masing.

Membandingkan garis besar dan kenari

  1. Pada titik ini, tahap Sebarkan kenari telah berhasil diselesaikan (berdasarkan perubahan dari success_rate10 ke 20). Tahap Promosikan/tolak kenari menunggu intervensi manual. Anda sekarang dapat membandingkan tingkat keberhasilan (sebagaimana ditentukan oleh custom_status=good) dari varian garis besar dan kenari di dasbor Grafana. Tampilannya akan terlihat seperti berikut:

    Screenshot that shows a comparison of baseline and canary metrics.

  2. Berdasarkan pengamatan bahwa tingkat keberhasilan lebih tinggi untuk kenari, promosikan kenari. Pilih Lanjutkan dalam tugas intervensi manual.