简介:Kubernetes kubelet 是节点上的核心组件,负责管理容器运行时的具体任务。本文将详细介绍 kubelet 的状态更新机制,包括其与 apiserver 的交互、更新频率、重试策略等。
Kubernetes 的 kubelet 是节点上的核心组件,负责管理容器运行时的具体任务,包括容器创建、停止、状态检查等。kubelet 自身会定期更新状态到 apiserver,通过参数 —node-status-update-frequency 指定上报频率,默认是10s上报一次。
在 Kubernetes 中,kube-controller-manager 会每隔 —node-monitor-period 时间去检查 kubelet 的状态,默认是5s。这个时间间隔可以通过参数 —node-monitor-period 进行配置。
当 node 失联一段时间后,kubernetes 判定 node 为 notready 状态,这段时长通过 —node-monitor-grace-period 参数配置,默认40s。
当 node 失联一段时间后,kubernetes 判定 node 为 unhealthy 状态,这段时长通过 —node-startup-grace-period 参数配置,默认1m0s。
当 node 失联一段时间后,kubernetes 开始删除原 node 上的 pod,这段时长是通过 —pod-eviction-timeout 参数配置,默认5m0s。
此外,kubelet 在更新状态失败时,会进行 nodeStatusUpdateRetry 次重试,默认为 5 次。 Kubelet 会在函数 tryUpdateNodeStatus 中尝试进行状态更新。
Kubelet 使用 Golang 中的 http.Client() 方法进行网络通信,但没有指定超时时间。因此,如果 API Server 过载时,当建立 TCP 连接时可能会出现一些故障。
值得注意的是,kube-controller-manager 和 kubelet 是异步工作的,这意味着延迟可能包括任何的网络延迟、apiserver 的延迟、etcd 延迟,一个节点上的负载引起的延迟等等。因此,如果 —node-status-update-frequency 设置为5s,那么实际上 etcd 中的数据变化可能需要6-7s,甚至更长时间才能反映出来。
总的来说,Kubernetes kubelet 的状态更新机制是一个复杂的系统,涉及多个组件和参数的协同工作。理解这些机制有助于更好地管理和优化 Kubernetes 集群的性能和稳定性。对于生产环境中的集群,需要根据实际需求和资源情况合理配置相关参数,以获得最佳的运行效果。