首页 > 解决方案 > 在 kubernetes 上使用 Kafka-connect 时,Pod 的缩减并不优雅

问题描述

我在两台 ec2 机器上运行我的 kafka-connect。因此,无论任务数量如何,这两台机器都会始终保持运行任务。因此在二手机器下。最近我在 kubernetes 上迁移了 kafka-connect。我实现了良好的 CPU/内存效率。

但是当 Kubernetes 缩减规模时,问题就出现了pod 的缩减不会优雅地发生

例如。假设有 2 个 pod p1 和 p2。p1 正在运行 3 个任务 t1,t2,t3 p2 正在运行 2 个任务 t4,t5(这里任务 t5 是源连接器的任务,它将数据从 postgres 带到 kafka)

当任何 pod 在缩减期间消失时,在其上运行的任务会在其他 pod 上重新平衡。假设 pod p2 消失了。

任务重新平衡后集群的新状态是:- P1 正在运行 5 个任务 t1,t2,t3,t4_new,t5_new

但是我的源连接器的日志显示其他一些任务(可能是在旧 pod t5 上运行的任务)仍在运行并访问 postgres 数据库数据。

我如何确保 pod 缩小规模时,它会优雅地发生,因为在 pod 上运行的所有任务都已停止。

标签: kubernetesapache-kafka-connectconnect-rest

解决方案


可能是默认值grace period不足以让您的应用程序在收到SIGTERM信号后完成其任务。

SIGTERM信号被发送到容器中的主进程,一旦收到信号,容器应该开始正常关闭正在运行的应用程序并退出。

Kubernetes 官方文档中描述了一个非常好的解释/流程,关于Termination of Pods.

您可以尝试terminationGracePeriodSeconds在部署中扩展 以查看是否有帮助(默认值为 30):

spec:
    replicas: 
    template:
        spec:
            containers:
              - name: test
                image: ...
            terminationGracePeriodSeconds: 60

另一种方法是使用preStop钩子。preStop在容器终止之前立即执行钩子。它的工作原理是当容器需要终止时,Kubelet 将运行 pre-stop 钩子,然后才发送SIGTERM到进程。这可用于启动容器的正常关闭。

它还可以用于在关闭之前执行一些其他操作,而无需在应用程序本身中实现这些操作。

这是一个简单的例子(它是一个HTTP GET将被发送到`http:///shutdown 的请求):

lifecycle:
   preStop:
      httpGet:
         port: 80
         path: shutdown

这里也是关于.kubernetes 文档Container hooks的链接。让我知道这是否有帮助。


推荐阅读