Penggunaan kenari automatik dengan Flagger dan Istio

Penggunaan kenari automatik dengan Flagger dan Istio

CD diiktiraf sebagai amalan perisian perusahaan dan merupakan hasil evolusi semula jadi prinsip CI yang mantap. Walau bagaimanapun, CD masih agak jarang berlaku, mungkin disebabkan oleh kerumitan pengurusan dan ketakutan penggunaan gagal yang menjejaskan ketersediaan sistem.

Penanda ialah pengendali Kubernetes sumber terbuka yang bertujuan untuk menghapuskan hubungan yang mengelirukan. Ia mengautomasikan promosi penggunaan kenari menggunakan offset trafik Istio dan metrik Prometheus untuk menganalisis gelagat aplikasi semasa pelancaran terurus.

Di bawah ialah panduan langkah demi langkah untuk menyediakan dan menggunakan Flagger pada Google Kubernetes Engine (GKE).

Menyediakan gugusan Kubernetes

Anda bermula dengan membuat gugusan GKE dengan alat tambah Istio (jika anda tidak mempunyai akaun GCP, anda boleh mendaftar di sini - untuk mendapatkan kredit percuma).

Log masuk ke Google Cloud, buat projek dan dayakan pengebilan untuknya. Pasang utiliti baris arahan gcloud dan sediakan projek anda dengan gcloud init.

Tetapkan projek lalai, kawasan pengiraan dan zon (ganti PROJECT_ID untuk projek anda):

gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

Dayakan perkhidmatan GKE dan buat kluster dengan alat tambah 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 mencipta kumpulan nod lalai termasuk dua VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, cakera: 30 GB). Sebaik-baiknya, anda harus mengasingkan komponen Istio daripada beban kerja anda, tetapi tiada cara mudah untuk menjalankan Istio Pods dalam kumpulan nod khusus. Manifes Istio dianggap baca sahaja dan GKE akan membuat asal sebarang perubahan, seperti memaut ke nod atau melepaskan diri daripada pod.

Sediakan kelayakan untuk kubectl:

gcloud container clusters get-credentials istio

Buat pengikatan peranan pentadbir kluster:

kubectl create clusterrolebinding "cluster-admin-$(whoami)" 
--clusterrole=cluster-admin 
--user="$(gcloud config get-value core/account)"

Pasang alat baris arahan Helm:

brew install kubernetes-helm

Homebrew 2.0 kini juga tersedia untuk Linux.

Buat akaun perkhidmatan dan pengikat peranan kelompok untuk Tiller:

kubectl -n kube-system create sa tiller && 
kubectl create clusterrolebinding tiller-cluster-rule 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:tiller

Kembangkan Tiller dalam ruang nama kube-system:

helm init --service-account tiller

Anda harus mempertimbangkan untuk menggunakan SSL antara Helm dan Tiller. Untuk maklumat lanjut tentang melindungi pemasangan Helm anda, lihat docs.helm.sh

Sahkan tetapan:

kubectl -n istio-system get svc

Selepas beberapa saat, GCP harus menetapkan alamat IP luaran untuk perkhidmatan tersebut istio-ingressgateway.

Mengkonfigurasi Gerbang Istio Ingress

Buat alamat IP statik dengan nama istio-gatewaymenggunakan alamat IP gerbang Istio:

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

Kini anda memerlukan domain internet dan akses kepada pendaftar DNS anda. Tambah dua rekod A (ganti example.com ke domain anda):

istio.example.com   A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}

Sahkan bahawa kad bebas DNS berfungsi:

watch host test.istio.example.com

Buat get laluan Istio generik untuk menyediakan perkhidmatan di luar jaringan perkhidmatan 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 di atas sebagai public-gateway.yaml dan kemudian gunakannya:

kubectl apply -f ./public-gateway.yaml

Tiada sistem pengeluaran harus menyediakan perkhidmatan di Internet tanpa SSL. Untuk menjamin pintu masuk Istio dengan pengurus sijil, CloudDNS dan Let's Encrypt, sila baca dokumentasi Pembekal G.K.E.

Pemasangan Flagger

Alat tambah GKE Istio tidak termasuk contoh Prometheus yang membersihkan perkhidmatan telemetri Istio. Oleh kerana Flagger menggunakan metrik HTTP Istio untuk melakukan analisis kenari, anda perlu menggunakan konfigurasi Prometheus berikut, serupa dengan konfigurasi yang disertakan dengan skema Helm Istio rasmi.

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml

Tambah repositori Flagger Helm:

helm repo add flagger [https://flagger.app](https://flagger.app/)

Kembangkan Flagger ke ruang nama istio-systemdengan mendayakan 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 boleh memasang Flagger dalam mana-mana ruang nama selagi ia boleh berkomunikasi dengan perkhidmatan Istio Prometheus pada port 9090.

Flagger mempunyai papan pemuka Grafana untuk analisis kenari. Pasang Grafana dalam ruang nama 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

Dedahkan Grafana melalui gerbang terbuka dengan mencipta perkhidmatan maya (ganti example.com ke 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 di atas sebagai grafana-virtual-service.yaml dan kemudian gunakannya:

kubectl apply -f ./grafana-virtual-service.yaml

Apabila berpindah ke http://grafana.istio.example.com dalam penyemak imbas, anda harus diarahkan ke halaman log masuk Grafana.

Menggunakan aplikasi web dengan Flagger

Flagger menggunakan Kubernetes dan secara pilihan menskalakan secara automatik (HPA), kemudian mencipta satu siri objek (penyerahan Kubernetes, perkhidmatan KlusterIP dan perkhidmatan maya Istio). Objek ini mendedahkan aplikasi kepada jaringan perkhidmatan dan mengawal analisis dan kemajuan kenari.

Penggunaan kenari automatik dengan Flagger dan Istio

Buat ruang nama ujian dengan suntikan Istio Sidecar didayakan:

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml

Buat penggunaan dan alat skala keluar automatik pod:

kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml

Gunakan perkhidmatan beban ujian untuk menjana trafik semasa analisis kenari:

helm upgrade -i flagger-loadtester flagger/loadtester 
--namepace=test

Buat sumber kenari tersuai (ganti example.com ke 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 di atas sebagai podinfo-canary.yaml dan kemudian gunakannya:

kubectl apply -f ./podinfo-canary.yaml

Analisis di atas, jika berjaya, akan berjalan selama lima minit, menyemak metrik HTTP setiap setengah minit. Anda boleh menentukan masa minimum yang diperlukan untuk mengesahkan dan mempromosikan penggunaan kenari menggunakan formula berikut: interval * (maxWeight / stepWeight). Medan CRD Canary didokumenkan di sini.

Selepas beberapa saat, Flagger akan mencipta 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 penyemak imbas dan pergi ke app.istio.example.com, anda sepatutnya melihat nombor versi aplikasi demo.

Analisis dan promosi kenari automatik

Flagger melaksanakan gelung kawalan yang mengalihkan trafik secara beransur-ansur ke kanari sambil mengukur metrik prestasi utama seperti kadar kejayaan permintaan HTTP, purata tempoh permintaan dan kesihatan pod. Berdasarkan analisis KPI, kenari dinaikkan atau terganggu, dan hasil analisis diterbitkan kepada Slack.

Penggunaan kenari automatik dengan Flagger dan Istio

Arahan Canary dicetuskan apabila salah satu daripada objek berikut berubah:

  • Gunakan PodSpec (imej bekas, arahan, port, env, dll.)
  • ConfigMaps dipasang sebagai volum atau dipetakan ke pembolehubah persekitaran
  • Rahsia dipasang sebagai volum atau ditukar kepada pembolehubah persekitaran

Jalankan penggunaan kenari apabila mengemas kini imej bekas:

kubectl -n test set image deployment/podinfo 
podinfod=quay.io/stefanprodan/podinfo:1.4.1

Flagger mengesan bahawa versi penggunaan telah berubah dan mula menghuraikannya:

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

Semasa analisis, hasil kenari boleh dikesan menggunakan Grafana:

Penggunaan kenari automatik dengan Flagger dan Istio

Sila ambil perhatian bahawa jika perubahan baharu digunakan pada penggunaan semasa analisis kenari, maka Flagger akan memulakan semula fasa analisis.

Buat senarai semua kenari dalam kelompok 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 mendayakan pemberitahuan Slack, anda akan menerima mesej berikut:

Penggunaan kenari automatik dengan Flagger dan Istio

Balik semula automatik

Semasa analisis kenari, anda boleh menjana ralat HTTP 500 sintetik dan kependaman tindak balas yang tinggi untuk melihat sama ada Flagger akan menghentikan penggunaan.

Buat pod ujian dan lakukan perkara 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

Menjana ralat HTTP 500:

watch curl http://podinfo-canary:9898/status/500

Penjanaan kelewatan:

watch curl http://podinfo-canary:9898/delay/1

Apabila bilangan semakan yang gagal mencapai ambang, trafik dihalakan kembali ke saluran utama, kenari diskalakan kepada sifar dan penggunaan ditandakan sebagai gagal.

Ralat kanari dan lonjakan latensi direkodkan sebagai acara Kubernetes dan dilog 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 mendayakan pemberitahuan Slack, anda akan menerima mesej apabila tarikh akhir melebihi atau bilangan maksimum semakan gagal dalam analisis dicapai:

Penggunaan kenari automatik dengan Flagger dan Istio

Kesimpulannya

Menjalankan mesh perkhidmatan seperti Istio sebagai tambahan kepada Kubernetes akan menyediakan metrik automatik, log dan protokol, tetapi penggunaan beban kerja masih bergantung pada alat luaran. Flagger bertujuan untuk mengubah ini dengan menambahkan keupayaan Istio penyampaian progresif.

Flagger serasi dengan mana-mana penyelesaian CI/CD Kubernetes, dan analisis kenari boleh diperluaskan dengan mudah webhooks untuk melaksanakan ujian penyepaduan/penerimaan sistem, ujian bebanan atau sebarang pemeriksaan tersuai lain. Memandangkan Flagger bersifat deklaratif dan bertindak balas kepada acara Kubernetes, ia boleh digunakan dalam saluran paip GitOps bersama-sama dengan Tenunan Fluks atau JenkinsX. Jika anda menggunakan JenkinsX anda boleh memasang Flagger dengan tambahan jx.

Bendera disokong Tenun dan menyediakan penempatan kenari dalam Tenunan Awan. Projek ini sedang diuji pada GKE, EKS dan logam kosong dengan kubeadm.

Jika anda mempunyai cadangan untuk menambah baik Flagger, sila serahkan isu atau PR di GitHub di stefanprodan/bendera. Sumbangan amat dialu-alukan!

Terima kasih Ray Tsang.

Sumber: www.habr.com

Tambah komen