CD кәсіпорынның бағдарламалық жасақтама тәжірибесі ретінде танылған және CI қағидаларының табиғи эволюциясының нәтижесі болып табылады. Дегенмен, ықшам дискі әлі де сирек кездеседі, мүмкін басқарудың күрделілігіне және жүйенің қол жетімділігіне әсер ететін сәтсіз орналастыру қорқынышына байланысты.
Төменде Google Kubernetes Engine (GKE) жүйесінде Flagger орнату және пайдалану бойынша қадамдық нұсқаулық берілген.
Kubernetes кластерін орнату
Istio қондырмасы бар GKE кластерін жасаудан бастайсыз (егер сізде GCP тіркелгісі болмаса, тіркелуге болады.
Google Cloud жүйесіне кіріп, жоба жасаңыз және ол үшін шот ұсынуды қосыңыз. Пәрмен жолы утилитасын орнатыңыз gcloud init
.
Әдепкі жобаны, есептеу аймағын және аймақты орнатыңыз (алмастыру PROJECT_ID
сіздің жобаңыз үшін):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
GKE қызметін қосыңыз және HPA және 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
Жоғарыдағы пәрмен екі VM қосатын әдепкі түйін пулын жасайды n1-standard-2
(vCPU: 2, жедел жады 7,5 ГБ, диск: 30 ГБ). Ең дұрысы, Istio құрамдастарын жұмыс жүктемелерінен оқшаулау керек, бірақ Istio Pods түйіндерінің арнайы пулында іске қосудың оңай жолы жоқ. Istio манифесттері тек оқуға арналған деп саналады және GKE түйінге байланыстыру немесе подкасттан ажырату сияқты кез келген өзгерістерді болдырмайды.
үшін тіркелгі деректерін орнатыңыз kubectl
:
gcloud container clusters get-credentials istio
Кластер әкімшісі рөлін байланыстыруды жасаңыз:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Пәрмен жолы құралын орнатыңыз
brew install kubernetes-helm
Homebrew 2.0 енді қол жетімді
Tiller үшін қызмет тіркелгісін және кластер рөлін байланыстырыңыз:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Ат кеңістігіндегі Tiller параметрін кеңейтіңіз kube-system
:
helm init --service-account tiller
Helm және Tiller арасында SSL пайдалануды қарастырған жөн. Helm орнатуын қорғау туралы қосымша ақпаратты қараңыз
Параметрлерді растау:
kubectl -n istio-system get svc
Бірнеше секундтан кейін GCP қызмет үшін сыртқы IP мекенжайын тағайындауы керек istio-ingressgateway
.
Istio Ingress шлюзін конфигурациялау
Аты бар статикалық IP мекенжайын жасаңыз istio-gateway
Istio шлюзінің IP мекенжайын пайдалану:
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
Енді сізге интернет домені және DNS тіркеушісіне кіру қажет. Екі А жазбасын қосыңыз (алмастыру example.com
доменіңізге):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
DNS қойылмалы таңбасының жұмыс істеп тұрғанын тексеріңіз:
watch host test.istio.example.com
HTTP арқылы қызмет торынан тыс қызметтерді ұсыну үшін жалпы Istio шлюзін жасаңыз:
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:
- "*"
Жоғарыдағы ресурсты public-gateway.yaml ретінде сақтаңыз, содан кейін оны қолданыңыз:
kubectl apply -f ./public-gateway.yaml
Ешбір өндіріс жүйесі Интернетте SSL жоқ қызметтерді көрсетпеуі керек. Istio кіру шлюзін cert-manageger, CloudDNS және Let's Encrypt көмегімен қорғау үшін оқыңыз.
Жалаушаны орнату
GKE Istio қондырмасы Istio телеметрия қызметін тазартатын Prometheus данасын қамтымайды. Flagger канариялық талдауды орындау үшін Istio HTTP метрикасын пайдаланатындықтан, ресми Istio Helm схемасымен бірге келетінге ұқсас келесі Prometheus конфигурациясын қолдану қажет.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Flagger Helm репозиторийін қосыңыз:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Flagger қолданбасын аттар кеңістігіне кеңейтіңіз istio-system
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 бағдарламасын 9090 портында Istio Prometheus қызметімен байланыса алатын кез келген аттар кеңістігінде орнатуға болады.
Flagger қолданбасында канариялық талдауға арналған Grafana бақылау тақтасы бар. Атау кеңістігіне Grafana орнатыңыз 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
Виртуалды қызметті жасау арқылы Grafana-ны ашық шлюз арқылы ашыңыз (алмастыру example.com
доменіңізге):
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
Жоғарыдағы ресурсты grafana-virtual-service.yaml ретінде сақтаңыз, содан кейін оны қолданыңыз:
kubectl apply -f ./grafana-virtual-service.yaml
көшкен кезде http://grafana.istio.example.com
браузерде сіз Grafana кіру бетіне бағытталуыңыз керек.
Flagger көмегімен веб-қосымшаларды қолдану
Flagger Kubernetes қолданбасын орналастырады және қосымша түрде автоматты түрде кеңейтеді (HPA), содан кейін нысандар қатарын жасайды (Kubernetes орналастырулары, ClusterIP қызметтері және Istio виртуалды қызметтері). Бұл нысандар қолданбаны қызмет көрсету торына көрсетеді және канарлық талдау мен прогресті басқарады.
Istio Sidecar инъекциясы қосылған сынақ аттар кеңістігін жасаңыз:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Орналастыруды және автоматты кеңейту құралын жасаңыз:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Канариялық талдау кезінде трафикті жасау үшін сынақ жүктеу қызметін қолданыңыз:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Теңшелетін канарей ресурсын жасаңыз (алмастыру example.com
доменіңізге):
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/"
Жоғарыдағы ресурсты podinfo-canary.yaml ретінде сақтаңыз, содан кейін оны қолданыңыз:
kubectl apply -f ./podinfo-canary.yaml
Жоғарыдағы талдау, егер сәтті болса, HTTP метрикасын әрбір жарты минут сайын тексеріп, бес минут бойы жұмыс істейді. Келесі формуланы пайдаланып, канареяны орналастыруды растау және жылжыту үшін қажетті ең аз уақытты анықтауға болады: interval * (maxWeight / stepWeight)
. Canary CRD өрістері құжатталған
Бірнеше секундтан кейін Flagger канариялық нысандарды жасайды:
# 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
Браузерді ашып, өтіңіз app.istio.example.com
, нұсқа нөмірін көруіңіз керек
Автоматты канарей талдау және жылжыту
Flagger HTTP сұрауының сәтті жылдамдығы, орташа сұрау ұзақтығы және бөлімнің күйі сияқты негізгі өнімділік көрсеткіштерін өлшеу кезінде трафикті біртіндеп канарияға жылжытатын басқару циклін жүзеге асырады. KPI талдауына сүйене отырып, канарей көтеріледі немесе үзіледі және талдау нәтижелері Slack сайтында жарияланады.
Canary орналастыру келесі нысандардың бірі өзгерген кезде іске қосылады:
- PodSpec қолданбасын (контейнер кескіні, пәрмен, порттар, env және т.б.)
- ConfigMaps томдар ретінде орнатылады немесе орта айнымалыларымен салыстырылады
- Құпиялар томдар ретінде орнатылады немесе орта айнымалыларына түрлендіріледі
Контейнер кескінін жаңарту кезінде canary deploy іске қосыңыз:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger қолдану нұсқасының өзгергенін анықтайды және оны талдауды бастайды:
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
Талдау кезінде канарей нәтижелерін Grafana көмегімен бақылауға болады:
Канариялық талдау кезінде орналастыруға жаңа өзгерістер қолданылса, Flagger талдау кезеңін қайта бастайтынын ескеріңіз.
Кластеріңіздегі барлық канареялардың тізімін жасаңыз:
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
Slack хабарландыруларын қосқан болсаңыз, келесі хабарларды аласыз:
Автоматты кері қайтару
Канариялық талдау кезінде Flagger қолдануды тоқтататынын көру үшін синтетикалық HTTP 500 қателерін және жоғары жауап кідірісін жасай аласыз.
Сынақ алаңын жасаңыз және онда келесі әрекеттерді орындаңыз:
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 қателерін жасау:
watch curl http://podinfo-canary:9898/status/500
Кешіктіру генерациясы:
watch curl http://podinfo-canary:9898/delay/1
Сәтсіз тексерулердің саны шекті мәнге жеткенде, трафик бастапқы арнаға қайта бағытталады, канар нөлге дейін масштабталады және орналастыру сәтсіз деп белгіленеді.
Канариялық қателер мен кідірістің жоғарылауы Kubernetes оқиғалары ретінде тіркеледі және Flagger арқылы 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
Slack хабарландыруларын қосқан болсаңыз, соңғы мерзім өткенде немесе талдаудағы сәтсіз тексерулердің максималды санына жеткенде хабар аласыз:
Қорытындылай келе
Kubernetes-ке қосымша Istio сияқты қызмет торын іске қосу автоматты көрсеткіштерді, журналдарды және протоколдарды қамтамасыз етеді, бірақ жұмыс жүктемесін орналастыру әлі де сыртқы құралдарға байланысты. Flagger мұны Istio мүмкіндіктерін қосу арқылы өзгертуді мақсат етеді
Flagger кез келген Kubernetes CI/CD шешімімен үйлесімді және канарей талдауын оңай кеңейтуге болады.
Жалаушаға қолдау көрсетіледі
Flagger-ді жақсарту бойынша ұсыныстарыңыз болса, GitHub сайтында мәселені немесе PR-ды жіберіңіз
сізге рахмет
Ақпарат көзі: www.habr.com