我在两台ec2机器上运行我的kafka-connect。因此,不管任务数量有多少,这两台机器都会一直运行任务。因此是二手机器。最近我在kubernetes上迁移了kafka-connect。我实现了良好的CPU/内存效率。
但当kubernetes规模缩小时,问题就出现了。豆荚的缩小并不优雅。
假设有两个pods 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
但是我的source connector的日志显示,一些其他任务(可能是在旧的pod t5上运行的任务)仍在运行并访问postgres db数据。
我如何确保每当pod缩减规模时,它都优雅地发生,也就是说pod上运行的所有任务都停止了。
只需在 Kafka-Connect 配置中增加关机超时“task.shutdown.graceful.timeout.ms”。还要使用 preStop 钩子 pods 钩子并在钩子中使用一些睡眠命令,以便 kubelet 等待钩子完成并运行 SIGTERM。
可能是默认的宽限期
不足以让应用程序在收到SIGTERM
信号后完成其任务。
SIGTERM
信号被发送到容器中的主进程,一旦收到信号,容器应该开始正常关闭正在运行的应用程序并退出。
kubernetes官方留档中描述了一个关于终止Pods
的非常好的解释/流程。
您可以尝试在部署中扩展终止 GracePeriodSeconds,
看看是否有帮助(默认值为 30):
spec:
replicas:
template:
spec:
containers:
- name: test
image: ...
terminationGracePeriodSeconds: 60
另一种方法是使用preStop
钩子preStop
钩子在容器终止之前立即执行。它的工作原理是,当需要终止容器时,Kubelet将运行预停止挂钩,然后才向进程发送<code>SIGTERM</code>。这可用于启动容器的正常关闭。
它还可以用于在关闭之前执行一些其他操作,而无需在应用程序本身中执行这些操作。
这是一个简单的例子,它是如何工作的(这是一个HTTP GET
请求,将被发送到'超文本传输协议:///关闭):
lifecycle:
preStop:
httpGet:
port: 80
path: shutdown
这里还有一个关于容器钩子
的kubernetes留档链接。如果这很重要,请告诉我。
我的问题是Pod不能相互通信,不能与服务IP或internet IP通信。似乎有一个网络接口,路由,默认网关,但总是得到“没有路由到主机”。 Internet IP也不起作用: 我的kubelet单位如下: null
如果这个问题听起来很明显,我很抱歉,但Kubernetes和Google云文档在某些地方非常混乱和矛盾。 无论如何,我已经将一个Dockerized web服务器推送到我的私人Google容器注册表中。如果这个容器死了,我想让它重新启动,但是在任何给定的时刻,我只需要运行一个实例。此外,为了正确配置服务器,还需要定义一些环境变量。 我已经创建了一个新集群。但是我该何去何从呢?一些教程说应该声明 p
这是org.csanchez.jenkins.plugins.Kubernetes日志。我已经上传到wetransfer->we.tl/t-zisbftkzrk 我已经读过很多关于这个问题的文章,并且已经用这个JAVA_OPTS配置了jenkins,但是问题没有得到解决。 Kubernetes插件配置有: null
我正在运行一个自我管理的Kubernetes集群1.18.1。我已经部署了一些带有持久性卷的POD(基于longhorn项目)。现在,在做了一些测试之后,我观察到以下行为: 如果我模拟一个节点的硬关机,过了一段时间(5分钟),Kubernetes就会识别出丢失,并开始重新调度节点从死亡节点到另一个节点。 因为我的节点具有持久性卷,所以新的POD永远不会启动。原因是旧的pod(在死节点上)现在在终止
目前,如果我们想在kubernetes中使用水平Pod自动缩放,我们需要为我们要执行的服务指定以下内容: 我有一些服务都可以使用HPA进行扩展。 我们是否可以过度提供这些服务?与这些服务一样,资源添加超出了VM可用的总资源。 考虑这样一种情况:假设POD的请求在总可用CPU范围内,但超出限制 例如: 总可用CPU为1000m核,2个吊舱,每个吊舱请求500m核,每个吊舱限制1000m核。 首先,如