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

Другие вопросы по тегам