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.
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
Logige sisse Google Cloudi, looge projekt ja lubage selle eest arveldamine. Installige käsurea utiliit 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
brew install kubernetes-helm
Homebrew 2.0 on nüüd saadaval ka jaoks
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
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-gateway
kasutades 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
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-system
lubades 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.
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
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
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.
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:
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 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:
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
Flagger ühildub kõigi Kubernetes'i CI/CD lahendustega ja kanaari analüüsi saab hõlpsasti laiendada
Toetatud märgistaja
Kui teil on Flaggeri täiustamiseks soovitusi, esitage GitHubis probleem või suhtekorraldus aadressil
Tänan
Allikas: www.habr.com