kubernetes - 在 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 上运行的所有任务都已停止。
解决方案
可能是默认值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
的链接。让我知道这是否有帮助。
推荐阅读
- r - 如何使用正则表达式从 R 中的模式中提取字符串
- java - 不同类中 Typescript 中日期的自定义 JSON 解析器
- flurl - 通过响应内容类型控制?
- java - 如果输入已知,请继续询问输入
- python - 我将如何自定义 python json.dumps 将 dict 列表值转换为 str
- python - 使用 Pymssql 将具有 Null 值的记录插入 SQL Server 时出错
- html - 浏览器如何遍历 DOM 树来应用正确的样式?
- docker - Dockerfile 中的 VOLUME 是做什么的
- python - 如何将指令嵌套在另一个指令中,例如 .. code-block::
- python-3.x - 附加到 YAML 文件