Как создать развертывания с более чем одним модулем?

#kubernetes #google-cloud-platform

#kubernetes #google-облачная платформа

Вопрос:

Я размещаю приложение на облачной платформе Google через Kubernetes, и мне удалось настроить этот непрерывный конвейер развертывания:

  1. Код приложения обновлен
  2. Автоматически создается новый образ Docker
  3. Развертывание K8s автоматически обновляется для использования нового образа

Это отлично работает, за исключением одной проблемы — кажется, что в развертывании всегда есть только один модуль. Из-за этого, когда наступает следующий цикл обновления, все приложение отключается, что недопустимо.

Я попытался изменить YAML развертывания, чтобы увеличить количество реплик, и это работает… до следующего обновления образа, когда он снова сбрасывается в один модуль.

Это команда, которую я использую для обновления развертывания образа:

 set image deployment foo-server gcp-cd-foo-server-sha256=gcr.io/project-name/gcp-cd-foo-server:$REVISION_ID
  

Ответ №1:

Вы можете использовать эту команду, если не хотите редактировать файл развертывания yaml:

 kubectl scale deployment foo-server --replicas=2
  

Кроме того, посмотрите на стратегию обновления со свойствами maxUnavailable и maxsurge.

Комментарии:

1. Я в курсе стратегий обновления, проблема в том, что количество модулей сбрасывается обратно на 1 при каждом обновлении, поэтому они на самом деле ничего не делают.

2. посмотрите на количество реплик в вашем файле развертывания. Он получен оттуда. если вы не найдете его там, укажите его с желаемым количеством.

Ответ №2:

В вашем файле orgional deployment.yml сохраняйте реплики до 2 или более, в противном случае вы не сможете избежать простоя, если запущен только один модуль, и вы собираетесь повторно развернуть / обновить и т.д.

Развертывание с 3 репликами (пример):

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
  

Развертывание может гарантировать, что только определенное количество модулей может быть отключено
пока они обновляются. По умолчанию это гарантирует, что не менее 25%
подключено меньше желаемого количества модулей (недоступно максимум 25%).

Развертывание также может гарантировать, что сверх желаемого количества модулей может быть создано только определенное количество модулей. По умолчанию это гарантирует, что подключено не более чем на 25% больше желаемого количества модулей (максимальный скачок напряжения 25%).

https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

Ответ №3:

Неважно, я просто неправильно настроил свои развертывания — это было как-то связано с использованием пользовательского интерфейса GCP для создания развертываний, а не консольных команд. Вместо этого я создал развертывания с kubectl run app --image ... , и теперь это работает.