
CD ini diakui sebagai praktik pengembangan perangkat lunak perusahaan, ini adalah hasil evolusi alami dari prinsip CI yang telah mapan. Namun, CD masih merupakan kejadian yang agak jarang, mungkin karena kompleksitas manajemen dan ketakutan penyebaran yang tidak berhasil yang mempengaruhi ketersediaan sistem.
Flagger adalah operator Kubernetes open source yang bertujuan untuk menghilangkan hubungan yang membingungkan. Ini mengotomatiskan promosi penyebaran kenari menggunakan offset lalu lintas Istio dan metrik Prometheus untuk menganalisis perilaku aplikasi selama peluncuran terkelola.
Di bawah ini adalah panduan langkah demi langkah tentang cara mengkonfigurasi dan menggunakan Flagger di Google Kubernetes Engine (GKE).
Konfigurasikan Kubernetes Cluster
Anda mulai dengan membuat cluster GKE dengan add-in Istio (jika Anda tidak memiliki akun GCP, Anda dapat mendaftar di sini untuk menerima kredit gratis).
Masuk ke Google Cloud, buat proyek, dan aktifkan penagihan untuk itu. Instal utilitas baris perintah gcloud dan sesuaikan proyek Anda dengan gcloud init
.
Tetapkan proyek default, area perhitungan, dan zona (ganti PROJECT_ID
dengan proyek Anda):
gcloud config set project PROJECT_ID gcloud config set compute/region us-central1 gcloud config set compute/zone us-central1-a
Aktifkan layanan GKE dan buat cluster dengan add-on HPA dan Istio:
gcloud services enable container.googleapis.com K8S_VERSION=$(gcloud beta container get-server-config --format=json | jq -r '.validMasterVersions[0]') gcloud beta container clusters create istio \ --cluster-version=${K8S_VERSION} \ --zone=us-central1-a \ --num-nodes=2 \ --machine-type=n1-standard-2 \ --disk-size=30 \ --enable-autorepair \ --no-enable-cloud-logging \ --no-enable-cloud-monitoring \ --addons=HorizontalPodAutoscaling,Istio \ --istio-config=auth=MTLS_PERMISSIVE
Perintah di atas akan membuat kumpulan simpul default yang mencakup dua VMs n1-standard-2
(vCPU: 2, RAM 7.5 GB, disk: 30 GB). Idealnya, ada baiknya mengisolasi komponen Istio dari beban kerjanya, tetapi tidak ada cara mudah untuk menjalankan pod Istio di kumpulan node khusus. Manifes Istio dianggap hanya-baca, dan GKE akan membatalkan perubahan apa pun, seperti mengikat ke sebuah simpul atau memutuskan sambungan dari perapian.
Konfigurasikan kredensial untuk kubectl
:
gcloud container clusters get-credentials istio
Buat pengikatan peran administrator kluster:
kubectl create clusterrolebinding "cluster-admin-$(whoami)" \ --clusterrole=cluster-admin \ --user="$(gcloud config get-value core/account)"
Instal alat baris perintah Helm :
brew install kubernetes-helm
Homebrew 2.0 sekarang juga tersedia untuk Linux .
Buat akun layanan dan pengikatan peran kluster untuk Tiller:
kubectl -n kube-system create sa tiller && \ kubectl create clusterrolebinding tiller-cluster-rule \ --clusterrole=cluster-admin \ --serviceaccount=kube-system:tiller
Perluas Anakan di kube-system
:
helm init --service-account tiller
Anda harus mempertimbangkan untuk menggunakan SSL antara Helm dan Tiller. Untuk informasi lebih lanjut tentang pengamanan instalasi Helm, lihat docs.helm.sh
Konfirmasikan pengaturan:
kubectl -n istio-system get svc
Setelah beberapa detik, GCP harus menetapkan alamat IP eksternal untuk layanan istio-ingressgateway
.
Pengaturan Input Gateway Istio
Buat alamat IP statis yang disebut istio-gateway
menggunakan alamat IP dari Istio gateway:
export GATEWAY_IP=$(kubectl -n istio-system get svc/istio-ingressgateway -ojson | jq -r .status.loadBalancer.ingress[0].ip) gcloud compute addresses create istio-gateway --addresses ${GATEWAY_IP} --region us-central1
Sekarang Anda memerlukan domain Internet dan akses ke pendaftar DNS Anda. Tambahkan dua entri A (ganti example.com
dengan domain Anda):
istio.example.com A ${GATEWAY_IP} *.istio.example.com A ${GATEWAY_IP}
Verifikasi bahwa wildcard DNS berfungsi:
watch host test.istio.example.com
Buat gerbang umum Istio untuk menyediakan layanan di luar jala layanan melalui HTTP:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: public-gateway namespace: istio-system spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
Simpan sumber daya di atas sebagai public-gateway.yaml dan kemudian terapkan:
kubectl apply -f ./public-gateway.yaml
Tidak ada sistem produksi yang menyediakan layanan di Internet tanpa SSL. Untuk melindungi gateway Istio dengan manajer-sertifikat, CloudDNS, dan Let's Encrypt, baca dokumentasi Flagger GKE.
Instalasi Flagger
Add-in GKE Istio tidak termasuk instance Prometheus, yang membersihkan layanan telemetri Istio. Karena Flagger menggunakan metrik HTTP Istio untuk melakukan analisis kenari, Anda perlu menggunakan konfigurasi Prometheus berikut yang serupa dengan yang disediakan dengan skema Istio Helm resmi.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Tambahkan repositori Flagger Helm:
helm repo add flagger https://flagger.app
Perluas Flagger di istio-system
istio istio-system
mengaktifkan pemberitahuan Slack:
helm upgrade -i flagger flagger/flagger \ --namespace=istio-system \ --set metricsServer=http://prometheus.istio-system:9090 \ --set slack.url=https://hooks.slack.com/services/YOUR-WEBHOOK-ID \ --set slack.channel=general \ --set slack.user=flagger
Anda dapat menginstal Flagger di namespace apa pun jika dapat berkomunikasi dengan layanan Istio Prometheus melalui port 9090.
Flagger memiliki dasbor Grafana untuk analisis kenari. Instal Grafana di istio-system
:
helm upgrade -i flagger-grafana flagger/grafana \ --namespace=istio-system \ --set url=http://prometheus.istio-system:9090 \ --set user=admin \ --set password=change-me
Perluas Grafana melalui gateway terbuka dengan membuat layanan virtual (ganti example.com
dengan domain Anda):
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: grafana namespace: istio-system spec: hosts: - "grafana.istio.example.com" gateways: - public-gateway.istio-system.svc.cluster.local http: - route: - destination: host: flagger-grafana
Simpan sumber daya di atas sebagai grafana-virtual-service.yaml dan kemudian terapkan:
kubectl apply -f ./grafana-virtual-service.yaml
Saat Anda masuk ke http://grafana.istio.example.com
di browser, Anda harus diarahkan ke halaman login Grafana.
Penerapan Aplikasi Web dengan Flagger
Flagger menyebarkan Kubernetes dan, jika perlu, penskalaan otomatis horizontal (HPA), kemudian membuat serangkaian objek (penyebaran Kubernetes, layanan ClusterIP, dan layanan virtual Istio). Objek-objek ini membuka aplikasi di jala layanan dan mengelola analisis dan promosi kenari.

Buat ruang nama pengujian dengan penerapan Istio Sidecar diaktifkan:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Buat penyebaran dan perapian alat penskalaan horizontal otomatis:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Menyebarkan layanan uji beban untuk menghasilkan lalu lintas selama analisis kenari:
helm upgrade -i flagger-loadtester flagger/loadtester \ --namepace=test
Buat sumber kenari kustom (ganti example.com
dengan domain Anda):
apiVersion: flagger.app/v1alpha3 kind: Canary metadata: name: podinfo namespace: test spec: targetRef: apiVersion: apps/v1 kind: Deployment name: podinfo progressDeadlineSeconds: 60 autoscalerRef: apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler name: podinfo service: port: 9898 gateways: - public-gateway.istio-system.svc.cluster.local hosts: - app.istio.example.com canaryAnalysis: interval: 30s threshold: 10 maxWeight: 50 stepWeight: 5 metrics: - name: istio_requests_total threshold: 99 interval: 30s - name: istio_request_duration_seconds_bucket threshold: 500 interval: 30s webhooks: - name: load-test url: http://flagger-loadtester.test/ timeout: 5s metadata: cmd: "hey -z 1m -q 10 -c 2 http://podinfo.test:9898/"
Simpan sumber daya di atas sebagai podinfo-canary.yaml dan kemudian terapkan:
kubectl apply -f ./podinfo-canary.yaml
Analisis di atas, jika berhasil, akan dilakukan dalam lima menit, dengan metrik HTTP diperiksa setiap setengah menit. Anda dapat menentukan waktu minimum yang diperlukan untuk memverifikasi dan mempromosikan penyebaran kenari dengan menggunakan rumus berikut: interval * (maxWeight / stepWeight)
. Bidang CRD Canary didokumentasikan di sini .
Dalam beberapa detik, Flagger akan membuat objek kenari:
# applied deployment.apps/podinfo horizontalpodautoscaler.autoscaling/podinfo canary.flagger.app/podinfo # generated deployment.apps/podinfo-primary horizontalpodautoscaler.autoscaling/podinfo-primary service/podinfo service/podinfo-canary service/podinfo-primary virtualservice.networking.istio.io/podinfo
Buka browser dan buka app.istio.example.com
, Anda harus melihat nomor versi aplikasi demo .
Analisis dan promosi kenari otomatis
Flagger mengimplementasikan loop kontrol yang secara bertahap memindahkan lalu lintas ke kenari, sambil mengukur indikator kinerja utama, misalnya, tingkat keberhasilan permintaan HTTP, durasi rata-rata permintaan, dan kinerja perapian. Berdasarkan analisis tersebut, kenari KPI berkembang atau terputus, dan hasil analisisnya dipublikasikan di Slack.

Pemasangan Canary dimulai ketika salah satu objek berikut berubah:
- Menyebarkan PodSpec (gambar kontainer, perintah, port, env, dll.)
- ConfigMaps dipasang sebagai volume atau dikonversi ke variabel lingkungan
- Rahasia dipasang sebagai volume atau dikonversi ke variabel lingkungan
Meluncurkan penyebaran kenari saat memperbarui gambar kontainer:
kubectl -n test set image deployment/podinfo \ podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger menemukan bahwa versi penyebaran telah berubah, dan mulai menganalisisnya:
kubectl -n test describe canary/podinfo Events: New revision detected podinfo.test Scaling up podinfo.test Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available Advance podinfo.test canary weight 5 Advance podinfo.test canary weight 10 Advance podinfo.test canary weight 15 Advance podinfo.test canary weight 20 Advance podinfo.test canary weight 25 Advance podinfo.test canary weight 30 Advance podinfo.test canary weight 35 Advance podinfo.test canary weight 40 Advance podinfo.test canary weight 45 Advance podinfo.test canary weight 50 Copying podinfo.test template spec to podinfo-primary.test Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available Promotion completed! Scaling down podinfo.test
Selama analisis, hasil kenari dapat dilacak menggunakan Grafana:

Harap dicatat: jika perubahan baru diterapkan pada penyebaran selama analisis kenari, Flagger akan memulai kembali fase analisis.
Buat daftar semua "kenari" di kluster Anda:
watch kubectl get canaries --all-namespaces NAMESPACE NAME STATUS WEIGHT LASTTRANSITIONTIME test podinfo Progressing 15 2019-01-16T14:05:07Z prod frontend Succeeded 0 2019-01-15T16:15:07Z prod backend Failed 0 2019-01-14T17:05:07Z
Jika Anda telah mengaktifkan pemberitahuan Slack, Anda akan menerima pesan-pesan berikut:

Rollback otomatis
Selama analisis kenari, Anda dapat menghasilkan kesalahan HTTP 500 sintetik dan penundaan respons tinggi untuk memeriksa apakah Flagger akan menghentikan penyebaran.
Buat sub tes dan lakukan hal berikut di dalamnya:
kubectl -n test run tester \ --image=quay.io/stefanprodan/podinfo:1.2.1 \ -- ./podinfo --port=9898 kubectl -n test exec -it tester-xx-xx sh
Pembuatan Galat HTTP 500:
watch curl http://podinfo-canary:9898/status/500
Generasi Delay:
watch curl http://podinfo-canary:9898/delay/1
Ketika jumlah pemeriksaan gagal mencapai nilai ambang batas, lalu lintas dialihkan kembali ke saluran utama, kenari diskalakan ke nol, dan penyebaran ditandai sebagai tidak berhasil.
Kesalahan kenari dan puncak penundaan dicatat sebagai peristiwa Kubernetes dan dicatat oleh Flagger dalam format JSON:
kubectl -n istio-system logs deployment/flagger -f | jq .msg Starting canary deployment for podinfo.test Advance podinfo.test canary weight 5 Advance podinfo.test canary weight 10 Advance podinfo.test canary weight 15 Halt podinfo.test advancement success rate 69.17% < 99% Halt podinfo.test advancement success rate 61.39% < 99% Halt podinfo.test advancement success rate 55.06% < 99% Halt podinfo.test advancement success rate 47.00% < 99% Halt podinfo.test advancement success rate 37.00% < 99% Halt podinfo.test advancement request duration 1.515s > 500ms Halt podinfo.test advancement request duration 1.600s > 500ms Halt podinfo.test advancement request duration 1.915s > 500ms Halt podinfo.test advancement request duration 2.050s > 500ms Halt podinfo.test advancement request duration 2.515s > 500ms Rolling back podinfo.test failed checks threshold reached 10 Canary failed! Scaling down podinfo.test
Jika Anda telah mengaktifkan pemberitahuan Slack, Anda akan menerima pesan ketika tenggat waktu tercapai atau ketika jumlah maksimum pemeriksaan gagal selama analisis tercapai:

Kesimpulannya
Meluncurkan layanan mesh, seperti Istio, selain Kubernetes akan menyediakan metrik otomatis, log, dan protokol, tetapi penyebaran beban kerja masih tergantung pada alat eksternal. Flagger berupaya mengubah ini dengan menambahkan kemampuan pengiriman progresif Istio.
Flagger kompatibel dengan solusi Kubernetes CI / CD, dan analisis kenari dapat dengan mudah diperpanjang menggunakan webhooks untuk melakukan tes integrasi / penerimaan sistem, tes stres atau tes pengguna lainnya. Karena Flagger bersifat deklaratif dan responsif terhadap peristiwa Kubernetes, Flagger dapat digunakan pada saluran pipa GitOps dengan Weave Flux atau JenkinsX . Jika Anda menggunakan JenkinsX, Anda dapat menginstal Flagger dengan pengaya jx.
Flagger didukung oleh Weaveworks dan menyediakan penyebaran kenari ke Weave Cloud . Proyek ini diuji pada GKE, EX dan bare metal dengan kubeadm.
Jika Anda memiliki saran untuk meningkatkan Flagger, silakan kirim pertanyaan atau PR ke GitHub di stefanprodan / flagger . Kontribusi lebih dari diterima!
Terima kasih Ray Tsang .