Совершенствуем развертывание приложений в Kubernetes с помощью Canary Deployment

91f82f3ae38f26574aefd579a8fd0473.jpg

415572fd421cc9611203e701dc41537d.jpgАвтор статьи: Рустем Галиев

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

404eb415d676315660d9917977714a74.png

Маршрутизация трафика к репликам случайного генератора развертывания происходит через сервис типа 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

75a0e29a3915654c2130c32135925f0c.png

В 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

6d8230a044a19827eee313d0f49cce02.png

Как работает Канареечный релиз:

3126f1ec27c6de2115466975805d990b.png

Можно попробовать подключиться к сервису с помощью временного пода, как показано ниже. Трафик будет направлен на реплики старого или нового деплоймента:

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. Регистрация доступна по ссылке.

© Habrahabr.ru