У меня есть конкретный сценарий, в котором я хочу, чтобы развертывание контролировалось автоматическим масштабированием горизонтального модуля. Чтобы выполнить миграцию базы данных в модулях при отправке нового развертывания, я следовал отличному руководству Эндрю Лока здесь.
.Короче говоря, вы должны определить initContainer
, который waits
для Kubernetes Job
, чтобы завершить процесс (например, выполнить миграцию БД) до того, как новые модули смогут запуститься.
Это работает хорошо, однако я не знаю, как обращаться с HPA после первоначального развертывания, потому что, если система обнаружит необходимость добавить еще один Pod
в мой узел, для initContainer
, определенного в моем развертывании, потребуется Job
для развертывания и запуска, но поскольку Jobs
являются одноразовыми процессами, модуль не может инициализироваться и работать должным образом (атрибут ttlSecondsAfterFinished
в любом случае удаляет Job
).
Как мне определить initContainer
для запуска при развертывании моего приложения, чтобы я мог выполнять миграцию моей базы данных в Job
, а также разрешить HPA контролировать динамическое добавление Pod
без необходимости initContainer
?
Вот как выглядит мой deployment
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: graphql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: graphql-pod
template:
metadata:
labels:
app: graphql-pod
spec:
initContainers:
- name: wait-for-graphql-migration-job
image: groundnuty/k8s-wait-for:v1.4 # This is an image that waits for a process to complete
args:
- job
- graphql-migration-job # this job is defined next
containers:
- name: graphql-container
image: image(graphql):tag(graphql)
Также развернуто следующее Job
apiVersion: batch/v1
kind: Job
metadata:
name: graphql-migration-job
spec:
ttlSecondsAfterFinished: 30
template:
spec:
containers:
- name: graphql-migration-container
image: image(graphql):tag(graphql)
command: ["npm", "run", "migrate:reset"]
restartPolicy: Never
Итак, в основном происходит следующее:
- Я развертываю эти два ресурса на своем узле
-
Job
инициализируется -
initContainer
наPod
ожидает завершенияJob
с использованием образа с именемgroundnuty/k8s-wait-for:v1.4
-
Job
завершает -
initContainer
завершает -
Pod
инициализирует - (через 30 секунд TTL)
Job
удаляется с узла
(МНОГО ДВИЖЕНИЯ)
- HPA осознает потребность в другом модуле
-
initContainer
для НОВОГО модуля запущен, но не может быть запущен, посколькуJob
не существует - ...crashLoopBackOff
Было бы интересно узнать, как правильно справиться с этим сценарием!
Требуется ли запускать задание для каждого нового модуля или это только одна вещь?
@papanito хороший вопрос, важно запустить задание только при первоначальном развертывании. Кроме этого, нет, задание просто запускает мой сценарий миграции БД, который не нужно запускать при горизонтальном автомасштабировании. Полезная функция initContainer и
wait-for
заключается в том, что он не запускает ни один из новых модулей до тех пор, пока задание не будет завершено, а затем масштабирует новые модули и удаляет старые, чтобы не было времени простоя.