Поиск по сайту
Ctrl + K
Вопросы по Docker

Как реализовать канареечные развертывания с использованием 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, можно легко и эффективно реализовать канареечные развертывания. Этот процесс позволяет минимизировать риски и улучшить качество развертываний, позволяя проверить новую функциональность на небольшой группе пользователей, прежде чем сделать её доступной для всех.