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
- Akun Azure dengan langganan aktif. Buat akun secara gratis.
- Akun GitHub. Buat akun GitHub gratis jika Anda belum memilikinya.
- Azure Container Registrydengan hak dorong. Buat Azure Container Registry jika Anda belum memilikinya.
- Kluster Kubernetes. Sebarkan kluster Azure Kubernetes Service (AKS).
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.
- 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
- ./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.
- deployment.yml - Berisi spesifikasi
- ./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 kesampleapp
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
- Buka Pengaturan>proyek Koneksi Layanan Alur>di menu Azure DevOps.
- Buat koneksi layanan registri Docker yang terkait dengan registri kontainer Anda. Beri nama azure-pipelines-canary-k8s.
- 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
Buka Alur>Buat Alur, dan pilih repositori Anda.
Pada tab Konfigurasi , pilih Alur pemula.
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 adalahexample.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.
Buka Lingkungan>Alur>Buat lingkungan.
Buat lingkungan baru.
- Nama: akscanary
- Sumber Daya: Pilih Kubernetes.
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.
Pilih Validasi dan Buat.
Buka Alur. Pilih alur yang Anda buat, dan pilih Edit.
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
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/*
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.
Buka Lingkungan Alur>Lingkungan> baru.
Konfigurasikan lingkungan baru.
- Nama: akspromote
- Sumber Daya: Pilih Kubernetes.
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.
Pilih Validasi dan Buat.
Pilih lingkungan baru
akspromote
Anda dari daftar lingkungan.Pilih Persetujuan dan pemeriksaan> Persetujuan. Kemudian pilih ikon elipsis (tiga titik).
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.
Pilih Buat.
Buka Alur, dan pilih alur yang Anda buat. Kemudian pilih Edit.
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)'
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/*'
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:
- Di app/app.py, ubah
success_rate = 5
kesuccess_rate = 10
. Perubahan ini memicu alur, yang mengarah ke build dan dorongan gambar ke registri kontainer. Ini juga akan memicu tahap.DeployCanary
- Karena Anda mengonfigurasi persetujuan tentang lingkungan, rilis akan menunggu sebelum menjalankan tahap tersebut
akspromote
. - 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
Jalankan perintah penerusan port berikut pada komputer pengembangan lokal Anda untuk dapat mengakses Grafana.
kubectl port-forward svc/sampleapp-grafana 3000:80
Di browser, buka URL berikut.
http://localhost:3000/login
Saat Dimintai kredensial, kecuali
adminPassword
nilainya ditimpa selamaprometheus-operator
penginstalan bagan Helm, Anda bisa menggunakan nilai berikut:- nama pengguna: admin
- password: prom-operator
Dari menu di sebelah kiri, pilih +>Grafik Dasbor.>
Pilih di mana saja pada panel yang baru ditambahkan, dan ketik
e
untuk mengedit panel.Pada tab Metrik , masukkan kueri berikut ini:
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
Pada tab Umum , ubah nama panel ini menjadi Semua pod sampleapp.
Di bilah gambaran umum di bagian atas halaman, ubah rentang durasi menjadi 5 menit terakhir atau 15 menit terakhir.
Untuk menyimpan panel ini, pilih ikon simpan di bilah gambaran umum.
Panel sebelumnya memvisualisasikan metrik tingkat keberhasilan dari semua varian. Ini termasuk stabil (dari
sampleapp
penyebaran), garis besar (darisampleapp-baseline
penyebaran), dan kenari (darisampleapp-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
Pada titik ini, tahap Sebarkan kenari telah berhasil diselesaikan (berdasarkan perubahan dari
success_rate
10
ke20
). Tahap Promosikan/tolak kenari menunggu intervensi manual. Anda sekarang dapat membandingkan tingkat keberhasilan (sebagaimana ditentukan olehcustom_status=good
) dari varian garis besar dan kenari di dasbor Grafana. Tampilannya akan terlihat seperti berikut:Berdasarkan pengamatan bahwa tingkat keberhasilan lebih tinggi untuk kenari, promosikan kenari. Pilih Lanjutkan dalam tugas intervensi manual.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk