С помощью этого руководства вы научитесь работать с продвинутыми стратегиями развертывания контейнерных приложений Blue-Green Deployment и Canary Deployment в управляемом кластере Managed Kubernetes на платформе Cloud.ru Evolution.
Blue-Green Deployment — это метод развертывания, использующий две идентичные среды: синюю — текущую и зеленую — новую. Пока пользователи работают с синей средой, в зеленой разворачивается и тестируется обновление. После проверки весь трафик мгновенно переключается на зеленую среду. Это позволяет обновлять приложение без простоев и быстро откатываться в случае проблем.
Canary Deployment — это стратегия постепенного развертывания, при котором новая версия приложения сначала выпускается для небольшой группы пользователей. Это позволяет протестировать работу обновления в реальных условиях с минимальным риском. Если канареечная, то есть новая, версия показывает стабильность, развертывание постепенно расширяется на всех пользователей. Такой подход обеспечивает контроль над рисками и позволяет быстро откатить изменения при обнаружении проблем.
Вы будете использовать следующие сервисы:
Виртуальные машины — сервис, в рамках которого предоставляется виртуальная машина.
Managed Kubernetes — сервис управления кластерами Kubernetes на вычислительных ресурсах облака.
Artifact Registry для хранения, совместного использования и управления Docker-образами и Helm-чартами.
Docker — система контейнеризации.
Шаги:
Перед началом работы
-
Если вы уже зарегистрированы, войдите под своей учетной записью.
Убедитесь, что у вас достаточно прав для создания реестра и загрузки артефактов в сервисе Artifact Registry.
Создайте группу безопасности с правилами, разрешающими доступ по портам 8080 и 8081 для внешнего IP-адреса локальной машины. Узнайте адрес локальной машины через сервис https://www.myip.ru.
1. Сгенерируйте ключевую пару и загрузите публичный ключ SSH в облако Cloud.ru Evolution
2. Создайте виртуальную машину и установите Docker
Создайте виртуальную машину с параметрами:
Гарантированная доля vCPU — 10%.
vCPU, шт. — 2.
RAM, ГБ — 4.
Загрузочный диск → Размер, ГБ — 30.
Сетевой интерфейс №1 — Подсеть с публичным IP.
Группы безопасности — группа, созданная перед началом работы.
Авторизация пользователя → Метод аутентификации — Публичный ключ и Пароль.
В списке виртуальных машин появится новая ВМ. Примерно через минуту ее статус должен измениться на «Запущена».
Установите Docker на ВМ. Для этого в серийной консоли выполните команды:
sudo apt update -ysudo apt upgrade -ycurl -fsSL get.docker.com -o get-docker.sh && sh get-docker.shsudo groupadd dockersudo usermod -aG docker $USERnewgrp dockerЧтобы проверить, что Docker установлен и работает корректно, выполните команду:
docker version
3. Соберите образ простого веб-приложения
На ВМ создайте каталог с рабочим проектом deploy-lab:
mkdir ~/deploy-labВ этом каталоге создайте еще два: blue-app и green-app:
mkdir ~/deploy-lab/blue-appmkdir ~/deploy-lab/green-appВ каталоге blue-app создайте файл index.html:
nano ~/deploy-lab/blue-app/index.htmlВ index.html добавьте код:
<!DOCTYPE html><html lang="ru"><head><meta http-equiv="Cache-Control" content="no-cache"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Синий квадрат</title><style>body {margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #f0f8ff;font-family: Arial, sans-serif;}.blue-square {width: 250px;height: 250px;background-color: #0066ff;border-radius: 10px;box-shadow: 0 0 20px rgba(0, 102, 255, 0.5);display: flex;justify-content: center;align-items: center;color: white;font-size: 18px;font-weight: bold;text-align: center;}</style></head><body><div class="blue-square">Синяя версия 1.0<br>This is the stable version of the application.</div></body></html>Создайте dockerfile:
nano ~/deploy-lab/blue-app/dockerfileВ dockerfile добавьте код:
FROM nginx:alpineCOPY index.html /usr/share/nginx/html/index.htmlRUN rm -f /usr/share/nginx/html/*.defaultEXPOSE 80В каталоге green-app создайте файл index.html:
nano ~/deploy-lab/green-app/index.htmlВ index.html добавьте код:
<!DOCTYPE html><html lang="ru"><head><meta http-equiv="Cache-Control" content="no-cache"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Зеленый квадрат</title><style>body {margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #f0fff0;font-family: Arial, sans-serif;}.green-square {width: 250px;height: 250px;background-color: #00cc66;border-radius: 10px;box-shadow: 0 0 20px rgba(0, 204, 102, 0.5);display: flex;justify-content: center;align-items: center;color: white;font-size: 18px;font-weight: bold;text-align: center;}</style></head><body><div class="green-square">Зеленая версия 2.0<br>This is the new, updated version of the application!</div></body></html>Создайте dockerfile:
nano ~/deploy-lab/green-app/dockerfileВ dockerfile добавьте код:
FROM nginx:alpineCOPY index.html /usr/share/nginx/html/index.htmlRUN rm -f /usr/share/nginx/html/*.defaultEXPOSE 80Соберите образы приложений:
docker build -t blue-app:1.0 -f /home/<user>/deploy-lab/blue-app/dockerfile $HOME/deploy-lab/blue-app/docker build -t green-app:2.0 -f /home/<user>/deploy-lab/green-app/dockerfile $HOME/deploy-lab/green-app/Где <user> — имя пользователя, которое указали при создании ВМ.
Запустите контейнеры:
docker run -d -p 8080:80 --name blue-container blue-app:1.0docker run -d -p 8081:80 --name green-container green-app:2.0В адресную строку браузера введите по очереди адреса:
http://<public-ip>:8080 — приложение «Синий квадрат»;
http://<public-ip>:8081 — приложение «Зеленый квадрат».
Где <public-ip> — публичный IP-адрес, присвоенный ВМ при ее создании на шаге 2.
4. Создайте приватный реестр в Artifact Registry и загрузите образ приложения
-
Присвойте реестру название blue-green-canary-registry. Название реестра должно быть уникальным.
Чтобы перетегировать ранее собранные образы и залить их в blue-green-canary-registry, выполните команды:
docker tag blue-app:1.0 blue-green-canary-registry.cr.cloud.ru/blue-app:1.0docker tag green-app:2.0 blue-green-canary-registry.cr.cloud.ru/green-app:2.0docker push blue-green-canary-registry.cr.cloud.ru/blue-app:1.0docker push blue-green-canary-registry.cr.cloud.ru/green-app:2.0В результате этой операции образы blue-app и green-app появятся в Artifact Registry.
5. Создайте кластер Managed Kubernetes и подключите плагин Ingress Nginx
-
Кластер необходимо создавать в той же VPC, что и ВМ. Остальные параметры можно оставить по умолчанию.
При создании группы узлов укажите следующие параметры:
Гарантированная доля vCPU, % — 30.
CPU, шт. — 2.
RAM, ГБ — 4.
Объем хранилища — 30.
Количество узлов — 2.
Создание кластера занимает примерно пять минут.
В кластер установите Ingress Nginx.
6. Разверните Blue-приложение
В каталоге deploy-lab создайте манифест deploy-myapp-blue-v1.yaml:
cd ~/deploy-labnano deploy-myapp-blue-v1.yamlСкопируйте в deploy-myapp-blue-v1.yaml код манифеста:
apiVersion: apps/v1kind: Deploymentmetadata:name: blue-appspec:replicas: 3selector:matchLabels:app: demo-apptemplate:metadata:labels:app: demo-appversion: v1spec:containers:- name: webimage: blue-green-canary-registry.cr.cloud.ru/blue-app:1.0ports:- containerPort: 80Где blue-green-canary-registry.cr.cloud.ru/blue-app:1.0 — путь до образа, который был загружен в Artifact Registry.
В этом же каталоге создайте файл svc-myapp-blue.yaml:
nano svc-myapp-blue.yamlСкопируйте в файл svc-myapp-blue.yaml код манифеста:
# Сервис для основного приложения blue (v1)apiVersion: v1kind: Servicemetadata:name: blue-app-servicespec:selector:app: demo-appversion: v1 # Добавляя этот лейбл, мы маршрутизируем трафик только на деплоймент myapp-blueports:- protocol: TCPport: 80targetPort: 80type: ClusterIP # Внутренний сервис для доступа изнутри кластераВ этом же каталоге создайте файл ingress-myapp.yaml с содержимым:
# Этот Ingress будет направлять внешний трафик к нашему сервисуapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: demo-app-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /spec:ingressClassName: nginxrules:- http:paths:- path: /pathType: Prefixbackend:service:name: blue-app-serviceport:number: 80Чтобы создать ресурсы Kubernetes, выполните команды:
kubectl apply -f deploy-myapp-blue-v1.yamlkubectl apply -f svc-myapp-blue.yamlkubectl apply -f ingress-myapp.yamlПроверьте создание ресурсов:
kubectl get svc,pods,ingress
На этом шаге мы организовали подачу трафика на стабильную версию приложения demo-app извне через Ingress-контроллер.
Чтобы проверить работоспособность приложения, определите внешний IP Ingress-контроллера. Для этого используйте команду:
kubectl get svc -n=ingress
В результате вы увидите информацию по External IP:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-nginx-controller LoadBalancer 10.104.209.33 XX.XXX.XXX.XX 80:30652/TCP,443:30796/TCP 7h
Введите в браузере http://<EXTERNAL-IP> и увидите отображаемую версию приложения.
7. Реализуйте стратегию Blue-Green
В каталоге deploy-lab создайте YAML-манифест Green-приложения:
nano deploy-myapp-green-v2.yamlСкопируйте в deploy-myapp-green-v2.yaml код манифеста:
# Версия приложения на которую будем обновляться green (v2)apiVersion: apps/v1kind: Deploymentmetadata:name: green-app # Важно: другое имя!spec:replicas: 3selector:matchLabels:app: demo-apptemplate:metadata:labels:app: demo-appversion: v2spec:containers:- name: webimage: blue-green-canary-registry.cr.cloud.ru/green-app:2.0 # лейбл новой версии v2ports:- containerPort: 80В каталоге deploy-lab создайте svc-myapp-green.yaml:
nano svc-myapp-green.yamlСкопируйте в svc-myapp-green.yaml код манифеста:
# Сервис для приложения, на которое будем переключаться - green (v2)apiVersion: v1kind: Servicemetadata:name: green-app-servicespec:selector:app: demo-appversion: v2 # Добавляя этот лейбл, мы маршрутизируем трафик на сборку green (v2)ports:- protocol: TCPport: 80targetPort: 80type: ClusterIP # Внутренний сервис для доступа изнутри кластераЧтобы создать ресурсы Kubernetes, выполните команды:
kubectl apply -f deploy-myapp-green-v2.yamlkubectl apply -f svc-myapp-green.yamlПроверьте создание ресурсов:
kubectl get svc,podsЧтобы переключить трафик с версии приложения Blue (v1) на версию приложения Green (v2), внесите изменения в манифест ingress-myapp.yaml:
# Этот Ingress будет направлять трафик на основной сервис blue (v1) и в дальнейшем на green (v2) после обновленияapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: demo-app-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /spec:ingressClassName: nginxrules:- http:paths:- path: /pathType: Prefixbackend:service:name: green-app-service # Тут мы меняем имя сервиса и теперь трафик будет идти на сборку приложения green (v2)port:number: 80Примените внесенные изменения в манифесте:
kubectl apply -f ingress-myapp.yamlТеперь трафик идет на сборку приложения Green (v2).
Чтобы проверить изменения, обновите окно браузера, где раньше отображалось приложение с синим квадратом. Теперь отображается зеленый квадрат.
Таким образом, мы осуществили переключение с одной версии приложения Blue (v1) на другую Green (v2). В этом и заключается стратегия развертывания Blue-Green.
8. Реализуйте стратегию Canary
На ВМ в каталоге deploy-lab создайте файл deploy-canary.yaml с тем же образом, что и версия Green v2 — blue-green-canary-registry.cr.cloud.ru/green-app:2.0:
cd ~/deploy-labnano deploy-canary.yamlСкопируйте в deploy-canary.yaml код манифеста:
# Версия canary - сюда будет постепенно перенаправляться весь трафикapiVersion: apps/v1kind: Deploymentmetadata:name: demo-app-canaryspec:replicas: 1 # Одна реплика для canaryselector:matchLabels:app: demo-apptemplate:metadata:labels:app: demo-appversion: canary-v2 # Уникальная версия для canaryspec:containers:- name: webimage: blue-green-canary-registry.cr.cloud.ru/green-app:2.0 # оставляем тот же образ green-app 2.0ports:- containerPort: 80В каталоге deploy-lab создайте файл svc-canary.yaml:
nano svc-canary.yamlСкопируйте в svc-canary.yaml код манифеста:
apiVersion: v1kind: Servicemetadata:name: canary-servicespec:selector:app: demo-appversion: canary-v2 # добавляя этот лейбл мы маршрутизируем трафик только на деплоймент canaryports:- protocol: TCPport: 80targetPort: 80type: ClusterIP # Внутренний сервис для доступа изнутри кластераВ каталоге deploy-lab создайте файл ingress-canary.yaml:
nano ingress-canary.yamlСкопируйте в ingress-canary.yaml код манифеста:
# Этот Ingress будет управлять распределением трафика между основным и канареечным развертываниямиapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: ingress-canaryannotations:nginx.ingress.kubernetes.io/rewrite-target: /nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "10" # Направляем 10% трафика на canaryspec:ingressClassName: nginxrules:- http:paths:- path: /pathType: Prefixbackend:service:name: canary-serviceport:number: 80Чтобы создать ресурсы Kubernetes, выполните команды:
kubectl apply -f deploy-canary.yamlkubectl apply -f svc-canary.yamlkubectl apply -f ingress-canary.yamlПроверьте создание ресурсов:
kubectl get svc,pods,ingressЧтобы убедиться, что трафик обеспечен на основное приложение Blue (v1), измените Service в ingress-myapp.yaml:
# Этот Ingress будет направлять внешний трафик к нашему сервисуapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: demo-app-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /spec:ingressClassName: nginxrules:- http:paths:- path: /pathType: Prefixbackend:service:name: blue-app-serviceport:number: 80Примените манифест:
kubectl apply -f ingress-myapp.yamlБлагодаря такой архитектуре большая часть трафика по-прежнему идет на синюю версию приложения, но 10% трафика теперь идет на зеленое приложение. Чтобы проверить это, введите в адресную строку браузера IP-адрес Ingress и несколько раз обновите браузер. Вы увидите, что примерно в 10% случаев отображается зеленая версия приложения, а в остальных случаях — синяя.
То есть через Ingress-Canary мы задали правило распределения трафика в обе версии приложения: 90% в синее и 10% в зеленое.
Меняя настройки Ingress-Canary, можно регулировать объем трафика, идущий на Canary-приложение.
Чтобы направить 50% трафика на версию приложения Canary, измените правило Ingress-Canary в ingress-canary.yaml:
# Этот Ingress будет управлять распределением трафика между основным и канареечным развертываниямиapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: ingress-canaryannotations:nginx.ingress.kubernetes.io/rewrite-target: /nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "50" # Направляем 50% трафика на canaryspec:ingressClassName: nginxrules:- http:paths:- path: /pathType: Prefixbackend:service:name: canary-serviceport:number: 80Примените изменение:
kubectl apply -f ingress-canary.yamlЧтобы проверить перенаправление трафика, введите в адресную строку браузера IP-адрес Ingress и несколько раз обновите браузер. Вы увидите, что теперь примерно в половине случаев отображается зеленая версия приложения и половине — синяя.
Чтобы направить 100% трафика на версию приложения Canary, измените правило Ingress-Canary в ingress-canary.yaml:
# Этот Ingress будет управлять распределением трафика между основным и канареечным развертываниямиapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: ingress-canaryannotations:nginx.ingress.kubernetes.io/rewrite-target: /nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "100" # Направляем весь трафик на canaryspec:ingressClassName: nginxrules:- http:paths:- path: /pathType: Prefixbackend:service:name: canary-serviceport:number: 80Примените изменение:
kubectl apply -f ingress-canary.yaml
Теперь при обновлении браузера мы видим только Canary-версию приложения.
Таким образом, мы обновили наше приложение, подавая сначала трафик одновременно на текущую версию приложения Blue и новую версию Canary. В итоге мы перенесли 100% трафика на приложение Canary, тем самым реализовав стратегию развертывания Canary.
Результат
Вы научились работать с продвинутыми стратегиями развертывания контейнерных приложений Blue-Green Deployment и Canary Deployment в управляемом кластере Managed Kubernetes на платформе Cloud.ru Evolution. Эти методы позволяют обновлять приложения более управляемо и безопасно, сводя к минимуму простои и риски, связанные с внедрением новых версий.