Automaatne kanaari juurutamine koos Flaggeri ja Istioga

Automaatne kanaari juurutamine koos Flaggeri ja Istioga

CD-d tunnustatakse ettevõtte tarkvarapraktikana ja see on väljakujunenud CI põhimõtete loomulik edasiarendus. Kuid CD on endiselt üsna haruldane, võib-olla halduse keerukuse ja ebaõnnestunud juurutamise kartuse tõttu, mis mõjutab süsteemi kättesaadavust.

Liputaja on avatud lähtekoodiga Kubernetese operaator, mille eesmärk on kõrvaldada segased suhted. See automatiseerib kanaari juurutamise edendamist, kasutades Istio liikluse nihkeid ja Prometheuse mõõdikuid, et analüüsida rakenduse käitumist hallatud levitamise ajal.

Allpool on samm-sammuline juhend Google Kubernetes Engine'is (GKE) Flageri seadistamiseks ja kasutamiseks.

Kubernetese klastri seadistamine

Alustuseks loote Istio lisandmooduliga GKE klastri (kui teil pole GCP kontot, saate registreeruda siin - tasuta krediiti saamiseks).

Logige sisse Google Cloudi, looge projekt ja lubage selle eest arveldamine. Installige käsurea utiliit gpilv ja konfigureerige oma projekt gcloud init.

Määrake vaikeprojekt, arvutusala ja tsoon (asendage PROJECT_ID teie projekti jaoks):

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

Lubage GKE teenus ja looge HPA ja Istio lisandmoodulitega klaster:

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

Ülaltoodud käsk loob vaikesõlmede kogumi, mis koosneb kahest virtuaalsest masinast n1-standard-2 (vCPU: 2, RAM 7,5 GB, ketas: 30 GB). Ideaalis tuleks Istio komponendid töökoormusest eraldada, kuid Istio podide käitamiseks spetsiaalses sõlmekogumis pole lihtsat viisi. Istio manifestid loetakse kirjutuskaitstuks ja GKE tühistab kõik muudatused, nagu sidumine sõlmega või kaustast eraldamine.

Seadistage mandaadid kubectl:

gcloud container clusters get-credentials istio

Looge klastri administraatori rolli sidumine:

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

Installige käsurea tööriist Rooliratas:

brew install kubernetes-helm

Homebrew 2.0 on nüüd saadaval ka jaoks Linux.

Looge Tilleri jaoks teenusekonto ja klastrirolli sidumine:

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

Laiendage nimeruumis Tiller kube-system:

helm init --service-account tiller

Peaksite kaaluma SSL-i kasutamist Helmi ja Tilleri vahel. Helmi paigalduse kaitsmise kohta lisateabe saamiseks vt docs.helm.sh

Kinnitage seaded:

kubectl -n istio-system get svc

Mõne sekundi pärast peaks GCP määrama teenusele välise IP-aadressi istio-ingressgateway.

Istio Ingress Gateway seadistamine

Looge nimega staatiline IP-aadress istio-gatewaykasutades Istio lüüsi IP-aadressi:

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

Nüüd vajate Interneti-domeeni ja juurdepääsu oma DNS-registripidajale. Lisage kaks A-kirjet (asendage example.com teie domeenile):

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

Veenduge, et DNS-i metamärk töötab:

watch host test.istio.example.com

Looge üldine Istio lüüs, et pakkuda teenuseid väljaspool HTTP kaudu teenusevõrku:

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:
        - "*"

Salvestage ülaltoodud ressurss nimega public-gateway.yaml ja seejärel rakendage see:

kubectl apply -f ./public-gateway.yaml

Ükski tootmissüsteem ei tohiks Internetis ilma SSL-ita teenuseid pakkuda. Istio sissepääsu lüüsi kaitsmiseks serdihalduri, CloudDNS-i ja Let's Encrypti abil lugege dokumentatsioon Liputaja G.K.E.

Liputaja paigaldamine

GKE Istio lisandmoodul ei sisalda Prometheuse eksemplari, mis puhastab Istio telemeetriateenust. Kuna Flagger kasutab kanaari analüüsi tegemiseks Istio HTTP-mõõdikuid, peate juurutama järgmise Prometheuse konfiguratsiooni, mis sarnaneb ametliku Istio Helmi skeemiga kaasas olevale.

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

Lisage Flagger Helmi hoidla:

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

Laienda märgistaja nimeruumiks istio-systemlubades Slacki märguanded:

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

Saate installida Flageri mis tahes nimeruumi, kui see suudab suhelda Istio Prometheuse teenusega pordis 9090.

Flaggeril on Grafana armatuurlaud kanaari analüüsi jaoks. Installige Grafana nimeruumi 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

Avage Grafana avatud lüüsi kaudu, luues virtuaalse teenuse (asendage example.com teie domeenile):

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

Salvestage ülaltoodud ressurss nimega grafana-virtual-service.yaml ja seejärel rakendage see:

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

Kui läheb http://grafana.istio.example.com Teie brauser peaks teid suunama Grafana sisselogimislehele.

Veebirakenduste juurutamine Flaggeriga

Flagger juurutab Kubernetese ja vajadusel horisontaalse automaatse skaleerimise (HPA), seejärel loob rea objekte (Kubernetese juurutused, ClusterIP-teenused ja Istio virtuaalteenused). Need objektid paljastavad rakenduse teenusevõrku ning haldavad kanaari analüüsi ja reklaami.

Automaatne kanaari juurutamine koos Flaggeri ja Istioga

Looge testnimeruum, kui Istio Sidecar juurutus on lubatud:

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

Looge podi jaoks juurutus ja automaatne horisontaalse skaleerimise tööriist:

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

Juurutage koormustesti teenus, et genereerida liiklust kanaari analüüsi ajal:

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

Looge kohandatud kanaari ressurss (asendage example.com teie domeenile):

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

Salvestage ülaltoodud ressurss kui podinfo-canary.yaml ja seejärel rakendage see:

kubectl apply -f ./podinfo-canary.yaml

Kui ülaltoodud analüüs õnnestub, kestab see viis minutit, kontrollides HTTP-mõõdikuid iga poole minuti järel. Kanaari juurutamise testimiseks ja edendamiseks kuluva minimaalse aja saate määrata järgmise valemi abil: interval * (maxWeight / stepWeight). Canary CRD väljad on dokumenteeritud siin.

Mõne sekundi pärast loob Flagger kanaarilindude objektid:

# 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

Avage brauser ja minge aadressile app.istio.example.com, peaksite nägema versiooninumbrit demorakendused.

Automaatne kanaari analüüs ja reklaamimine

Flagger rakendab juhtahelat, mis suunab liikluse järk-järgult kanaarile, mõõtes samal ajal peamisi toimivusnäitajaid, nagu HTTP päringu õnnestumise määr, päringu keskmine kestus ja kausta seisund. KPI analüüsi põhjal kanaarilind edutatakse või lõpetatakse ning analüüsi tulemused avaldatakse Slackis.

Automaatne kanaari juurutamine koos Flaggeri ja Istioga

Canary juurutamine käivitub, kui muutub üks järgmistest objektidest:

  • Juurutage PodSpec (konteineri kujutis, käsk, pordid, env jne)
  • ConfigMaps monteeritakse köidetena või teisendatakse keskkonnamuutujateks
  • Saladused paigaldatakse mahtudena või teisendatakse keskkonnamuutujateks

Käivitage konteineri kujutise värskendamisel Canary juurutus:

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

Flagger tuvastab, et juurutusversioon on muutunud, ja hakkab seda analüüsima:

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

Analüüsi ajal saab kanaari tulemusi jälgida Grafana abil:

Automaatne kanaari juurutamine koos Flaggeri ja Istioga

Pange tähele: kui kanaari analüüsi käigus rakendatakse juurutamisel uusi muudatusi, alustab Flagger analüüsifaasi uuesti.

Tehke nimekiri kõigist oma klastri kanaarilindudest:

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

Kui olete lubanud Slacki märguanded, kuvatakse teile järgmised sõnumid.

Automaatne kanaari juurutamine koos Flaggeri ja Istioga

Automaatne tagasipööramine

Kanaari analüüsi ajal saate genereerida sünteetilisi HTTP 500 vigu ja kõrge vastuse latentsusaega, et kontrollida, kas märgistaja peatab juurutamise.

Looge testpulk ja tehke selles järgmist.

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

HTTP 500 vigade genereerimine:

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

Viivituse genereerimine:

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

Kui ebaõnnestunud kontrollide arv jõuab läveni, suunatakse liiklus tagasi esmasele kanalile, kanaari skaala nullitakse ja juurutamine märgitakse nurjunuks.

Kanaari vead ja latentsusajad logitakse Kubernetese sündmustena ja märgistaja salvestab JSON-vormingus:

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

Kui olete lubanud Slacki märguanded, kuvatakse teile teade, kui läbimise tähtaeg või analüüsi ebaõnnestunud ülevaatuste maksimaalne arv on ületatud:

Automaatne kanaari juurutamine koos Flaggeri ja Istioga

Kokkuvõttes

Teenusevõrgu (nt Istio) käitamine Kubernetese peal pakub automaatseid mõõdikuid, logisid ja logisid, kuid töökoormuse juurutamine sõltub siiski välistest tööriistadest. Flagger soovib seda muuta, lisades Istio võimalused progressiivne kohaletoimetamine.

Flagger ühildub kõigi Kubernetes'i CI/CD lahendustega ja kanaari analüüsi saab hõlpsasti laiendada veebihaagid süsteemi integreerimise/aktsepteerimistestide, koormustestide või muude kohandatud testide läbiviimiseks. Kuna märgistaja on deklaratiivne ja reageerib Kubernetese sündmustele, saab seda kasutada GitOpsi torujuhtmetes koos Weave Flux või JenkinsX. Kui kasutate JenkinsX-i, saate installida Flaggeri koos jx-i lisandmoodulitega.

Toetatud märgistaja Weaveworks ja pakub kanaari sisseviimist Weave Cloud. Projekti testitakse GKE, EKS ja kubeadmiga palja metalli peal.

Kui teil on Flaggeri täiustamiseks soovitusi, esitage GitHubis probleem või suhtekorraldus aadressil stefanprodan/liputaja. Kaastööd on rohkem kui teretulnud!

Tänan Ray Tsang.

Allikas: www.habr.com

Lisa kommentaar