CD er anerkjent som en bedriftsprogramvarepraksis og er et resultat av en naturlig utvikling av etablerte CI-prinsipper. Imidlertid er CD fortsatt ganske sjelden, kanskje på grunn av kompleksiteten i administrasjonen og frykten for mislykkede distribusjoner som påvirker systemtilgjengeligheten.
Nedenfor er en trinnvis veiledning for å sette opp og bruke Flagger på Google Kubernetes Engine (GKE).
Sette opp en Kubernetes-klynge
Du starter med å opprette en GKE-klynge med Istio-tillegget (hvis du ikke har en GCP-konto, kan du registrere deg
Logg på Google Cloud, opprett et prosjekt og aktiver fakturering for det. Installer kommandolinjeverktøyet gcloud init
.
Angi standardprosjekt, beregningsområde og sone (erstatt PROJECT_ID
for prosjektet ditt):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Aktiver GKE-tjenesten og lag en klynge med HPA- og Istio-tillegg:
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
Kommandoen ovenfor vil opprette en standard nodepool inkludert to VM-er n1-standard-2
(vCPU: 2, RAM 7,5 GB, disk: 30 GB). Ideelt sett bør du isolere Istio-komponenter fra arbeidsbelastningene dine, men det er ingen enkel måte å kjøre Istio Pods i en dedikert pool av noder. Istio-manifester betraktes som skrivebeskyttet, og GKE vil angre eventuelle endringer, for eksempel kobling til en node eller frakobling fra en pod.
Sett opp legitimasjon for kubectl
:
gcloud container clusters get-credentials istio
Opprett en klyngeadministratorrollebinding:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Installer kommandolinjeverktøyet
brew install kubernetes-helm
Homebrew 2.0 er nå også tilgjengelig for
Opprett en tjenestekonto og klyngerollebinding for Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Utvid Tiller i navneområdet kube-system
:
helm init --service-account tiller
Du bør vurdere å bruke SSL mellom Helm og Tiller. For mer informasjon om beskyttelse av Helm-installasjonen, se
Bekreft innstillinger:
kubectl -n istio-system get svc
Etter noen sekunder bør GCP tilordne en ekstern IP-adresse for tjenesten istio-ingressgateway
.
Konfigurere Istio Ingress Gateway
Opprett en statisk IP-adresse med et navn istio-gateway
ved å bruke IP-adressen til Istio-gatewayen:
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å trenger du et internettdomene og tilgang til DNS-registratoren din. Legg til to A-poster (erstatt example.com
til ditt domene):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Bekreft at DNS-jokertegnet fungerer:
watch host test.istio.example.com
Opprett en generisk Istio-gateway for å tilby tjenester utenfor tjenestenettverket over 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:
- "*"
Lagre ressursen ovenfor som public-gateway.yaml og bruk den deretter:
kubectl apply -f ./public-gateway.yaml
Ingen produksjonssystem skal tilby tjenester på Internett uten SSL. For å sikre Istio-inngangsporten med cert-manager, CloudDNS og Let's Encrypt, vennligst les
Flagger installasjon
GKE Istio-tillegget inkluderer ikke en Prometheus-forekomst som rydder opp i Istio-telemetritjenesten. Fordi Flagger bruker Istio HTTP-beregninger til å utføre kanariøyneanalyse, må du distribuere følgende Prometheus-konfigurasjon, lik den som følger med det offisielle Istio Helm-skjemaet.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Legg til Flagger Helm-depotet:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Utvid Flagger til navneområde istio-system
ved å aktivere Slack-varsler:
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
Du kan installere Flagger i et hvilket som helst navneområde så lenge det kan kommunisere med Istio Prometheus-tjenesten på port 9090.
Flagger har et Grafana-dashbord for kanari-analyse. Installer Grafana i navneområdet 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
Utsett Grafana gjennom en åpen gateway ved å lage en virtuell tjeneste (erstatt example.com
til ditt domene):
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
Lagre ressursen ovenfor som grafana-virtual-service.yaml og bruk den deretter:
kubectl apply -f ./grafana-virtual-service.yaml
Ved flytting til http://grafana.istio.example.com
i nettleseren skal du ledes til Grafanas påloggingsside.
Utrulling av nettapplikasjoner med Flagger
Flagger distribuerer Kubernetes og skalerer ut automatisk (HPA), og lager deretter en serie objekter (Kubernetes-distribusjoner, ClusterIP-tjenester og virtuelle Istio-tjenester). Disse objektene utsetter applikasjonen for tjenestenettverket og kontrollerer kanariøyeanalyse og fremgang.
Opprett et testnavneområde med Istio Sidecar-injeksjon aktivert:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Opprett en distribusjon og et automatisk utskaleringsverktøy for pod:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Implementer en testinnlastingstjeneste for å generere trafikk under kanari-analyse:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Lag en tilpasset kanari-ressurs (erstatt example.com
til ditt domene):
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/"
Lagre ressursen ovenfor som podinfo-canary.yaml og bruk den deretter:
kubectl apply -f ./podinfo-canary.yaml
Analysen ovenfor, hvis den lykkes, vil kjøre i fem minutter, og sjekke HTTP-beregninger hvert halve minutt. Du kan bestemme minimumstiden som kreves for å validere og promotere en kanari-utplassering ved å bruke følgende formel: interval * (maxWeight / stepWeight)
. Canary CRD-felt er dokumentert
Etter et par sekunder vil Flagger lage kanariobjekter:
# 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
Åpne en nettleser og gå til app.istio.example.com
, bør du se versjonsnummeret
Automatisk kanariøyneanalyse og promotering
Flagger implementerer en kontrollsløyfe som gradvis flytter trafikk til kanarifuglen mens den måler nøkkelytelsesmålinger som HTTP-forespørslers suksessrate, gjennomsnittlig forespørselsvarighet og podhelse. Basert på KPI-analysen blir kanarifuglen promotert eller avbrutt, og resultatene av analysen publiseres til Slack.
Canary-distribusjon utløses når ett av følgende objekter endres:
- Distribuer PodSpec (beholderbilde, kommando, porter, env, etc.)
- ConfigMaps er montert som volumer eller tilordnet miljøvariabler
- Hemmeligheter monteres som volumer eller konverteres til miljøvariabler
Kjør Canary-distribusjon når du oppdaterer et beholderbilde:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger oppdager at distribusjonsversjonen er endret og begynner å analysere den:
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
Under analyse kan kanarifuglresultater spores ved hjelp av Grafana:
Vær oppmerksom på at hvis nye endringer blir brukt på en distribusjon under kanari-analyse, vil Flagger starte analysefasen på nytt.
Lag en liste over alle kanarifuglene i klyngen din:
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
Hvis du har aktivert Slack-varsler, vil du motta følgende meldinger:
Automatisk tilbakerulling
Under kanari-analyse kan du generere syntetiske HTTP 500-feil og høy responsforsinkelse for å se om Flagger stopper distribusjonen.
Lag en testpod og gjør følgende i den:
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
Genererer HTTP 500-feil:
watch curl http://podinfo-canary:9898/status/500
Forsinkelsesgenerering:
watch curl http://podinfo-canary:9898/delay/1
Når antallet mislykkede kontroller når terskelen, rutes trafikken tilbake til primærkanalen, kanarifuglen skaleres til null, og distribusjonen merkes som mislykket.
Kanarifeil og forsinkelsestopper logges som Kubernetes-hendelser og logges av Flagger i JSON-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
Hvis du har aktivert Slack-varsler, vil du motta en melding når fristen er overskredet eller maksimalt antall feilslåtte kontroller i analysen er nådd:
i konklusjonen
Å kjøre et tjenestenettverk som Istio i tillegg til Kubernetes vil gi automatiske beregninger, logger og protokoller, men distribusjon av arbeidsbelastning avhenger fortsatt av eksterne verktøy. Flagger har som mål å endre dette ved å legge til Istio-funksjoner
Flagger er kompatibel med alle Kubernetes CI/CD-løsninger, og kanari-analyse kan enkelt utvides med
Flagger støttet
Hvis du har forslag for å forbedre Flagger, vennligst send inn et problem eller PR på GitHub på
Takk
Kilde: www.habr.com