Penerapan Canary di Kubernetes #2: Peluncuran Argo

Kami akan menggunakan pengontrol penerapan Argo Rollouts asli k8s dan GitlabCI untuk menjalankan penerapan Canary ke Kubernetes

Penerapan Canary di Kubernetes #2: Peluncuran Argo

https://unsplash.com/photos/V41PulGL1z0

Artikel dalam seri ini

Penyebaran Canary

Kami harap Anda membaca bagian pertama, di mana kami menjelaskan secara singkat apa itu Canary Deployment. Kami juga menunjukkan cara mengimplementasikannya menggunakan sumber daya standar Kubernetes.

Peluncuran Argo

Argo Rollouts adalah pengontrol penerapan asli Kubernetes. Ini menyediakan CRD (Definisi Sumber Daya Kustom) untuk Kubernetes. Berkat itu, kita dapat menggunakan entitas baru: Rollout, yang mengelola penerapan biru-hijau dan canary dengan berbagai opsi konfigurasi.

Pengontrol Argo Rollouts digunakan oleh sumber daya khusus Rollout, Memungkinkan strategi penerapan tambahan seperti blue-green dan canary untuk Kubernetes. Sumber Rollout menyediakan fungsionalitas yang setara Deployment, hanya dengan strategi penerapan tambahan.
sumber Deployments memiliki dua strategi untuk penerapan: RollingUpdate и Recreate. Meskipun strategi ini cocok untuk sebagian besar kasus, untuk penerapan ke server dalam skala yang sangat besar, strategi tambahan digunakan, seperti biru-hijau atau canary, yang tidak tersedia di pengontrol Deployment. Untuk menggunakan strategi ini di Kubernetes, pengguna harus menulis skrip di atas Deployment mereka. Argo Rollouts Controller memaparkan strategi ini sebagai parameter yang sederhana, deklaratif, dan dapat dikonfigurasi.
https://argoproj.github.io/argo-rollouts

Ada juga Argo CI, yang menyediakan antarmuka web yang nyaman untuk digunakan dengan Rollouts, kita akan membahasnya di artikel berikutnya.

Menginstal Peluncuran Argo

Sisi server

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

Di infrastruktur lobak kami (lihat di bawah) kami telah menambahkan install.yaml sebagai i/k8s/argo-rollouts/install.yaml. Dengan cara ini GitlabCI akan menginstalnya ke dalam cluster.

Sisi klien (plugin kubectl)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

Contoh Aplikasi

Merupakan praktik yang baik untuk memiliki repositori terpisah untuk kode aplikasi dan infrastruktur.

Repositori untuk aplikasi

Kim Wuestkamp/k8s-deployment-example-app

Ini adalah API Python+Flask yang sangat sederhana yang mengembalikan respons sebagai JSON. Kami akan membangun paket menggunakan GitlabCI dan memasukkan hasilnya ke Gitlab Registry. Di registri kami memiliki dua versi rilis berbeda:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

Satu-satunya perbedaan di antara keduanya adalah file JSON yang dikembalikan. Kami menggunakan aplikasi ini untuk memvisualisasikan semudah mungkin dengan versi mana kami berkomunikasi.

Repositori infrastruktur

Dalam repositori ini kita akan menggunakan GitlabCI untuk penerapan ke Kubernetes, .gitlab-ci.yml terlihat seperti ini:

image: traherom/kustomize-dockerbefore_script:
   - printenv
   - kubectl versionstages:
 - deploydeploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s    only:
     - master

Untuk menjalankannya sendiri Anda memerlukan cluster, Anda dapat menggunakan Gcloud:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

Anda perlu bercabang https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure dan membuat variabel KUBECONFIG di GitlabCI, yang akan berisi konfigurasi untuk akses kubectl ke klaster Anda.

Di sini Anda dapat membaca tentang cara mendapatkan kredensial untuk sebuah cluster (Gcloud).

Infrastruktur Yaml

Di dalam repositori infrastruktur kami memiliki layanan:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

dan peluncuran.yaml :

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
 replicas: 10
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     id: rollout-canary
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       imagePullPolicy: Always
 strategy:
   canary:
     steps:
     - setWeight: 10
     # Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # two minutes

Rollout bekerja sama dengan Deployment. Jika kita tidak menetapkan strategi pembaruan (seperti canary di sini), maka strategi tersebut akan berperilaku seperti Deployment pembaruan bergulir default.

Kami mendefinisikan dua langkah di yaml untuk penerapan canary:

  1. 10% traffic ke canary (tunggu manual OK)
  2. 50% traffic ke canary (tunggu 2 menit lalu lanjutkan ke 100%)

Melakukan penerapan awal

Setelah penerapan awal, sumber daya kami akan terlihat seperti ini:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Dan kami mendapat respons hanya dari aplikasi versi pertama:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Melakukan Deployment Canary

Langkah 1: 10% lalu lintas

Untuk memulai penerapan canary, kita hanya perlu mengubah versi gambar seperti yang biasa kita lakukan dengan penerapan:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
...
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...

Dan kami mendorong perubahan, sehingga Gitlab CI diterapkan dan kami melihat perubahannya:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Sekarang jika kita mengakses layanan:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Besar! Kami berada di tengah-tengah penerapan kenari kami. Kita dapat melihat kemajuannya dengan menjalankan:

kubectl argo rollouts get rollout rollout-canary

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Langkah 2: 50% lalu lintas:

Sekarang mari kita lanjutkan ke langkah berikutnya: mengarahkan 50% lalu lintas. Kami mengonfigurasi langkah ini untuk dijalankan secara manual:

kubectl argo rollouts promote rollout-canary # continue to step 2

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Dan aplikasi kami mengembalikan 50% tanggapan dari versi baru:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Dan tinjauan peluncuran:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

екрасно.

Langkah 3: 100% lalu lintas:

Kami mengaturnya sehingga setelah 2 menit langkah 50% berakhir secara otomatis dan langkah 100% dimulai:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Dan keluaran aplikasi:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Dan tinjauan peluncuran:

Penerapan Canary di Kubernetes #2: Peluncuran Argo

Penerapan Canary selesai.

Contoh lainnya dengan Argo Rollouts

Ada lebih banyak contoh di sini, seperti cara mengatur pratinjau lingkungan dan perbandingan berdasarkan canary:

https://github.com/argoproj/argo-rollouts/tree/master/examples

Video tentang Peluncuran Argo dan Argo CI

Saya sangat merekomendasikan video ini, ini menunjukkan bagaimana Argo Rollouts dan Argo CI bekerja sama:

Total

Saya sangat menyukai gagasan menggunakan CRD yang mengelola pembuatan jenis penerapan atau replika tambahan, mengarahkan lalu lintas, dll. Bekerja dengan mereka berjalan lancar. Selanjutnya saya ingin menguji integrasi dengan Argo CI.

Namun, tampaknya akan ada merger besar antara Argo CI dan Flux CI, jadi saya mungkin menunggu hingga rilis baru keluar: Argo Fluks.

Apakah Anda punya pengalaman dengan Argo Rollouts atau Argo CI?

Baca juga artikel lainnya di blog kami:

Sumber: www.habr.com

Tambah komentar