本文永久链接: https://www.xtplayer.cn/kubernetes/kubernetes-problem-sets/

为什么在节点出现故障时重新调度 Pod 需要 5 分钟以上?

这是由于以下默认 Kubernetes 设置的组合:

  • kubelet
    • node-status-update-frequency:指定 kubelet 将节点状态发布到 master 的频率(默认为 10 秒)
  • kube-controller-manager
    • node-monitor-period:在 NodeController 中同步 NodeStatus 的时间段(默认 5 秒)
    • node-monitor-grace-period:在标记运行节点不健康之前允许运行节点无响应的时间(默认为 40 秒)
    • pod-eviction-timeout:删除失败节点上的 Pod 的宽限期(默认为 5m0)

有关这些设置的更多信息,请访问文档:节点不可用时快速迁移 Pods

network: stat /var/lib/calico/nodename: no such file or directory

calico 服务启动的时候,会在 /var/lib/calico/ 目录下生成 nodename 文件,主机上也是对应这个路径。在 calico pod 中有多个容器,有容器负责生成 nodename 这个文件。如果出现这个问题,有可能是容器未能正常运行,可以删除 Pod 让其重新运行,或者按以下文档对节点进行初始化之后,再重新添加到集群:https://www.xtplayer.cn/rancher/node-init/

[controlPlane] Failed to bring up Control Plane:Failed to verify healthcheck

这是通用的错误提示,出现这个错误一般是 kube-apiserverkube-controller-manager 服务没有正常运行,导致无法通过 rke 的健康检查。

rke1 中,kube-apiserverkube-controller-manager 是以 docker run 容器的方式运行,可以通过 docker logs kube-apiserver --tail 100 -f 或者 docker logs kube-controller-manager --tail 100 -f 来查看容器日志,从而进一步判断问题原因。

failed to bring up worker plane

这是通用的错误提示,出现这个错误一般是 kubelet 服务没有正常运行,导致无法通过 rke 的健康检查。

rke1 中,kubelet 是以 docker run 容器的方式运行,可以通过 docker logs kubelet --tail 100 -f 来查看容器日志,从而进一步判断问题原因。

Runtime network not ready: NetworkReady=false

Runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

rancher kubernetes 网络驱动均以容器方式运行,如果部署环境网络缓慢,则会导致需要很长时间下载镜像,从而影响驱动的部署。因为系统超时,所以会提示以上错误信息。一般等待 5 到 10 分钟即可自动恢复正常。

如果等了很长还未能恢复正常,那么这应该是驱动运行异常导致。可以通过以下命令删除 网络驱动 Pod 使其重新创建:

kubectl -n kube-system get pod | awk '{print $1}' | grep -E 'canal|calico|flannel' | xargs kubectl -n kube-system delete pod