我有一个在单个Pod中运行Jenkins master的Kubernetes集群,每个构建都在一个单独的slave Pod中运行。当有许多构建在运行时,有许多吊舱正在上下旋转,通常我会在这样的工作中看到错误:
Cannot contact slave-jenkins-0g9p0: hudson.remoting.ChannelClosedException: Channel "hudson.remoting.Channel@197b6a38:JNLP4-connect connection from 10.10.3.90/10.10.3.90:54418": Remote call on JNLP4-connect connection from 10.10.3.90/10.10.3.90:54418 failed. The channel is closing down or has closed down
Could not connect to slave-jenkins-0g9p0 to send interrupt signal to process
吊舱(例如slave-jenkins-0g9p0
)消失了。没有痕迹存在。观看kubectl describe pod slave-jenkins-0g9p0
之类的信息时,没有错误消息,只是停止存在。
我有一种感觉,因为有多个Pod上下旋转,Kubernetes试图平衡节点上的负载并重新安排Pod的时间,但是杀死它之后,它无法在另一个节点上旋转Pod。我不确定。也许有一种方法可以告诉K8s将吊舱绑定到一个节点,直到其退出为止?我不太确定如何/如何调试这种情况。
v1.16.13-eks-2ba888
在AWS EKS上2.257
1.27.2
任何建议将不胜感激
谢谢
更新:
我已经上传了三个从属Pod清单示例here,您可以在其中查看分配的资源。上述问题发生在每个运行的吊舱中。
节点池由Kubernetes自动缩放器(v1.14.6
)控制,并使用AWS t3a.large(2个CPU,8GB内存)实例。
更新2:
我相信我已经找到问题的原因。我禁用了cluster-autoscaler](https://github.com/kubernetes/autoscaler)(v1.14.6),问题停止了。
所以似乎正在发生的事情是自动缩放器正在删除从属pd正在运行的节点。我知道污点可以用来告诉自动缩放器不要删除节点,但是有一种方法可以动态地做到这一点,即如果某个特定的容器正在运行,它将不会删除节点。无需开发新的东西。