Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Kubernetes-те Canary орналастыруларын іске қосу үшін k8s-тің Argo Rollouts орналастыру контроллерін және GitlabCI-ді қолданамыз.

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Осы сериядағы мақалалар

Canary Deployment

Сіз оқисыз деп үміттенеміз бірінші бөлім, мұнда біз Canary Deployments дегеніміз не екенін қысқаша түсіндірдік. Біз сондай-ақ стандартты Kubernetes ресурстарын пайдалану арқылы оны қалай жүзеге асыру керектігін көрсеттік.

Argo Rollouts

Argo Rollouts - Kubernetes жергілікті орналастыру контроллері. Ол Kubernetes үшін CRD (пайдаланушы ресурс анықтамасы) береді. Оның арқасында біз жаңа нысанды пайдалана аламыз: Rollout, ол әртүрлі конфигурация опциялары бар көк-жасыл және канарлы орналастыруларды басқарады.

Argo Rollouts контроллері теңшелетін ресурспен пайдаланылады Rollout, Kubernetes үшін көк-жасыл және канария сияқты қосымша орналастыру стратегияларына мүмкіндік береді. Ресурс Rollout функционалдық эквивалентті қамтамасыз етеді Deployment, тек қосымша орналастыру стратегияларымен.
ресурс Deployments орналастырудың екі стратегиясы бар: RollingUpdate и Recreate. Бұл стратегиялар көп жағдайда қолайлы болғанымен, серверлерге өте кең ауқымда орналастыру үшін, Орналастыру контроллерінде қол жетімді емес көк-жасыл немесе канар сияқты қосымша стратегиялар пайдаланылады. Kubernetes-те осы стратегияларды пайдалану үшін пайдаланушылар орналастыруларының үстіне сценарий жазуы керек болды. Argo Rollouts Controller бұл стратегияларды қарапайым, декларативті, конфигурацияланатын параметрлер ретінде көрсетеді.
https://argoproj.github.io/argo-rollouts

Сондай-ақ Argo CI бар, ол Rollouts-пен пайдалану үшін ыңғайлы веб-интерфейсті қамтамасыз етеді, біз оны келесі мақалада қарастырамыз.

Argo Rollouts орнату

Сервер жағы

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

Біздің инфрақұрылымымызда (төменде қараңыз) install.yaml файлын i/k8s/argo-rollouts/install.yaml ретінде қостық. Осылайша GitlabCI оны кластерге орнатады.

Клиенттік тарап (kubectl плагині)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

Қолданбаның мысалы

Қолданба коды мен инфрақұрылымы үшін бөлек репозиторийлердің болуы жақсы тәжірибе.

Қолданбаға арналған репозиторий

Kim Wuestkamp/k8s-deployment-example-app

Бұл JSON ретінде жауапты қайтаратын өте қарапайым Python+Flask API. Біз пакетті GitlabCI көмегімен құрастырамыз және нәтижені Gitlab тізіліміне жібереміз. Тізілімде екі түрлі шығарылым нұсқасы бар:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

Олардың арасындағы жалғыз айырмашылық қайтарылған JSON файлы болып табылады. Біз бұл қолданбаны қай нұсқамен байланысып жатқанымызды мүмкіндігінше оңай визуализациялау үшін пайдаланамыз.

Инфрақұрылымдық репозиторий

Бұл репозиторийде біз GitlabCI-ді Kubernetes жүйесіне орналастыру үшін қолданамыз, .gitlab-ci.yml келесідей көрінеді:

image: traherom/kustomize-dockerbefore_script:
   - printenv
   - kubectl versionstages:
 - deploydeploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s    only:
     - master

Оны өзіңіз іске қосу үшін сізге кластер қажет, Gcloud пайдалануға болады:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

Сізге айыру керек https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure және айнымалыны жасаңыз KUBECONFIG GitlabCI жүйесінде, ол кіруге арналған конфигурацияны қамтиды kubectl сіздің кластеріңізге.

Бұл Кластерге (Gcloud) тіркелгі деректерін алу жолы туралы оқуға болады.

Инфрақұрылым Yaml

Инфрақұрылымдық репозиторийдің ішінде біздің қызметіміз бар:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

және rollout.yaml:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
 replicas: 10
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     id: rollout-canary
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       imagePullPolicy: Always
 strategy:
   canary:
     steps:
     - setWeight: 10
     # Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # two minutes

Rollout Орналастыру сияқты жұмыс істейді. Жаңарту стратегиясын орнатпасақ (мұнда канария сияқты) ол әдепкі жылжыту-жаңарту Орналастыру сияқты әрекет етеді.

Канарияны орналастыру үшін yaml-де екі қадамды анықтаймыз:

  1. Канарияға трафиктің 10% (қолмен OK күтіңіз)
  2. Канарияға 50% трафик (2 минут күтіңіз, содан кейін 100% дейін жалғастырыңыз)

Бастапқы орналастыруды орындау

Алғашқы орналастырудан кейін ресурстарымыз келесідей болады:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Біз тек қосымшаның бірінші нұсқасынан жауап аламыз:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Canary орналастыруды орындау

1-қадам: 10% трафик

Канарияны орналастыруды бастау үшін, әдетте орналастырулардағыдай кескін нұсқасын өзгерту керек:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
...
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...

Біз өзгерістерді итермелейміз, сондықтан Gitlab CI қолданады және біз өзгерістерді көреміз:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Енді қызметке кіретін болсақ:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Тамаша! Біз канареяны орналастырудың ортасындамыз. Прогрессті іске қосу арқылы көре аламыз:

kubectl argo rollouts get rollout rollout-canary

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

2-қадам: 50% трафик:

Енді келесі қадамға көшейік: трафиктің 50% қайта бағыттау. Біз бұл қадамды қолмен орындалатын етіп конфигурацияладық:

kubectl argo rollouts promote rollout-canary # continue to step 2

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Біздің қосымшамыз жаңа нұсқалардағы жауаптардың 50% қайтарды:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Және шығарылымды шолу:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Керемет.

3-қадам: 100% трафик:

Біз оны 2 минуттан кейін 50% қадам автоматты түрде аяқталып, 100% қадам басталатындай етіп орнаттық:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Және қолданбаның шығуы:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Және шығарылымды шолу:

Kubernetes №2-де канарларды орналастыру: Argo Rollouts

Canary орналастыру аяқталды.

Argo Rollouts көмегімен қосымша мысалдар

Мұнда канар негізіндегі ортаны алдын ала қарауды және салыстыруды орнату сияқты көбірек мысалдар бар:

https://github.com/argoproj/argo-rollouts/tree/master/examples

Argo Rollouts және Argo CI туралы бейне

Мен бұл бейнені шынымен ұсынамын, ол Argo Rollouts және Argo CI бірге қалай жұмыс істейтінін көрсетеді:

Нәтиже

Маған қосымша орналастыру түрлерін немесе репликасеттерді жасауды, трафикті қайта бағыттауды және т.б. басқаратын CRD пайдалану идеясы өте ұнайды. Олармен жұмыс бірқалыпты жүреді. Содан кейін мен Argo CI-мен интеграцияны тексергім келеді.

Дегенмен, Argo CI және Flux CI үлкен бірігуі келе жатқан сияқты, сондықтан мен жаңа шығарылым шыққанша күте аламын: Арго ағыны.

Argo Rollouts немесе Argo CI-мен тәжірибеңіз болды ма?

Сондай-ақ біздің блогтағы басқа мақалаларды оқыңыз:

Ақпарат көзі: www.habr.com

пікір қалдыру