Автор статьи: Рустем Галиев
IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM
Привет, Хабр! В мире современной разработки программного обеспечения Kubernetes стал непреложным стандартом для оркестрации контейнеров. Его масштабируемость, надежность и гибкость сделали его первым выбором для многих команд, стремящихся ускорить процесс развертывания и обновления приложений. Однако, с ростом сложности проектов и ожиданиями пользователей, даже Kubernetes иногда не способен гарантировать безотказное развертывание новых версий приложений.
Именно здесь на сцену выходит Canary Deployment - практика, которая позволяет пошагово внедрять новые версии приложений, минимизируя риски и предоставляя возможность быстро реагировать на возможные проблемы. В этой статье мы погрузимся в мир Canary Deployment в Kubernetes и рассмотрим его внедрение, настройку и передовые методики для обеспечения бесперебойных обновлений приложений. Приготовьтесь к тому, чтобы усовершенствовать свой процесс развертывания и достичь высокой степени надежности в мире контейнеризации и оркестрации!
Canary Deployment (или деплоймент "канарейка") - это методика поэтапного обновления приложений, который позволяет разработчикам и DevOps-командам минимизировать риски при внедрении новых версий приложений, тестируя их на ограниченной аудитории перед полным развертыванием. Этот подход назван в честь традиционной практики использования канареек для проверки безопасности в шахтах: если канарейка жива, воздух безопасен для дыхания, если нет - это сигнализирует о проблема
Мы начнем с создания начального развертывания. Будем использовать тот же манифест, что использовали при блу-грине, который запускает версию 1.0 образа контейнера k8spatterns/random-generator
в контейнерах его реплик. Добавим определение деплоймента в файл Initial-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: random-generator-blue
spec:
replicas: 3
selector:
matchLabels:
app: random-generator
version: initial
template:
metadata:
labels:
app: random-generator
version: initial
spec:
containers:
- image: k8spatterns/random-generator:1.0
name: random-generator
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /info
port: 8080
initialDelaySeconds: 5
Выполним kubectl apply -f initial-deployment.yaml
kubectl get pods -l app=random-generator,version=initial
kubectl get pods -l app=random-generator,version=initia
Маршрутизация трафика к репликам случайного генератора развертывания происходит через сервис типа ClusterIP. Добавим следующее содержимое в новый файл service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: random-generator
spec:
selector:
app: random-generator
ports:
- protocol: TCP
port: 80
targetPort: 8080
Выполним:kubectl apply -f service.yaml
kubectl run tmp --image=alpine/curl:3.14 --restart=Never -it --rm -- curl random-generator.default.svc.cluster.local
В Kubernetes технику канареечного выпуска можно реализовать путем создания нового развертывания с небольшим количеством реплик, которое можно использовать в качестве канареечного экземпляра. На этом этапе сервис должен направить некоторых клиентов к обновленным экземплярам Pod.
Мы создадим еще один деплоймент, который будет запускать версию 2.0 образа k8spatterns/random-generator
в контейнерах его реплик. В этом случае мы создадим только одну реплику. Добавим определение в new-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: random-generator-new
spec:
replicas: 1
selector:
matchLabels:
app: random-generator
version: new
template:
metadata:
labels:
app: random-generator
version: new
spec:
containers:
- image: k8spatterns/random-generator:2.0
name: random-generator
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /info
port: 8080
initialDelaySeconds: 5
Запустим:
kubectl apply -f new-deployment.yaml
kubectl get pods -l app=random-generator,version=new
Как работает Канареечный релиз:
Можно попробовать подключиться к сервису с помощью временного пода, как показано ниже. Трафик будет направлен на реплики старого или нового деплоймента:
kubectl run tmp --image=alpine/curl:3.14 --restart=Never -it --rm -- curl random-generator.default.svc.cluster.local
После канареечного релиза и когда мы уверены, что с новым ReplicaSet все работает как положено, мы масштабируем новый ReplicaSet вверх, а старый ReplicaSet уменьшаем до нуля. В каком-то смысле мы выполняем контролируемое и тестируемое пользователями постепенное развертывание.
Canary-релиз — отличный способ провести A/B-тестирование исправления ошибки или новой функции группой потребителей. Для маршрутизации трафика вы можете подумать о включении балансировщика нагрузки для более детального распределения трафика между версиями приложения.
Canary Deployment часто используется в совокупности с инструментами управления контейнерами, такими как Kubernetes. Kubernetes предоставляет мощные средства для управления развертыванием и автоматического масштабирования, что делает его идеальным выбором для этой методики.
Использование Canary Deployment позволяет организациям быстрее и безопаснее внедрять новые функции и улучшения, сокращая временной промежуток между разработкой и выпуском, а также повышая уровень довольных пользователей.
А если вы только начинаете свое знакомство с Kubernetes, приглашаю на бесплатный вебинар, где мы сделаем первые шаги в использовании Kubernetes и познакомимся с различными способами развертывания локального Kubernetes кластера. Вы узнаете, как установить и настроить Kubernetes с использованием инструментов, таких как Minikube, Kind или Docker Desktop. Регистрация доступна по ссылке.
saboteur_kiev
ClusterIP может распределять трафик совсем не так, как ожидается. Например кидать на первый попавшийся под всех клиентов, пока трафик не будет слишком велик. В случае трех подов из старой реплики и одного пода из новой реплики, есть вероятность что на новую версию клиенты вообще не попадут, во-вторых на новый под будут приходить не все пакеты (stateless приложение же?).
Или наоборот все клиенты будут попадать на новую версию.
Как именно вы планируете распределять контролируемое количество клиентов на второй под при помощи clusterIP?
ToomIm
Предположу что должно всё должно работать с помощью ингресса который будет группу пользователей и/или региональную группу доставлять именно в под назначения. Иначе, как вы и сказали, нет гарантии что какая то группа будет попадать именно на 2.0
saboteur_kiev
Я про то, что в статье про считай самый важный момент канари деплоймента вообще не описан. Просто поднять рядом под с еще одной версией можно как угодно. Вопрос как правильно трафику туда прокинуть.