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.
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
Prijavite se v Google Cloud, ustvarite projekt in omogočite zaračunavanje zanj. Namestite pripomoček ukazne vrstice 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
brew install kubernetes-helm
Homebrew 2.0 je zdaj na voljo tudi za
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
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-gateway
z 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
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-system
z 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.
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
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
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.
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:
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:
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:
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
Flagger je združljiv s katero koli rešitvijo CI/CD za Kubernetes, kanarsko analizo pa je mogoče enostavno razširiti z
Označevalnik podprt
Če imate predloge za izboljšanje Flaggerja, pošljite vprašanje ali PR na GitHub na
Hvala
Vir: www.habr.com