Automātiska kanārijputnu izvietoŔana ar Flagger un Istio

Automātiska kanārijputnu izvietoŔana ar Flagger un Istio

CD tiek atzÄ«ts par uzņēmuma programmatÅ«ras praksi, un tas ir iedibināto CI principu dabiskas attÄ«stÄ«bas rezultāts. Tomēr CD joprojām ir diezgan reti sastopams, iespējams, pārvaldÄ«bas sarežģītÄ«bas un bailes no neveiksmÄ«gas izvietoÅ”anas, kas ietekmē sistēmas pieejamÄ«bu, dēļ.

AtzÄ«mētājs ir atvērtā koda Kubernetes operators, kura mērÄ·is ir novērst neskaidras attiecÄ«bas. Tas automatizē Kanāriju izvietoÅ”anas veicināŔanu, izmantojot Istio trafika nobÄ«di un Prometheus metriku, lai analizētu lietojumprogrammu darbÄ«bu pārvaldÄ«tas izlaiÅ”anas laikā.

Tālāk ir sniegts soli pa solim ceļvedis, lai iestatītu un izmantotu atzīmētāju pakalpojumā Google Kubernetes Engine (GKE).

Kubernetes klastera iestatīŔana

Vispirms izveidojiet GKE klasteru ar Istio papildinājumu (ja jums nav GCP konta, varat reÄ£istrēties Å”eit - lai saņemtu bezmaksas kredÄ«tus).

Pierakstieties pakalpojumā Google Cloud, izveidojiet projektu un iespējojiet tā norēķinus. Instalējiet komandrindas utilītu gcloud un iestatiet savu projektu ar gcloud init.

Iestatiet noklusējuma projektu, aprēķina apgabalu un zonu (aizstāt PROJECT_ID jūsu projektam):

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

Iespējojiet GKE pakalpojumu un izveidojiet kopu ar HPA un Istio papildinājumiem:

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

IepriekÅ” minētā komanda izveidos noklusējuma mezglu kopu, kurā ietilpst divas virtuālās maŔīnas n1-standard-2 (vCPU: 2, RAM 7,5 GB, disks: 30 GB). Ideālā gadÄ«jumā jums vajadzētu izolēt Istio komponentus no darba slodzēm, taču nav vienkārÅ”a veida, kā palaist Istio Pods speciālā mezglu pÅ«lā. Istio manifesti tiek uzskatÄ«ti par tikai lasāmiem, un GKE atsauks visas izmaiņas, piemēram, saistÄ«Å”anu ar mezglu vai atdalÄ«Å”anu no poda.

Iestatiet akreditācijas datus kubectl:

gcloud container clusters get-credentials istio

Izveidojiet klastera administratora lomu saistīŔanu:

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

Instalējiet komandrindas rīku Stūre:

brew install kubernetes-helm

Homebrew 2.0 tagad ir pieejams arī Linux.

Izveidojiet pakalpojuma kontu un klastera lomu saistīŔanu Tiller:

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

Nosaukumvietā izvērsiet Tiller kube-system:

helm init --service-account tiller

Apsveriet iespēju izmantot SSL starp Helm un Tiller. Papildinformāciju par Helm instalācijas aizsardzību skatiet sadaļā docs.helm.sh

Apstipriniet iestatījumus:

kubectl -n istio-system get svc

Pēc dažām sekundēm GCP pakalpojumam ir jāpieŔķir ārēja IP adrese istio-ingressgateway.

Istio ieejas vārtejas konfigurÄ“Å”ana

Izveidojiet statisku IP adresi ar nosaukumu istio-gatewayizmantojot Istio vārtejas IP adresi:

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

Tagad jums ir nepiecieÅ”ams interneta domēns un piekļuve jÅ«su DNS reÄ£istratoram. Pievienojiet divus A ierakstus (aizstāt example.com uz jÅ«su domēnu):

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

Pārbaudiet, vai DNS aizstājējzīme darbojas:

watch host test.istio.example.com

Izveidojiet vispārīgu Istio vārteju, lai nodroŔinātu pakalpojumus ārpus pakalpojuma tīkla, izmantojot 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:
        - "*"

Saglabājiet iepriekÅ” minēto resursu kā public-gateway.yaml un pēc tam lietojiet to:

kubectl apply -f ./public-gateway.yaml

Neviena ražoÅ”anas sistēma nedrÄ«kst nodroÅ”ināt pakalpojumus internetā bez SSL. Lai nodroÅ”inātu Istio ieejas vārteju ar sertifikātu pārvaldnieku, CloudDNS un Let's Encrypt, lÅ«dzu, izlasiet dokumentācija AtzÄ«mētājs G.K.E.

AtzÄ«mētāja uzstādÄ«Å”ana

GKE Istio papildinājums neietver Prometheus gadÄ«jumu, kas attÄ«ra Istio telemetrijas pakalpojumu. Tā kā atzÄ«mētājs izmanto Istio HTTP metriku, lai veiktu kanāriju analÄ«zi, jums ir jāizvieto Ŕāda Prometheus konfigurācija, kas ir lÄ«dzÄ«ga tai, kas tiek piegādāta oficiālajā Istio Helm shēmā.

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

Pievienojiet atzīmētāja Helm repozitoriju:

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

Izvērsiet Atzīmētājs līdz nosaukumvietai istio-systemiespējojot Slack paziņojumus:

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

Jūs varat instalēt Flagger jebkurā nosaukumvietā, ja vien tas var sazināties ar pakalpojumu Istio Prometheus portā 9090.

Atzīmētājam ir Grafana informācijas panelis kanārijputnu analīzei. Instalējiet Grafana nosaukumvietā 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

Atklājiet Grafana, izmantojot atvērtu vārteju, izveidojot virtuālu pakalpojumu (aizstāt example.com uz jūsu domēnu):

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

Saglabājiet iepriekÅ” minēto resursu kā grafana-virtual-service.yaml un pēc tam lietojiet to:

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

Pārceļoties uz http://grafana.istio.example.com pārlūkprogrammā jums jānovirza uz Grafana pieteikŔanās lapu.

TÄ«mekļa lietojumprogrammu izvietoÅ”ana, izmantojot atzÄ«mētāju

AtzÄ«mētājs izvieto Kubernetes un pēc izvēles automātiski mērogo (HPA), pēc tam izveido objektu sēriju (Kubernetes izvietoÅ”ana, ClusterIP pakalpojumi un Istio virtuālie pakalpojumi). Å ie objekti pakļauj lietojumprogrammu pakalpojumu tÄ«klam un kontrolē kanāriju analÄ«zi un progresu.

Automātiska kanārijputnu izvietoŔana ar Flagger un Istio

Izveidojiet testa nosaukumvietu ar iespējotu Istio Sidecar injekciju:

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

Izveidojiet izvietoÅ”anas un aplikācijas automātiskās mērogoÅ”anas rÄ«ku:

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

Izvietojiet testa slodzes pakalpojumu, lai kanāriju analīzes laikā izveidotu trafiku:

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

Izveidojiet pielāgotu kanārijputnu resursu (aizstāt example.com uz jūsu domēnu):

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

Saglabājiet iepriekÅ” minēto resursu kā podinfo-canary.yaml un pēc tam lietojiet to:

kubectl apply -f ./podinfo-canary.yaml

Ja iepriekÅ” minētā analÄ«ze bÅ«s veiksmÄ«ga, tā darbosies piecas minÅ«tes, pārbaudot HTTP metriku ik pēc pusminÅ«tes. Varat noteikt minimālo laiku, kas nepiecieÅ”ams, lai apstiprinātu un veicinātu kanārijputnu izvietoÅ”anu, izmantojot Ŕādu formulu: interval * (maxWeight / stepWeight). Kanāriju CRD lauki ir dokumentēti Å”eit.

Pēc dažām sekundēm atzīmētājs izveidos kanāriju objektus:

# 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

Atveriet pārlūkprogrammu un dodieties uz app.istio.example.com, jums vajadzētu redzēt versijas numuru demonstrācijas lietotnes.

Automātiska kanāriju analīze un veicināŔana

AtzÄ«mētājs ievieÅ” vadÄ«bas cilpu, kas pakāpeniski pārvieto datplÅ«smu uz Kanāriju, vienlaikus mērot galvenos veiktspējas rādÄ«tājus, piemēram, HTTP pieprasÄ«juma panākumu lÄ«meni, vidējo pieprasÄ«juma ilgumu un aplikuma stāvokli. Pamatojoties uz KPI analÄ«zi, kanārijputniņŔ tiek paaugstināts vai pārtraukts, un analÄ«zes rezultāti tiek publicēti Slack.

Automātiska kanārijputnu izvietoŔana ar Flagger un Istio

Kanāriju izvietoÅ”ana tiek aktivizēta, kad mainās kāds no Å”iem objektiem:

  • Izvietot PodSpec (konteinera attēlu, komandu, portus, env utt.)
  • ConfigMaps tiek montētas kā sējumi vai kartētas ar vides mainÄ«gajiem
  • Noslēpumi tiek uzstādÄ«ti kā sējumi vai pārveidoti par vides mainÄ«gajiem

Atjauninot konteinera attēlu, palaist canary deploy:

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

AtzÄ«mētājs konstatē, ka izvietoÅ”anas versija ir mainÄ«jusies, un sāk tās parsÄ“Å”anu:

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īzes laikā kanārijputniņu rezultātus var izsekot, izmantojot Grafana:

Automātiska kanārijputnu izvietoŔana ar Flagger un Istio

LÅ«dzu, ņemiet vērā: ja kanārijas analÄ«zes laikā izvietoÅ”anai tiek piemērotas jaunas izmaiņas, atzÄ«mētājs atsāks analÄ«zes fāzi.

Izveidojiet visu jūsu klastera kanārijputnu sarakstu:

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

Ja esat iespējojis Slack paziņojumus, jÅ«s saņemsit Ŕādus ziņojumus:

Automātiska kanārijputnu izvietoŔana ar Flagger un Istio

Automātiska atgrieŔana

Kanāriju analÄ«zes laikā varat Ä£enerēt sintētiskas HTTP 500 kļūdas un lielu atbildes latentumu, lai noskaidrotu, vai atzÄ«mētājs apturēs izvietoÅ”anu.

Izveidojiet testa bloku un veiciet tajā tālāk norādītās darbības.

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 kļūdu Ä£enerÄ“Å”ana:

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

Aizkaves ģenerēŔana:

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

Kad nesekmÄ«go pārbaužu skaits sasniedz slieksni, satiksme tiek novirzÄ«ta atpakaļ uz primāro kanālu, kanārijputniņŔ tiek mērogots lÄ«dz nullei un izvietoÅ”ana tiek atzÄ«mēta kā neizdevusies.

Kanāriju kļūdas un latentuma pieaugumi tiek reģistrēti kā Kubernetes notikumi, un atzīmētājs reģistrē JSON formātā:

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

Ja esat iespējojis Slack paziņojumus, jÅ«s saņemsit ziņojumu, kad tiks pārsniegts termiņŔ vai tiks sasniegts maksimālais nesekmÄ«go pārbaužu skaits analÄ«zē:

Automātiska kanārijputnu izvietoŔana ar Flagger un Istio

Noslēgumā

Palaižot pakalpojumu tÄ«klu, piemēram, Istio, papildus Kubernetes, tiks nodroÅ”ināta automātiska metrika, žurnāli un protokoli, taču darba slodzes izvietoÅ”ana joprojām ir atkarÄ«ga no ārējiem rÄ«kiem. Flagger vēlas to mainÄ«t, pievienojot Istio iespējas progresÄ«va piegāde.

Flagger ir saderÄ«gs ar jebkuru Kubernetes CI/CD risinājumu, un kanārijputnu analÄ«zi var viegli paplaÅ”ināt, izmantojot tÄ«mekļa aizÄ·eres lai veiktu sistēmas integrācijas/pieņemÅ”anas testus, slodzes testus vai citas pielāgotas pārbaudes. Tā kā atzÄ«mētājs ir deklaratÄ«vs un reaģē uz Kubernetes notikumiem, to var izmantot GitOps cauruļvados kopā ar Weave Flux vai DženkinsX. Ja izmantojat JenkinsX, varat instalēt Flagger ar jx papildinājumiem.

AtzÄ«mētājs ir atbalstÄ«ts Weaveworks un nodroÅ”ina kanāriju izvietoÅ”anu Aust Mākoni. Projekts tiek testēts uz GKE, EKS un tukÅ”a metāla ar kubeadm.

Ja jums ir ieteikumi, kā uzlabot atzīmētāju, lūdzu, iesniedziet problēmu vai PR vietnē GitHub vietnē stefanprodāns/karogs. Ieguldījumi ir vairāk nekā apsveicami!

Paldies Rejs Tsangs.

Avots: www.habr.com

Pievieno komentāru