【问题标题】:Can Docker automatically kill containers on a Kubernetes worker when Kubelet stopped?当 Kubelet 停止时,Docker 可以自动杀死 Kubernetes 工作人员上的容器吗?
【发布时间】:2021-07-09 02:14:48
【问题描述】:

我在 Kubernetes 中尝试使用 default-not-ready-toleration-seconds 来缩短 pod 在集群中的 NotReady 节点上终止的时间。但是我注意到,如果 Kubelet 关闭,CRI(Docker)当然不会自行杀死正在运行的容器。因此,当 Kubernetes 决定终止 pod 时,如果无法与 Kubelet 通信,容器仍然会运行,您最终会运行 2 个容器。

我的问题是,如果 Kubelet 没有运行设置的超时时间,是否有办法让 CRI 独立做出杀死容器的决定?

# docker ps | grep busybox
5cb58ea42982        busybox                "tail -f /dev/null"      45 hours ago        Up 45 hours
# systemctl stop kubelet
# kubectl get pod busybox-test-busybox-69b844bd79-wsdvp
NAME                                    READY   STATUS
busybox-test-busybox-69b844bd79-wsdvp   1/1     Terminating
### WAIT WAIT WAIT...
# docker ps | grep busybox
5cb58ea42982        busybox                "tail -f /dev/null"      45 hours ago        Up 45 hours

【问题讨论】:

    标签: docker kubernetes kubelet


    【解决方案1】:

    你可以也不能这样做,基本上,kubelet 是节点上的船长,并指示 docker 根据从 Kubernetes API 服务器收到的指令创建容器。

    如果 kubelet 与 master 断开连接,则该节点在一定时间间隔后被标记为不可访问。

    现在 kubelet 是节点的所有者,但没有任何指令,它不知道如何处理节点上的 pod(如 kubelet 所见) kubelet 将使正在运行的 pod 保持在运行状态,或者可以从 staticPodPath 创建新的 pod

    假设 kubelet 也死了。现在没有人来指导 docker 容器。

    Node 就像一台安装了 Docker 并在其上运行容器的机器。 Docker 不知道它的主人已经死了。它将继续运行容器。

    现在回答你的问题:

    My question is, is there a way to make the CRI independently make the decision to kill a container if Kubelet have not been running for a set timeout?
    

    您可以创建一个在节点上运行并检查 kubelet 服务状态的脚本。如果服务关闭,则杀死所有正在运行的容器。

    【讨论】:

    • 我认为将编排语义与容器执行语义混合是一个坏主意。通过工具肯定可以实现,但它会破坏 Kubernetes 的调度逻辑,因为现在 pod 的生命周期是由一些超出范围的工具而不是 k8 的集中状态管理系统决定的
    • 同意这是一个可能的解决方案,将尝试一下。我希望有一些内置的逻辑。 @AmitMeena 您对如何解决这个问题还有其他建议吗?我只使用 docker,但也许其他 CRI 有这个功能?
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2021-02-17
    • 2019-12-15
    • 2018-08-12
    • 2018-12-03
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多