Совершенствуем развертывание приложений в Kubernetes с помощью Canary Deployment
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. Регистрация доступна по ссылке.