Как реализовать канареечные развертывания с использованием Docker и Kubernetes?
Канареечное развертывание (canary deployment) — это метод развертывания, который позволяет тестировать новую версию приложения на ограниченной части пользователей, прежде чем полностью развернуть обновление. Этот метод позволяет избежать возможных проблем, которые могут возникнуть после развертывания, и минимизировать их влияние на пользователей. Рассмотрим, как можно реализовать канареечные развертывания с использованием Docker и Kubernetes.
Шаг 1: Подготовка Docker образов
Первым делом вам нужно создать Docker-образы как для старой, так и для новой версии вашего приложения. Например, вы можете создать Dockerfile
для вашего приложения.
# Dockerfile для версии 1.0
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Чтобы создать образ, выполните команду:
docker build -t my-app:1.0 .
Аналогично, создайте образ для более новой версии (например, 1.1
):
# Dockerfile для версии 1.1
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Создание образа:
docker build -t my-app:1.1 .
Шаг 2: Настройка Kubernetes
Сначала вам нужно создать Deployment
для вашего приложения. Вот пример YAML-файла для развертывания старой версии:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 4 # Делаем 4 реплики старой версии
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:1.0
ports:
- containerPort: 3000
Сохраните этот файл как deployment-old.yaml
, и примените его:
kubectl apply -f deployment-old.yaml
Шаг 3: Добавление новой версии в развертывание
Теперь добавим Deployment
для новой версии, которую мы будем разворачивать в качестве канарейки. Мы можем задать меньшее количество реплик для нового образа, чтобы ввести его в эксплуатацию постепенно.
Вот пример YAML для канареечного развертывания:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-canary
spec:
replicas: 1 # Делаем 1 реплику новой версии
selector:
matchLabels:
app: my-app-canary
template:
metadata:
labels:
app: my-app-canary
spec:
containers:
- name: my-app
image: my-app:1.1
ports:
- containerPort: 3000
Сохраните файл как deployment-canary.yaml
и примените его:
kubectl apply -f deployment-canary.yaml
Шаг 4: Настройка сервиса
Чтобы обеспечить доступ к приложению, создайте Service
, который будет направлять трафик на реплики, как старой так и канаречной версии.
apiVersion: v1
kind: Service
metadata:
name: my-app
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
Сохраните этот файл как service.yaml
и примените его:
kubectl apply -f service.yaml
Шаг 5: Мониторинг и оценка
Теперь, когда новые версии запущены, вы должны провести мониторинг. Если все работает корректно и нет никаких критических ошибок, вы можете увеличить количество реплик канаречной версии до 4, уменьшая количество реплик старой версии до 0.
# Обновляем канарейку до 4 реплик
kubectl scale deployment/my-app-canary --replicas=4
# Уменьшаем старую версию до 0
kubectl scale deployment/my-app --replicas=0
Вывод
Используя Docker и Kubernetes, можно легко и эффективно реализовать канареечные развертывания. Этот процесс позволяет минимизировать риски и улучшить качество развертываний, позволяя проверить новую функциональность на небольшой группе пользователей, прежде чем сделать её доступной для всех.