Уменьшение размера подов не изящно при использовании Kafka-connect в кубернетах
Я запускал свой kafka-connect на двух машинах ec2. Таким образом, независимо от количества задач, эти две машины всегда будут выполнять задачи. Отсюда под подержанными машинами. Недавно я перенес kafka-connect на кубернетах. Я добился хорошей эффективности процессора / памяти.
Но проблема возникает, когда происходит масштабирование кубернетов. Уменьшение размера контейнеров не происходит изящно.
Например. Предположим, есть 2 модуля p1 и p2. p1 выполняет 3 задачи t1,t2,t3 p2 выполняет 2 задачи t4,t5 (здесь задача t5 - это задача для исходного коннектора, которая передает данные из postgres в kafka)
Когда какой-либо модуль исчезает во время масштабирования, выполняемые в нем задачи повторно балансируются на других модулях. Предположим, что под p2 исчезает.
После ребалансировки задачи новое состояние кластера:- P1 выполняет 5 задач t1,t2,t3,t4_new,t5_new
Но в журналах моего исходного коннектора говорится, что какая-то другая задача (предположительно задача, запущенная на более старом модуле t5) все еще выполняется и обращается к данным postgres db.
Как я могу убедиться, что при уменьшении масштаба модуля это происходит корректно в том смысле, что все задачи, выполняемые в модуле, останавливаются.
2 ответа
Возможно, по умолчанию grace period
вам недостаточно приложения, чтобы завершить свои задачи после получения SIGTERM
сингал.
SIGTERM
сигнал отправляется основному процессу в контейнере, и после получения сигнала контейнер должен начать постепенное завершение работы запущенного приложения и выйти.
Там это очень хорошее объяснение / поток, описанные в kubernetes официальной документации оTermination of Pods
.
Вы можете попробовать продлить terminationGracePeriodSeconds
в вашем развертывании, чтобы узнать, помогает ли это (по умолчанию 30):
spec:
replicas:
template:
spec:
containers:
- name: test
image: ...
terminationGracePeriodSeconds: 60
Другой способ - использовать preStop
крючок. preStop
hook выполняется непосредственно перед завершением работы контейнера. Как это работает, когда контейнер должен быть завершен, Kubelet запускает pre-stop hook и только затем отправляетSIGTERM
к процессу. Это можно использовать для плавного завершения работы контейнера.
Его также можно использовать для выполнения некоторых других операций перед завершением работы, не выполняя их в самом приложении.
Это простой пример того, как это работает (это HTTP GET
запрос, который будет отправлен на http:///shutdown):
lifecycle:
preStop:
httpGet:
port: 80
path: shutdown
Здесь также есть ссылка на документацию Kubernetes оContainer hooks
. Сообщите мне, было ли это полезно.
Просто увеличьте тайм-аут выключения "task.shutdown.graceful.timeout.ms" в конфигурации kafka-connect. Также используйте перехватчики preStop для стручков и используйте некоторую команду сна в перехвате, чтобы kubelet дождался завершения перехвата и после этого запустил SIGTERM.