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

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

Комментарии (3)


  1. saboteur_kiev
    05.10.2023 15:51

    ClusterIP может распределять трафик совсем не так, как ожидается. Например кидать на первый попавшийся под всех клиентов, пока трафик не будет слишком велик. В случае трех подов из старой реплики и одного пода из новой реплики, есть вероятность что на новую версию клиенты вообще не попадут, во-вторых на новый под будут приходить не все пакеты (stateless приложение же?).
    Или наоборот все клиенты будут попадать на новую версию.

    Как именно вы планируете распределять контролируемое количество клиентов на второй под при помощи clusterIP?


    1. ToomIm
      05.10.2023 15:51

      Предположу что должно всё должно работать с помощью ингресса который будет группу пользователей и/или региональную группу доставлять именно в под назначения. Иначе, как вы и сказали, нет гарантии что какая то группа будет попадать именно на 2.0


      1. saboteur_kiev
        05.10.2023 15:51

        Я про то, что в статье про считай самый важный момент канари деплоймента вообще не описан. Просто поднять рядом под с еще одной версией можно как угодно. Вопрос как правильно трафику туда прокинуть.