#kubernetes #google-cloud-platform
#kubernetes #google-облачная платформа
Вопрос:
Я размещаю приложение на облачной платформе Google через Kubernetes, и мне удалось настроить этот непрерывный конвейер развертывания:
- Код приложения обновлен
- Автоматически создается новый образ Docker
- Развертывание 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 ...
, и теперь это работает.