Samodejne uvedbe Canary s programoma Flagger in Istio

Samodejne uvedbe Canary s programoma Flagger in Istio

CD je priznan kot programska oprema podjetja in je naravni razvoj uveljavljenih načel CI. Vendar je CD še vedno precej redek, morda zaradi zapletenosti upravljanja in strahu, da bi neuspele uvedbe vplivale na razpoložljivost sistema.

Označevalec je odprtokodni operater Kubernetes, katerega cilj je odpraviti nejasna razmerja. Avtomatizira promocijo uvedb Canary z uporabo prometnih odmikov Istio in metrik Prometheus za analizo vedenja aplikacij med upravljanim uvajanjem.

Spodaj je vodnik po korakih za nastavitev in uporabo Flaggerja na Google Kubernetes Engine (GKE).

Nastavitev gruče Kubernetes

Začnete z ustvarjanjem gruče GKE z dodatkom Istio (če nimate računa GCP, se lahko prijavite tukaj - prejemanje brezplačnih kreditov).

Prijavite se v Google Cloud, ustvarite projekt in omogočite zaračunavanje zanj. Namestite pripomoček ukazne vrstice gcloud in konfigurirajte svoj projekt z gcloud init.

Nastavite privzeti projekt, računalniško območje in območje (zamenjajte PROJECT_ID za vaš projekt):

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

Omogočite storitev GKE in ustvarite gručo z dodatkoma HPA in 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

Zgornji ukaz bo ustvaril privzeto področje vozlišč, sestavljeno iz dveh VM-jev n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). V idealnem primeru bi morale biti komponente Istio izolirane od njihovih delovnih obremenitev, vendar ni preprostega načina za zagon podov Istio na namenskem področju vozlišč. Manifesti Istio veljajo samo za branje in GKE bo razveljavil vse spremembe, kot je vezava na vozlišče ali odklop od sklopa.

Nastavite poverilnice za kubectl:

gcloud container clusters get-credentials istio

Ustvarite vezavo vloge skrbnika gruče:

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

Namestite orodje ukazne vrstice Helm:

brew install kubernetes-helm

Homebrew 2.0 je zdaj na voljo tudi za Linux.

Ustvarite račun storitve in vezavo vloge gruče za Tiller:

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

Razširite Tiller v imenskem prostoru kube-system:

helm init --service-account tiller

Razmislite o uporabi SSL med Helmom in Tillerjem. Za več informacij o zaščiti vaše namestitve Helm glejte docs.helm.sh

Potrdite nastavitve:

kubectl -n istio-system get svc

Po nekaj sekundah bi moral GCP storitvi dodeliti zunanji naslov IP istio-ingressgateway.

Nastavitev prehoda Istio Ingress

Z imenom ustvarite statični naslov IP istio-gatewayz uporabo naslova IP prehoda 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

Zdaj potrebujete internetno domeno in dostop do svojega DNS registrarja. Dodajte dva zapisa A (zamenjajte example.com na vašo domeno):

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

Preverite, ali nadomestni znak DNS deluje:

watch host test.istio.example.com

Ustvarite generični prehod Istio za zagotavljanje storitev zunaj storitvene mreže prek 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:
        - "*"

Shranite zgornji vir kot public-gateway.yaml in ga nato uporabite:

kubectl apply -f ./public-gateway.yaml

Noben proizvodni sistem ne bi smel zagotavljati storitev na internetu brez SSL. Če želite zaščititi svoj vstopni prehod Istio z upraviteljem potrdil, CloudDNS in Let's Encrypt, preberite dokumentacijo Označevalec G.K.E.

Namestitev zastavice

Dodatek GKE Istio ne vključuje primerka Prometheus, ki čisti telemetrično storitev Istio. Ker Flagger uporablja meritve Istio HTTP za izvajanje analize kanarčka, morate razmestiti naslednjo konfiguracijo Prometheus, podobno tisti, ki je priložena uradni shemi Istio Helm.

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

Dodajte repozitorij Flagger Helm:

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

Označevalnik razširi v imenski prostor istio-systemz omogočanjem obvestil 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

Flagger lahko namestite v kateri koli imenski prostor, če lahko komunicira s storitvijo Istio Prometheus na vratih 9090.

Flagger ima nadzorno ploščo Grafana za analizo kanarčkov. Namestite Grafana v imenski prostor 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

Razkrijte Grafana prek odprtega prehoda z ustvarjanjem virtualne storitve (zamenjajte example.com na vašo domeno):

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

Shranite zgornji vir kot grafana-virtual-service.yaml in ga nato uporabite:

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

Ko greste na http://grafana.istio.example.com Vaš brskalnik bi vas moral preusmeriti na prijavno stran Grafana.

Uvajanje spletnih aplikacij z Flaggerjem

Flagger uvede Kubernetes in, če je potrebno, horizontalno samodejno skaliranje (HPA), nato ustvari vrsto objektov (umestitve Kubernetes, storitve ClusterIP in virtualne storitve Istio). Ti objekti izpostavljajo aplikacijo storitveni mreži ter upravljajo analizo in promocijo kanarčkov.

Samodejne uvedbe Canary s programoma Flagger in Istio

Ustvarite testni imenski prostor z omogočeno implementacijo Istio Sidecar:

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

Ustvarite orodje za razmestitev in samodejno horizontalno skaliranje za pod:

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

Razmestite storitev preizkusa obremenitve za ustvarjanje prometa med analizo Canary:

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

Ustvarite vir kanarčkov po meri (zamenjajte example.com na vašo domeno):

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

Shranite zgornji vir kot podinfo-canary.yaml in ga nato uporabite:

kubectl apply -f ./podinfo-canary.yaml

Če bo zgornja analiza uspešna, se bo izvajala pet minut in vsake pol minute preverjala meritve HTTP. Z naslednjo formulo lahko določite najmanjši čas, ki je potreben za testiranje in spodbujanje uvedbe kanarčka: interval * (maxWeight / stepWeight). Polja Canary CRD so dokumentirana tukaj.

Po nekaj sekundah bo Flagger ustvaril kanarčke predmete:

# 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

Odprite brskalnik in pojdite na app.istio.example.com, bi morali videti številko različice demo aplikacije.

Samodejna analiza kanarčkov in promocija

Flagger izvaja nadzorno zanko, ki postopoma premakne promet na kanarčka, medtem ko meri ključne kazalnike uspešnosti, kot so stopnja uspešnosti zahteve HTTP, povprečno trajanje zahteve in zdravje enot. Na podlagi analize KPI se kanarček poviša ali ukine, rezultati analize pa se objavijo v Slacku.

Samodejne uvedbe Canary s programoma Flagger in Istio

Razmestitev Canary se sproži, ko se spremeni eden od naslednjih objektov:

  • Namestite PodSpec (slika vsebnika, ukaz, vrata, env itd.)
  • ConfigMaps so nameščeni kot nosilci ali pretvorjeni v spremenljivke okolja
  • Skrivnosti so nameščene kot nosilci ali pretvorjene v spremenljivke okolja

Ko posodabljate sliko vsebnika, zaženite uvajanje kanarčka:

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

Flagger zazna, da se je različica uvedbe spremenila, in jo začne analizirati:

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

Med analizo lahko rezultate kanarčkov spremljate z Grafano:

Samodejne uvedbe Canary s programoma Flagger in Istio

Prosimo, upoštevajte: če se med analizo canary uporabijo nove spremembe za uvajanje, bo Flagger znova zagnal fazo analize.

Naredite seznam vseh kanarčkov v vaši skupini:

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

Če ste omogočili obvestila Slack, boste prejeli naslednja sporočila:

Samodejne uvedbe Canary s programoma Flagger in Istio

Samodejno povrnitev nazaj

Med analizo canary lahko ustvarite sintetične napake HTTP 500 in visoko zakasnitev odziva, da preverite, ali bo Flagger ustavil uvajanje.

Ustvarite testno enoto in v njej naredite naslednje:

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

Ustvarjanje napak HTTP 500:

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

Generiranje zamude:

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

Ko število neuspelih preverjanj doseže prag, se promet preusmeri nazaj na primarni kanal, kanarček se zmanjša na nič in uvedba je označena kot neuspešna.

Napake Canary in skokovite zakasnitve se beležijo kot dogodki Kubernetes, Flagger pa zabeleži v formatu 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

Če ste omogočili obvestila Slack, boste prejeli sporočilo, ko bo rok za dokončanje ali doseganje največjega števila neuspelih pregledov v analizi presežen:

Samodejne uvedbe Canary s programoma Flagger in Istio

Na koncu

Izvajanje storitvene mreže, kot je Istio, na vrhu Kubernetesa bo zagotovilo samodejne meritve, dnevnike in dnevnike, vendar je uvajanje delovnih obremenitev še vedno odvisno od zunanjih orodij. Flagger želi to spremeniti z dodajanjem zmogljivosti Istio progresivni porod.

Flagger je združljiv s katero koli rešitvijo CI/CD za Kubernetes, kanarsko analizo pa je mogoče enostavno razširiti z webhooks za izvajanje sistemskih integracijskih/sprejemnih testov, obremenitvenih testov ali drugih testov po meri. Ker je Flagger deklarativen in se odziva na dogodke Kubernetes, ga je mogoče uporabiti v cevovodih GitOps skupaj z Weave Flux ali JenkinsX. Če uporabljate JenkinsX, lahko namestite Flagger z dodatki jx.

Označevalnik podprt Tkanje in zagotavlja namestitve kanarčkov v Weave Cloud. Projekt je preizkušen na GKE, EKS in goli kovini s kubeadm.

Če imate predloge za izboljšanje Flaggerja, pošljite vprašanje ali PR na GitHub na stefanprodan/flagger. Prispevki so več kot dobrodošli!

Hvala Ray Tsang.

Vir: www.habr.com

Dodaj komentar