Gosodiadau caneri awtomatig gyda Flagger ac Istio

Gosodiadau caneri awtomatig gyda Flagger ac Istio

Mae CD yn cael ei gydnabod fel arfer meddalwedd menter ac mae'n ganlyniad esblygiad naturiol o egwyddorion CI sefydledig. Fodd bynnag, mae CD yn dal yn eithaf prin, efallai oherwydd cymhlethdod y rheolaeth a'r ofn y bydd defnydd methu yn effeithio ar argaeledd y system.

Baner yn weithredwr ffynhonnell agored Kubernetes sy'n anelu at ddileu perthnasoedd dryslyd. Mae'n awtomeiddio'r broses o hyrwyddo gosodiadau caneri gan ddefnyddio mesurau gwrthbwyso traffig Istio a Prometheus i ddadansoddi ymddygiad cymwysiadau yn ystod cyflwyniad wedi'i reoli.

Isod mae canllaw cam wrth gam ar sefydlu a defnyddio Flagger ar Google Kubernetes Engine (GKE).

Sefydlu clwstwr Kubernetes

Rydych chi'n dechrau trwy greu clwstwr GKE gyda'r ychwanegiad Istio (os nad oes gennych chi gyfrif GCP, gallwch chi gofrestru yma - i gael credydau am ddim).

Mewngofnodwch i Google Cloud, creu prosiect, a galluogi bilio ar ei gyfer. Gosodwch y cyfleustodau llinell orchymyn cloud a sefydlu eich prosiect gyda gcloud init.

Gosod y prosiect diofyn, yr ardal gyfrifo, a'r parth (disodli PROJECT_ID ar gyfer eich prosiect):

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

Galluogi gwasanaeth GKE a chreu clwstwr gydag ychwanegion HPA ac 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

Bydd y gorchymyn uchod yn creu cronfa nodau diofyn gan gynnwys dau VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, disg: 30 GB). Yn ddelfrydol, dylech ynysu cydrannau Istio o'ch llwythi gwaith, ond nid oes ffordd hawdd o redeg Istio Pods mewn cronfa bwrpasol o nodau. Ystyrir maniffestau Istio yn ddarllenadwy yn unig a bydd GKE yn dad-wneud unrhyw newidiadau, megis cysylltu Γ’ nod neu ddatgysylltu o god.

Sefydlu tystlythyrau ar gyfer kubectl:

gcloud container clusters get-credentials istio

Creu rΓ΄l gweinyddwr clwstwr sy'n rhwymo:

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

Gosodwch yr offeryn llinell orchymyn Helm:

brew install kubernetes-helm

Mae Homebrew 2.0 bellach ar gael ar gyfer Linux.

Creu cyfrif gwasanaeth a rΓ΄l clwstwr ar gyfer Tiller:

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

Ehangu Tiller yn y gofod enwau kube-system:

helm init --service-account tiller

Dylech ystyried defnyddio SSL rhwng Helm a Tiller. Am ragor o wybodaeth am ddiogelu eich gosodiad Helm, gweler docs.helm.sh

Cadarnhau gosodiadau:

kubectl -n istio-system get svc

Ar Γ΄l ychydig eiliadau, dylai GCP neilltuo cyfeiriad IP allanol ar gyfer y gwasanaeth istio-ingressgateway.

Ffurfweddu Porth Mynediad Istio

Creu cyfeiriad IP statig gydag enw istio-gatewaygan ddefnyddio cyfeiriad IP porth 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

Nawr mae angen parth rhyngrwyd arnoch chi a mynediad i'ch cofrestrydd DNS. Ychwanegu dau gofnod A (amnewid example.com i'ch parth):

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

Gwiriwch fod y cerdyn gwyllt DNS yn gweithio:

watch host test.istio.example.com

Creu porth Istio generig i ddarparu gwasanaethau y tu allan i'r rhwyll gwasanaeth dros 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:
        - "*"

Arbedwch yr adnodd uchod fel public-gateway.yaml ac yna ei gymhwyso:

kubectl apply -f ./public-gateway.yaml

Ni ddylai unrhyw system gynhyrchu ddarparu gwasanaethau ar y Rhyngrwyd heb SSL. I ddiogelu porth mynediad Istio gyda'r rheolwr tystysgrif, CloudDNS a Let's Encrypt, darllenwch dogfennaeth Flagger G.K.E.

Gosodiad Flagger

Nid yw ychwanegiad GKE Istio yn cynnwys enghraifft Prometheus sy'n glanhau gwasanaeth telemetreg Istio. Gan fod Flagger yn defnyddio metrigau Istio HTTP i wneud dadansoddiad caneri, mae angen i chi ddefnyddio'r ffurfweddiad Prometheus canlynol, yn debyg i'r un sy'n dod gyda sgema swyddogol Istio Helm.

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

Ychwanegu ystorfa Flagger Helm:

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

Ehangu Flagger i'r gofod enw istio-systemtrwy alluogi hysbysiadau 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

Gallwch osod Flagger mewn unrhyw ofod enw cyn belled ag y gall gyfathrebu Γ’ gwasanaeth Istio Prometheus ar borth 9090.

Mae gan Flagger ddangosfwrdd Grafana ar gyfer dadansoddi caneri. Gosod Grafana mewn gofod enwau 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

Amlygwch Grafana trwy borth agored trwy greu gwasanaeth rhithwir (amnewid example.com i'ch parth):

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

Arbedwch yr adnodd uchod fel grafana-virtual-service.yaml ac yna ei gymhwyso:

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

Wrth symud i http://grafana.istio.example.com yn y porwr, dylech gael eich cyfeirio at dudalen mewngofnodi Grafana.

Defnyddio cymwysiadau gwe gyda Flagger

Mae Flagger yn defnyddio Kubernetes ac yn graddio'n awtomatig yn ddewisol (HPA), yna'n creu cyfres o wrthrychau (defnyddio Kubernetes, gwasanaethau ClusterIP, a gwasanaethau rhithwir Istio). Mae'r gwrthrychau hyn yn amlygu'r cais i'r rhwyll gwasanaeth ac yn rheoli dadansoddiad caneri a chynnydd.

Gosodiadau caneri awtomatig gyda Flagger ac Istio

Creu gofod enw prawf gyda chwistrelliad Istio Sidecar wedi'i alluogi:

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

Creu gosodiad a pod teclyn ehangu awtomatig:

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

Defnyddio gwasanaeth llwyth prawf i gynhyrchu traffig yn ystod dadansoddiad caneri:

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

Creu adnodd caneri wedi'i deilwra (amnewid example.com i'ch parth):

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

Arbedwch yr adnodd uchod fel podinfo-canary.yaml ac yna ei gymhwyso:

kubectl apply -f ./podinfo-canary.yaml

Bydd y dadansoddiad uchod, os bydd yn llwyddiannus, yn rhedeg am bum munud, gan wirio metrigau HTTP bob hanner munud. Gallwch benderfynu ar yr amser lleiaf sydd ei angen i ddilysu a hyrwyddo lleoliad caneri gan ddefnyddio'r fformiwla ganlynol: interval * (maxWeight / stepWeight). Mae meysydd CRD Dedwydd wedi'u dogfennu yma.

Ar Γ΄l ychydig eiliadau, bydd Flagger yn creu gwrthrychau caneri:

# 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

Agorwch borwr ac ewch i app.istio.example.com, dylech weld rhif y fersiwn apps demo.

Dadansoddi a hyrwyddo caneri'n awtomatig

Mae Flagger yn gweithredu dolen reoli sy'n symud traffig yn raddol i'r caneri wrth fesur metrigau perfformiad allweddol fel cyfradd llwyddiant ceisiadau HTTP, hyd cyfartalog ceisiadau, ac iechyd codennau. Yn seiliedig ar y dadansoddiad DPA, mae'r caneri'n cael ei hyrwyddo neu ei ymyrryd, a chyhoeddir canlyniadau'r dadansoddiad i Slack.

Gosodiadau caneri awtomatig gyda Flagger ac Istio

Mae lleoli caneri yn cael ei sbarduno pan fydd un o'r gwrthrychau canlynol yn newid:

  • Defnyddio PodSpec (delwedd cynhwysydd, gorchymyn, porthladdoedd, amg, ac ati)
  • Mae ConfigMaps yn cael eu gosod fel cyfeintiau neu eu mapio i newidynnau amgylchedd
  • Mae cyfrinachau'n cael eu gosod fel cyfrolau neu'n cael eu trosi i newidynnau amgylchedd

Rhedeg gosod caneri wrth ddiweddaru delwedd cynhwysydd:

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

Mae Flagger yn canfod bod y fersiwn lleoli wedi newid ac yn dechrau ei dosrannu:

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

Yn ystod y dadansoddiad, gellir olrhain canlyniadau caneri gan ddefnyddio Grafana:

Gosodiadau caneri awtomatig gyda Flagger ac Istio

Sylwch, os bydd newidiadau newydd yn cael eu cymhwyso i ddefnydd yn ystod dadansoddiad caneri, yna bydd Flagger yn ailgychwyn y cam dadansoddi.

Gwnewch restr o'r holl ganeri yn eich clwstwr:

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

Os ydych wedi galluogi hysbysiadau Slack, byddwch yn derbyn y negeseuon canlynol:

Gosodiadau caneri awtomatig gyda Flagger ac Istio

Dychweliad awtomatig

Yn ystod dadansoddiad caneri, gallwch gynhyrchu gwallau HTTP 500 synthetig a hwyrni ymateb uchel i weld a fydd Flagger yn atal y defnydd.

Creu pod prawf a gwneud y canlynol ynddo:

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

Cynhyrchu gwallau HTTP 500:

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

Cynhyrchu oedi:

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

Pan fydd nifer y gwiriadau a fethwyd yn cyrraedd y trothwy, mae'r traffig yn cael ei gyfeirio yn Γ΄l i'r sianel gynradd, mae'r caneri wedi'i raddio i sero, ac mae'r lleoliad wedi'i farcio fel methu.

Mae gwallau caneri a phigau hwyrni yn cael eu cofnodi fel digwyddiadau Kubernetes a'u cofnodi gan Flagger mewn fformat 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

Os ydych wedi galluogi hysbysiadau Slack, byddwch yn derbyn neges pan eir y tu hwnt i'r dyddiad cau neu pan gyrhaeddir y nifer uchaf o wiriadau a fethwyd yn y dadansoddiad:

Gosodiadau caneri awtomatig gyda Flagger ac Istio

I gloi

Bydd rhedeg rhwyll gwasanaeth fel Istio yn ogystal Γ’ Kubernetes yn darparu metrigau, logiau a phrotocolau awtomatig, ond mae defnyddio llwyth gwaith yn dal i ddibynnu ar offer allanol. Nod Flagger yw newid hyn trwy ychwanegu galluoedd Istio cyflwyno blaengar.

Mae Flagger yn gydnaws ag unrhyw ddatrysiad CI/CD Kubernetes, a gellir ymestyn dadansoddiad caneri yn hawdd bachau gwe i berfformio profion integreiddio / derbyn system, profion llwytho, neu unrhyw wiriadau arferol eraill. Gan fod Flagger yn ddatganiadol ac yn ymateb i ddigwyddiadau Kubernetes, gellir ei ddefnyddio mewn piblinellau GitOps ynghyd Γ’ Fflwcs Gwehyddu neu JenkinsX. Os ydych yn defnyddio JenkinsX gallwch osod Flagger gydag addons jx.

Cefnogir fflagiwr Gwehwaith ac yn darparu lleoliadau caneri yn Cwmwl Gwehyddu. Mae'r prosiect yn cael ei brofi ar GKE, EKS, a metel noeth gyda kubeadm.

Os oes gennych awgrymiadau i wella Flagger, cyflwynwch fater neu gysylltiadau cyhoeddus ar GitHub yn stefanprodan / fflagiwr. Mae croeso i gyfraniadau!

Diolch Ray Tsang.

Ffynhonnell: hab.com

Ychwanegu sylw