Сподіваємось, що Ви читали першу частину, де ми коротко пояснювали, що таке Canary Deployments. Ми також показували як його реалізувати використовуючи стандартні ресурси Kubernetes.
Argo Rollouts
Argo Rollouts – це Kubernetes-нативний контролер розгортання. Він надає CRD (Custom Resource Definition) для Kubernetes. Завдяки йому ми можемо використовувати нову сутність: Rolloutяка управляє blue-green і сanary deployments з різними варіантами налаштування.
Контролер Argo Rollouts, що використовується кастомним ресурсом Rollout, дозволяє використовувати додаткові стратегії розгортання, такі як blue-green та сanary для Kubernetes. Ресурс Rollout надає функціонал рівнозначний Deploymentтільки з додатковими стратегіями розгортання.
ресурс Deployments має дві стратегії для розгортання: RollingUpdate и Recreate. Незважаючи на те, що ці стратегії підходять для більшості випадків, для деплою на сервері в дуже великому масштабі використовують додаткові стратегії, такі як blue-green або canary, яких немає в Deployment контролері. Щоб використовувати ці стратегії в Kubernetes, користувачам доводилося писати скрипти поверх своїх Deployments. Контролер Argo Rollouts надає ці стратегії у вигляді простих декларативних параметрів, що настроюються. https://argoproj.github.io/argo-rollouts
Існує також Argo CI, який надає зручний веб-інтерфейс для використання разом із Rollouts, ми поглянемо на нього у наступній статті.
У нашій інфраструктурній ріпі (див. нижче) ми вже додали install.yaml як i/k8s/argo-rollouts/install.yaml. Таким чином, GitlabCI встановить його в кластер.
Це дуже проста API на Python+Flask, що повертає відповідь у вигляді JSON. Ми зберемо пакет, використовуючи GitlabCI і запустимо результат у Gitlab Registry. У регістрі у нас є дві різні версії релізів:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Єдина різниця між ними це JSON-файл, що повертається. Ми використовуємо цю програму для максимально простої візуалізації того, з якою версією ми спілкуємося.
Інфраструктурний репозиторій
У цьому репозиторії ми будемо використовувати GitlabCI для деплою в Kubernetes, .gitlab-ci.yml виглядає так:
Rollout працює так само, як і Deployment. Якщо ми не поставимо стратегію оновлення (як canary тут) він буде поводитися як дефолтний rolling-update Deployment.
Ми визначаємо два кроки у yaml для canary deployment:
10% трафіку на canary (wait for manual OK)
50% трафіку на canary (wait 2 minutes then continue to 100%)
Виконання початкового деплою
Після початкового деплою наші ресурси виглядатимуть так:
І отримуємо відповідь тільки від першої версії програми:
Виконуємо Canary Deployment
Крок 1: 10% трафіку
Щоб почати canary розгортання, нам просто потрібно змінити версію образу, як ми зазвичай робимо з розгортаннями:
Я дійсно рекомендую це відео, у ньому показується як Argo Rollouts та Argo CI працюють разом:
Підсумок
Мені дуже подобається ідея використання CRDs, які керують створенням додаткових типів deployments або replicasets, перенаправляють трафік ітд. Робота з ними відбувається гладко. Далі мені хотілося б протестувати інтеграцію з Argo CI.
Однак, зважаючи на все, наближається велике злиття Argo CI і Flux CI, так що я міг би почекати, поки не вийде новий реліз: Argo Flux.