Canary Deployment за допомогою Jenkins-X Istio Flagger
Виконувати Canary-деплой ми будемо руками через GitOps та створення/зміну основних ресурсів Kubernetes. Ця стаття призначена насамперед для знайомства з тим, як працює в Kubernetes Canary деплою, тому що є більш ефективні способи автоматизації, які ми розглянемо в наступних статтях.
При Canary-стратегії поновлення спочатку застосовуються тільки для частини користувачів. Через моніторинг, дані з логів, ручне тестування чи інші канали зворотний зв'язок реліз тестується перед застосуванням всім користувачів.
Kubernetes Deployment (rolling update)
Стратегія за замовчуванням для Kubernetes Deployment – це rolling-update, де запускається певна кількість подів із новими версіями образів. Якщо вони створилися без проблем, поди зі старими версіями образів завершуються, а нові поди створюються паралельно.
GitOps
Ми використовуємо GitOps у цьому прикладі, тому що ми:
використовуємо Git як єдине джерело істини
використовуємо Git Operations для складання та деплою (ніяких команд, крім git tag/merge не потрібно)
Приклад
Візьмемо хорошу практику – мати один репозиторій для коду додатків та один для інфраструктури.
Репозиторій для додатків
Це дуже проста 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 виглядає наступним чином:
Ми пушимо ці зміни до репозиторію, з якого запуститься деплою (через GitlabCI) і бачимо в результаті:
Наш Service буде вказувати на обидва деплої, так як у обох є селектор app. Через випадковий розподіл за замовчуванням у Kubernetes ми повинні побачити різні відповіді на ~ 10% запитів:
Поточний стан нашої програми (GitOps, взятий з Git як із Single Source Of Truth) це наявність двох deployments з активними репліками, по одному для кожної версії.
~10% користувачів знайомляться з новою версією та ненавмисно тестують її. Тепер настав час перевірити наявність помилок у логах та даних моніторингу для пошуку проблем.
Крок 2: випустити нову версію для всіх користувачів
Ми вирішили, що все пройшло добре, і тепер нам потрібно розгорнути нову версію на всіх користувачів. Для цього ми просто оновлюємо deploy.yaml встановлюючи нову версію образу і кількість реплік, що дорівнює 10. deploy-canary.yaml ми встановлюємо кількість реплік рівну назад 0. Після деплою результат буде наступним:
Підводячи підсумок
Для мене запуск деплою вручну таким чином допомагає зрозуміти, як легко він може бути налаштований за допомогою k8s. Оскільки Kubernetes дозволяє оновлювати все через API, ці кроки можна автоматизувати через скрипти.
Ще одна річ, яку потрібно реалізувати - це точка входу тестувальника (LoadBalancer або через Ingress), через яку можна отримати доступ лише до нової версії. Вона може бути використана для перегляду вручну.
У наступних статтях ми перевіримо інші автоматизовані рішення, які реалізують більшість того, що ми зробили.