Awtomatikong pag-deploy sa canary nga adunay Flagger ug Istio

Awtomatikong pag-deploy sa canary nga adunay Flagger ug Istio

Ang CD giila isip usa ka negosyo nga software practice ug resulta sa natural nga ebolusyon sa natukod nga mga prinsipyo sa CI. Bisan pa, ang CD talagsa ra, tingali tungod sa pagkakomplikado sa pagdumala ug kahadlok sa mga napakyas nga pag-deploy nga makaapekto sa pagkaanaa sa sistema.

Bandera mao ang usa ka open source Kubernetes operator nga nagtumong sa pagwagtang sa makalibog nga mga relasyon. Gi-automate niini ang pag-promote sa mga deployment sa canary gamit ang Istio traffic offset ug Prometheus metrics aron analisahon ang gawi sa aplikasyon atol sa usa ka gidumala nga rollout.

Sa ubos usa ka lakang sa lakang nga giya sa pag-set up ug paggamit sa Flagger sa Google Kubernetes Engine (GKE).

Pagbutang ug Kubernetes cluster

Magsugod ka pinaagi sa paghimo og cluster sa GKE gamit ang Istio add-on (kung wala kay GCP account, pwede ka magpalista dinhi - aron makakuha og libre nga mga kredito).

Pag-sign in sa Google Cloud, paghimo og proyekto, ug i-enable ang pagsingil niini. I-install ang command line utility gcloud ug i-set up ang imong proyekto sa gcloud init.

Itakda ang default nga proyekto, compute area, ug zone (ilis PROJECT_ID para sa imong project):

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

I-enable ang serbisyo sa GKE ug paghimo og cluster nga adunay mga add-on sa HPA ug 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

Ang sugo sa ibabaw maghimo ug default node pool lakip ang duha ka VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Sa tinuud, kinahanglan nimo nga ihimulag ang mga sangkap sa Istio gikan sa imong mga workload, apan wala’y dali nga paagi sa pagpadagan sa Istio Pods sa usa ka gipahinungod nga pool sa mga node. Ang Istio manifests gikonsiderar nga read-only ug ang GKE mo-undo sa bisan unsang mga kausaban, sama sa pag-link sa usa ka node o pagtangtang sa usa ka pod.

I-set up ang mga kredensyal para sa kubectl:

gcloud container clusters get-credentials istio

Paghimo usa ka cluster administrator nga nagbugkos sa papel:

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

I-install ang command line tool Helm:

brew install kubernetes-helm

Ang Homebrew 2.0 magamit na usab alang sa Linux.

Paghimo og account sa serbisyo ug cluster role binding para sa Tiller:

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

Pagpalapad sa Tiller sa namespace kube-system:

helm init --service-account tiller

Kinahanglan nimong hunahunaon ang paggamit sa SSL tali sa Helm ug Tiller. Alang sa dugang nga impormasyon bahin sa pagpanalipod sa imong pag-instalar sa Helm, tan-awa docs.helm.sh

Kumpirma ang mga setting:

kubectl -n istio-system get svc

Human sa pipila ka segundo, ang GCP kinahanglang mag-assign ug external IP address para sa serbisyo istio-ingressgateway.

Pag-configure sa Istio Ingress Gateway

Paghimo og static nga IP address nga adunay ngalan istio-gatewaygamit ang IP address sa 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

Karon kinahanglan nimo ang usa ka domain sa internet ug pag-access sa imong DNS registrar. Pagdugang og duha ka rekord sa A (puli example.com sa imong domain):

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

Tinoa nga ang DNS wildcard nagtrabaho:

watch host test.istio.example.com

Paghimo og generic nga Istio gateway aron makahatag og mga serbisyo sa gawas sa service mesh sa 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:
        - "*"

I-save ang naa sa ibabaw nga kapanguhaan ingon public-gateway.yaml ug dayon i-apply kini:

kubectl apply -f ./public-gateway.yaml

Wala’y sistema sa produksiyon ang kinahanglan maghatag serbisyo sa Internet nga wala ang SSL. Aron ma-secure ang Istio ingress gateway nga adunay cert-manager, CloudDNS ug Let's Encrypt, palihug basaha dokumentasyon Flagger G.K.E.

Pag-instalar sa Flagger

Ang GKE Istio add-on wala maglakip sa usa ka Prometheus nga pananglitan nga naglimpyo sa serbisyo sa telemetry sa Istio. Tungod kay ang Flagger naggamit sa Istio HTTP metrics sa paghimo sa canary analysis, kinahanglan nimo nga i-deploy ang mosunod nga Prometheus configuration, susama sa usa nga kauban sa opisyal nga Istio Helm schema.

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

Idugang ang Flagger Helm repository:

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

Ipalapad ang Flagger sa namespace istio-systempinaagi sa pagpagana sa mga pahibalo sa 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

Mahimo nimong i-install ang Flagger sa bisan unsang namespace basta makakomunikar kini sa serbisyo sa Istio Prometheus sa port 9090.

Ang Flagger adunay dashboard sa Grafana alang sa pagtuki sa kanaryo. I-install ang Grafana sa namespace 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

Ibutyag ang Grafana pinaagi sa usa ka bukas nga ganghaan pinaagi sa paghimo og usa ka virtual nga serbisyo (puli example.com sa imong domain):

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

I-save ang naa sa ibabaw nga kapanguhaan ingon grafana-virtual-service.yaml ug dayon i-apply kini:

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

Sa dihang mobalhin sa http://grafana.istio.example.com sa browser, kinahanglan nga idirekta ka sa panid sa pag-login sa Grafana.

Pag-deploy sa mga aplikasyon sa web gamit ang Flagger

Gi-deploy sa Flagger ang mga Kubernetes ug awtomatiko nga gi-scale out (HPA), dayon nagmugna usa ka serye sa mga butang (mga pag-deploy sa Kubernetes, mga serbisyo sa ClusterIP, ug mga virtual nga serbisyo sa Istio). Gibutyag niini nga mga butang ang aplikasyon sa mesh sa serbisyo ug pagkontrolar sa pagtuki ug pag-uswag sa canary.

Awtomatikong pag-deploy sa canary nga adunay Flagger ug Istio

Paghimo og usa ka test namespace nga adunay Istio Sidecar injection nga naka-enable:

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

Paghimo og deployment ug pod automatic scale-out tool:

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

I-deploy ang usa ka test load service aron makamugna og trapiko atol sa canary analysis:

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

Paghimo usa ka naandan nga kapanguhaan sa canary (ilis example.com sa imong domain):

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/"

I-save ang naa sa ibabaw nga kapanguhaan ingon podinfo-canary.yaml ug dayon i-apply kini:

kubectl apply -f ./podinfo-canary.yaml

Ang pag-analisar sa ibabaw, kung malampuson, modagan sa lima ka minuto, pagsusi sa mga sukatan sa HTTP matag tunga sa minuto. Mahimo nimong mahibal-an ang minimum nga oras nga gikinahanglan aron ma-validate ug ma-promote ang pag-deploy sa canary gamit ang mosunod nga pormula: interval * (maxWeight / stepWeight). Ang mga natad sa Canary CRD gidokumento dinhi.

Pagkahuman sa pila ka segundo, ang Flagger maghimo mga butang nga canary:

# 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

Ablihi ang usa ka browser ug adto sa app.istio.example.com, kinahanglan nimo nga makita ang numero sa bersyon demo nga mga app.

Awtomatikong pagtuki ug promosyon sa canary

Ang Flagger nagpatuman ug control loop nga inanayng nagpalihok sa trapiko ngadto sa canary samtang nagsukod sa importanteng performance metrics sama sa HTTP request success rate, average nga gidugayon sa hangyo, ug pod health. Pinasukad sa pagtuki sa KPI, ang kanaryo gipasiugda o nabalda, ug ang mga resulta sa pagtuki gipatik sa Slack.

Awtomatikong pag-deploy sa canary nga adunay Flagger ug Istio

Ang pag-deploy sa canary ma-trigger kung ang usa sa mga musunud nga butang mausab:

  • I-deploy ang PodSpec (larawan sa sulud, mando, pantalan, env, ug uban pa)
  • Ang ConfigMaps gi-mount isip mga volume o gimapa sa mga variable sa palibot
  • Ang mga sekreto gi-mount isip mga volume o gi-convert sa mga variable sa palibot

Pagdalagan ang canary deploy kung mag-update sa usa ka sulud nga imahe:

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

Ang Flagger nakamatikod nga ang deployment nga bersyon nausab ug nagsugod sa pag-parse niini:

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

Atol sa pagtuki, ang mga resulta sa canary mahimong masubay gamit ang Grafana:

Awtomatikong pag-deploy sa canary nga adunay Flagger ug Istio

Palihug timan-i nga kung ang mga bag-ong pagbag-o magamit sa usa ka pag-deploy sa panahon sa pagtuki sa canary, unya ang Flagger magsugod pag-usab sa yugto sa pagtuki.

Paghimo ug lista sa tanang canary sa imong cluster:

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

Kung gipalihok nimo ang mga pahibalo sa Slack, madawat nimo ang mosunod nga mga mensahe:

Awtomatikong pag-deploy sa canary nga adunay Flagger ug Istio

Awtomatikong rollback

Atol sa pag-analisa sa canary, makamugna ka og sintetikong HTTP 500 nga mga sayop ug taas nga latency sa pagtubag aron masuta kung ang Flagger mohunong sa pag-deploy.

Paghimo og test pod ug buhata ang mosunod niini:

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

Pagmugna og HTTP 500 nga mga sayop:

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

Paglangay nga henerasyon:

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

Sa diha nga ang gidaghanon sa mga napakyas nga mga tseke makaabot sa threshold, ang trapiko ibalik sa nag-unang channel, ang canary gi-scale ngadto sa zero, ug ang deployment gimarkahan nga napakyas.

Ang mga kasaypanan sa canary ug latency spike gi-log isip mga panghitabo sa Kubernetes ug gi-log sa Flagger sa JSON nga format:

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

Kung gipagana nimo ang mga pahibalo sa Slack, makadawat ka usa ka mensahe kung nalapas na ang deadline o ang labing kadaghan nga napakyas nga mga pagsusi sa pag-analisar naabot:

Awtomatikong pag-deploy sa canary nga adunay Flagger ug Istio

Sa konklusyon

Ang pagpadagan sa usa ka service mesh sama sa Istio agig dugang sa Kubernetes maghatag ug awtomatikong metrics, logs, ug protocols, apan ang workload deployment nagdepende gihapon sa external tools. Ang Flagger nagtumong sa pagbag-o niini pinaagi sa pagdugang sa mga kapabilidad sa Istio progresibong suplay.

Nahiuyon ang Flagger sa bisan unsang solusyon sa Kubernetes CI/CD, ug ang pagtuki sa canary dali nga madugangan mga webhook sa paghimo sa system integration/acceptance tests, load tests, o bisan unsang ubang custom checks. Tungod kay ang Flagger deklaratibo ug nagtubag sa mga panghitabo sa Kubernetes, mahimo kini gamiton sa mga pipeline sa GitOps kauban ang Paghabol sa Flux o JenkinsX. Kung naggamit ka JenkinsX mahimo nimong i-install ang Flagger nga adunay mga addon sa jx.

Gisuportahan ang flagger Mga buhat sa paghabol ug naghatag ug canary deployment sa Paghabol sa Cloud. Ang proyekto gisulayan sa GKE, EKS, ug hubo nga metal nga adunay kubeadm.

Kung naa kay mga sugyot sa pagpauswag sa Flagger, palihog pagsumite ug isyu o PR sa GitHub sa stefanprodan/flagger. Ang mga kontribusyon labaw pa sa pag-abiabi!

Бпасибо Ray Tsang.

Source: www.habr.com

Idugang sa usa ka comment