Kubernetes 集群状态异常排错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes 集群状态异常排错相关的知识,希望对你有一定的参考价值。
参考技术A 本章介绍集群状态异常的排错方法,包括 Kubernetes 主要组件以及必备扩展(如 kube-dns)等,而有关网络的异常排错请参考 网络异常排错方法 。排查集群状态异常问题通常从 Node 和 Kubernetes 服务 的状态出发,定位出具体的异常服务,再进而寻找解决方法。集群状态异常可能的原因比较多,常见的有
按照不同的组件来说,具体的原因可能包括
为了维持集群的健康状态,推荐在部署集群时就考虑以下
一般来说,可以首先查看 Node 的状态,确认 Node 本身是不是 Ready 状态
如果是 NotReady 状态,则可以执行 kubectl describe node <node-name> 命令来查看当前 Node 的事件。这些事件通常都会有助于排查 Node 发生的问题。
在排查 Kubernetes 问题时,通常需要 SSH 登录到具体的 Node 上面查看 kubelet、docker、iptables 等的状态和日志。在使用云平台时,可以给相应的 VM 绑定一个公网 IP;而在物理机部署时,可以通过路由器上的端口映射来访问。但更简单的方法是使用 SSH Pod (不要忘记替换成你自己的 nodeName):
接着,就可以通过 ssh 服务的外网 IP 来登录 Node,如 ssh user@52.52.52.52 。
在使用完后, 不要忘记删除 SSH 服务 kubectl delete -f ssh.yaml 。
一般来说,Kubernetes 的主要组件有两种部署方法
使用 systemd 等管理控制节点服务时,查看日志必须要首先 SSH 登录到机器上,然后查看具体的日志文件。如
或者直接查看日志文件
而对于使用 Static Pod 部署集群控制平面服务的场景,可以参考下面这些查看日志的方法。
查看 Kubelet 日志需要首先 SSH 登录到 Node 上。
Kube-proxy 通常以 DaemonSet 的方式部署
由于 Dashboard 依赖于 kube-dns,所以这个问题一般是由于 kube-dns 无法正常启动导致的。查看 kube-dns 的日志
可以发现如下的错误日志
这说明 kube-dns pod 无法转发 DNS 请求到上游 DNS 服务器。解决方法为
如果错误日志中不是转发 DNS 请求超时,而是访问 kube-apiserver 超时,比如
这说明 Pod 网络(一般是多主机之间)访问异常,包括 Pod->Node、Node->Pod 以及 Node-Node 等之间的往来通信异常。可能的原因比较多,具体的排错方法可以参考 网络异常排错指南 。
重启 kubelet 时报错 Failed to start ContainerManager failed to initialise top level QOS containers (参考 #43856 ),临时解决方法是:
该问题已于2017年4月27日修复(v1.7.0+, #44940 )。更新集群到新版本即可解决这个问题。
当 NodeAllocatable 特性未开启时(即 kubelet 设置了 --cgroups-per-qos=false ),查看 node 的事件会发现每分钟都会有 Failed to update Node Allocatable Limits 的警告信息:
如果 NodeAllocatable 特性确实不需要,那么该警告事件可以忽略。但根据 Kubernetes 文档 Reserve Compute Resources for System Daemons ,最好开启该特性:
开启方法为:
kube-proxy 报错,并且 service 的 DNS 解析异常
解决方式是安装 conntrack-tools 包后重启 kube-proxy 即可。
正常情况下,Dashboard 首页应该会显示资源使用情况的图表,如
如果没有这些图表,则需要首先检查 Heapster 是否正在运行(因为Dashboard 需要访问 Heapster 来查询资源使用情况):
如果查询结果为空,说明 Heapster 还未部署,可以参考 https://github.com/kubernetes/heapster 来部署。
但如果 Heapster 处于正常状态,那么需要查看 dashboard 的日志,确认是否还有其他问题
查看 HPA 的事件,发现
这说明 metrics-server 未部署,可以参考 这里 部署。
Kubernetes集群实践-排错(01)Node节点证书过期
由于一些不可描述的原因,导致了节点证书没有更新,kubelet启动不了。此时就需要手动处理更新节点证书。官方文档中其实又详细的描述,再次还是个人记录下:
环境和报描述
......]Part of the existing bootstrap client certificate is expired: 2019-12-20 08:51:59 +0000 UTC
......] failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory
大概类似上述的描述。我的Kubernetes版本是1.18.2,我的主节点还在,主节点/etc/kubernetes/pki/ca.key文件也在。
具体修复操作
- 从故障节点备份和删除 /etc/kubernetes/kubelet.conf 和 /var/lib/kubelet/pki/kubelet-client*。
- 在集群中具有 /etc/kubernetes/pki/ca.key 的、正常工作的控制平面节点上 执行 kubeadm kubeconfig user --org system:nodes --client-name system:node:$NODE > kubelet.conf。 $NODE 必须设置为集群中现有故障节点的名称。 如果你的集群没有 ca.key,你必须在外部对 kubelet.conf 中的嵌入式证书进行签名。
- 将得到的 kubelet.conf 文件复制到故障节点上,作为 /etc/kubernetes/kubelet.conf。在故障节点上重启 kubelet(systemctl restart kubelet),等待 /var/lib/kubelet/pki/kubelet-client-current.pem 重新创建。
参考
- 官方文档(英文)
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/ - 官方文档(中文)
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/
以上是关于Kubernetes 集群状态异常排错的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 实战 -- 泛 kubernates 导论
kubernetes排错系列:机房搬迁导致的节点NotReady