CD word erken as 'n ondernemingsagtewarepraktyk en is die resultaat van 'n natuurlike evolusie van gevestigde CI-beginsels. CD is egter nog redelik skaars, miskien as gevolg van die kompleksiteit van bestuur en die vrees vir mislukte ontplooiings wat stelselbeskikbaarheid beïnvloed.
Hieronder is 'n stap-vir-stap-gids vir die opstel en gebruik van Flagger op Google Kubernetes Engine (GKE).
Stel 'n Kubernetes-kluster op
Jy begin deur 'n GKE-kluster met die Istio-byvoeging te skep (as jy nie 'n GCP-rekening het nie, kan jy aanmeld
Meld aan by Google Wolk, skep 'n projek en aktiveer fakturering daarvoor. Installeer die opdragreëlnutsding gcloud init
.
Stel verstekprojek, bereken area en sone (vervang PROJECT_ID
vir jou projek):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Aktiveer die GKE-diens en skep 'n groepering met HPA- en Istio-byvoegings:
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
Die bogenoemde opdrag sal 'n verstek noduspoel skep wat twee VM's insluit n1-standard-2
(vCPU: 2, RAM 7,5 GB, skyf: 30 GB). Ideaal gesproke moet jy Istio-komponente van jou werkladings isoleer, maar daar is geen maklike manier om Istio Pods in 'n toegewyde poel nodusse te laat loop nie. Istio-manifeste word as leesalleen beskou en GKE sal enige veranderinge ongedaan maak, soos om aan 'n nodus te koppel of van 'n peul los te maak.
Stel eiebewyse op vir kubectl
:
gcloud container clusters get-credentials istio
Skep 'n groepadministrateurrolbinding:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Installeer die opdragreëlinstrument
brew install kubernetes-helm
Homebrew 2.0 is nou ook beskikbaar vir
Skep 'n diensrekening en groeprolbinding vir Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Brei Tiller in naamruimte uit kube-system
:
helm init --service-account tiller
U moet dit oorweeg om SSL tussen Helm en Tiller te gebruik. Vir meer inligting oor die beskerming van jou Helm-installasie, sien
Bevestig instellings:
kubectl -n istio-system get svc
Na 'n paar sekondes moet GCP 'n eksterne IP-adres vir die diens toewys istio-ingressgateway
.
Konfigureer die Istio Ingress Gateway
Skep 'n statiese IP-adres met 'n naam istio-gateway
gebruik die IP-adres van die Istio-poort:
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
Nou benodig u 'n internetdomein en toegang tot u DNS-registrateur. Voeg twee A-rekords by (vervang example.com
na jou domein):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Verifieer dat die DNS-jokerteken werk:
watch host test.istio.example.com
Skep 'n generiese Istio-poort om dienste buite die diensnetwerk oor HTTP te verskaf:
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:
- "*"
Stoor die bogenoemde hulpbron as public-gateway.yaml en pas dit dan toe:
kubectl apply -f ./public-gateway.yaml
Geen produksiestelsel behoort dienste op die internet te verskaf sonder SSL nie. Om die Istio-ingangspoort met cert-manager, CloudDNS en Let's Encrypt te beveilig, lees asseblief
Flagger installasie
Die GKE Istio-byvoeging sluit nie 'n Prometheus-instansie in wat die Istio-telemetriediens skoonmaak nie. Omdat Flagger Istio HTTP-statistieke gebruik om kanarie-analise uit te voer, moet jy die volgende Prometheus-konfigurasie ontplooi, soortgelyk aan die een wat by die amptelike Istio Helm-skema kom.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Voeg die Flagger Helm-bewaarplek by:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Brei Vlagger uit na naamruimte istio-system
deur Slack-kennisgewings te aktiveer:
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
Jy kan Flagger in enige naamruimte installeer solank dit met die Istio Prometheus-diens op poort 9090 kan kommunikeer.
Flagger het 'n Grafana-dashboard vir kanarie-analise. Installeer Grafana in naamruimte 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
Stel Grafana bloot deur 'n oop poort deur 'n virtuele diens te skep (vervang example.com
na jou domein):
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
Stoor die bogenoemde hulpbron as grafana-virtual-service.yaml en pas dit dan toe:
kubectl apply -f ./grafana-virtual-service.yaml
Wanneer verhuis na http://grafana.istio.example.com
in die blaaier moet u na die Grafana-aanmeldbladsy verwys word.
Ontplooi webtoepassings met Flagger
Flagger ontplooi Kubernetes en skaal opsioneel outomaties uit (HPA), en skep dan 'n reeks voorwerpe (Kubernetes-ontplooiings, ClusterIP-dienste en Istio virtuele dienste). Hierdie voorwerpe stel die toepassing bloot aan die diensnetwerk en beheer kanarie-analise en -vordering.
Skep 'n toetsnaamruimte met Istio Sidecar-inspuiting geaktiveer:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Skep 'n ontplooiing en 'n outomatiese uitskaalinstrument:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Ontplooi 'n toetslaaidiens om verkeer tydens kanarie-analise te genereer:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Skep 'n pasgemaakte kanarie-hulpbron (vervang example.com
na jou domein):
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/"
Stoor die bogenoemde hulpbron as podinfo-canary.yaml en pas dit dan toe:
kubectl apply -f ./podinfo-canary.yaml
Die bogenoemde ontleding, indien suksesvol, sal vir vyf minute duur en HTTP-statistieke elke halfminuut nagaan. U kan die minimum tyd bepaal wat benodig word om 'n kanarie-ontplooiing te bekragtig en te bevorder deur die volgende formule te gebruik: interval * (maxWeight / stepWeight)
. Kanariese CRD-velde word gedokumenteer
Na 'n paar sekondes sal Flagger kanarie-voorwerpe skep:
# 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
Maak 'n blaaier oop en gaan na app.istio.example.com
, moet jy die weergawenommer sien
Outomatiese kanarie-analise en bevordering
Flagger implementeer 'n beheerlus wat verkeer geleidelik na die kanarie beweeg, terwyl sleutelprestasiemaatstawwe soos HTTP-versoeksukseskoers, gemiddelde versoekduur en peulgesondheid gemeet word. Op grond van die KPI-analise word die kanarie bevorder of onderbreek, en die resultate van die analise word aan Slack gepubliseer.
Kanarie-ontplooiing word geaktiveer wanneer een van die volgende voorwerpe verander:
- Ontplooi PodSpec (houerbeeld, opdrag, poorte, env, ens.)
- ConfigMaps word as volumes gemonteer of na omgewingsveranderlikes gekarteer
- Geheime word as volumes gemonteer of omgeskakel na omgewingsveranderlikes
Begin kanarie-ontplooiing wanneer 'n houerbeeld opgedateer word:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger bespeur dat die ontplooiingsweergawe verander het en begin dit ontleed:
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
Tydens ontleding kan kanarie-resultate opgespoor word met behulp van Grafana:
Neem asseblief kennis dat as nuwe veranderinge toegepas word op 'n ontplooiing tydens kanarie-analise, dan sal Flagger die ontledingsfase herbegin.
Maak 'n lys van alle kanaries in jou groep:
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
As jy Slack-kennisgewings geaktiveer het, sal jy die volgende boodskappe ontvang:
Outomatiese terugrol
Tydens kanarie-analise kan jy sintetiese HTTP 500-foute en hoë reaksie-vertraging genereer om te sien of Flagger die ontplooiing sal stop.
Skep 'n toetspod en doen die volgende daarin:
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
Genereer HTTP 500-foute:
watch curl http://podinfo-canary:9898/status/500
Vertrag generering:
watch curl http://podinfo-canary:9898/delay/1
Wanneer die aantal mislukte kontroles die drempel bereik, word die verkeer na die primêre kanaal herlei, die kanarie word na nul afgeskaal en die ontplooiing word as misluk gemerk.
Kanarie-foute en vertragingspieke word as Kubernetes-gebeurtenisse aangeteken en deur Flagger in JSON-formaat aangeteken:
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
As jy Slack-kennisgewings geaktiveer het, sal jy 'n boodskap ontvang wanneer die sperdatum oorskry word of die maksimum aantal mislukte tjeks in die analise bereik word:
Ten slotte
Om 'n diensnetwerk soos Istio bykomend tot Kubernetes te laat loop, sal outomatiese statistieke, logs en protokolle verskaf, maar werklading-ontplooiing hang steeds van eksterne nutsgoed af. Flagger beoog om dit te verander deur Istio-vermoëns by te voeg
Flagger is versoenbaar met enige Kubernetes CI/CD-oplossing, en kanarie-analise kan maklik uitgebrei word met
Vlagger ondersteun
As jy voorstelle het om Flagger te verbeter, dien asseblief 'n kwessie of PR op GitHub in by
Dankie
Bron: will.com