Цанари имплементација у Кубернетес #2: Арго Роллоутс

Користићемо к8с-нативе Арго Роллоутс контролер за примену и ГитлабЦИ за покретање Цанари имплементације у Кубернетес-у

Цанари имплементација у Кубернетес #2: Арго Роллоутс

https://unsplash.com/photos/V41PulGL1z0

Чланци у овој серији

Цанари Деплоимент

Надамо се да сте прочитали Први део, где смо укратко објаснили шта су Цанари Деплоиментс. Такође смо показали како то имплементирати користећи стандардне Кубернетес ресурсе.

Арго Роллоутс

Арго Роллоутс је домаћи контролер за примену Кубернетеса. Обезбеђује ЦРД (прилагођену дефиницију ресурса) за Кубернетес. Захваљујући томе, можемо користити нови ентитет: Rollout, који управља плаво-зеленим и канаринским применама са различитим опцијама конфигурације.

Арго Роллоутс контролер који користи прилагођени ресурс Rollout, Омогућава додатне стратегије примене као што су плаво-зелена и канаринац за Кубернетес. Ресурс Rollout пружа еквивалентну функционалност Deployment, само са додатним стратегијама примене.
ресурс Deployments има две стратегије за примену: RollingUpdate и Recreate. Иако су ове стратегије погодне за већину случајева, за примену на сервере у веома великом обиму, користе се додатне стратегије, као што су плаво-зелена или канаринац, које нису доступне у контролеру примене. Да би користили ове стратегије у Кубернетес-у, корисници су морали да напишу скрипте поврх својих имплементација. Арго Роллоутс Цонтроллер излаже ове стратегије као једноставне, декларативне, конфигурабилне параметре.
https://argoproj.github.io/argo-rollouts

Постоји и Арго ЦИ који пружа веб интерфејс прилагођен кориснику за употребу са Роллоутс-има, то ћемо погледати у следећем чланку.

Инсталирање Арго Роллоут-а

Сервер сиде

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

У нашој инфраструктурној репи (види доле) већ смо додали инсталл.иамл као и/к8с/арго-роллоутс/инсталл.иамл. На овај начин ће га ГитлабЦИ инсталирати у кластер.

Клијентска страна (кубецтл додатак)

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

Пример апликације

Добра је пракса имати одвојена спремишта за код апликације и инфраструктуру.

Репозиторијум за апликацију

Ким Вуесткамп/к8с-деплоимент-екампле-апп

Ово је веома једноставан Питхон+Фласк АПИ који враћа одговор као ЈСОН. Направићемо пакет користећи ГитлабЦИ и гурнути резултат у Гитлаб Регистри. У регистру имамо две различите верзије издања:

  • вуесткамп/к8с-деплоимент-екампле-апп:в1
  • вуесткамп/к8с-деплоимент-екампле-апп:в2

Једина разлика између њих је враћена ЈСОН датотека. Користимо ову апликацију да што лакше визуелизујемо са којом верзијом комуницирамо.

Репозиторијум инфраструктуре

У овом спремишту ћемо користити ГитлабЦИ за примену у Кубернетес, .гитлаб-ци.имл изгледа овако:

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 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 у ГитлабЦИ, који ће садржати конфигурацију за приступ kubectl свом кластеру.

Овде Можете прочитати о томе како да добијете акредитиве за кластер (Гцлоуд).

Инфраструктура Иамл

Унутар складишта инфраструктуре имамо услугу:

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

и роллоут.иамл :

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 ради исто као и Деплоимент. Ако не поставимо стратегију ажурирања (као што је канаринац овде), она ће се понашати као подразумевана имплементација са сталним ажурирањем.

Дефинишемо два корака у иамл-у за примену Цанари:

  1. 10% саобраћаја ка канаринцу (сачекајте да се ручно у реду)
  2. 50% саобраћаја до канаринца (сачекајте 2 минута па наставите до 100%)

Извођење почетног постављања

Након почетног постављања, наши ресурси ће изгледати овако:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

А одговор добијамо само од прве верзије апликације:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

Извођење Цанари Деплоимент

Корак 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
...

И ми гурамо промене, тако да се Гитлаб ЦИ примењује и видимо промене:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

Сада ако приступимо сервису:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

Велики! Налазимо се усред нашег распореда канаринца. Можемо видети напредак тако што ћемо покренути:

kubectl argo rollouts get rollout rollout-canary

Цанари имплементација у Кубернетес #2: Арго Роллоутс

Корак 2: 50% саобраћаја:

Сада пређимо на следећи корак: преусмеравање 50% саобраћаја. Конфигурисали смо овај корак да се покреће ручно:

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

Цанари имплементација у Кубернетес #2: Арго Роллоутс

А наша апликација је вратила 50% одговора из нових верзија:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

И преглед увођења:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

Предивна.

Корак 3: 100% саобраћаја:

Подесили смо га тако да се после 2 минута корак од 50% аутоматски завршава и корак од 100% почиње:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

И излаз апликације:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

И преглед увођења:

Цанари имплементација у Кубернетес #2: Арго Роллоутс

Цанари имплементација је завршена.

Још примера са Арго Роллоутс-има

Овде има још примера, као што је како да подесите прегледе окружења и поређења на основу канаринца:

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

Видео о Арго Роллоутс и Арго ЦИ

Заиста препоручујем овај видео, он показује како Арго Роллоутс и Арго ЦИ раде заједно:

Укупан

Заиста ми се свиђа идеја да користим ЦРД-ове који управљају креирањем додатних типова имплементација или скупова реплика, преусмерава саобраћај итд. Рад са њима иде глатко. Затим бих желео да тестирам интеграцију са Арго ЦИ.

Међутим, изгледа да долази до великог спајања Арго ЦИ и Флук ЦИ, тако да бих могао сачекати док ново издање не изађе: Арго Флук.

Да ли сте имали искуства са Арго Роллоутс или Арго ЦИ?

Прочитајте и друге чланке на нашем блогу:

Извор: ввв.хабр.цом

Додај коментар