kubernetes集群故障处理思路
kubernetes集群故障处理思路
1.0 概述
本文主要介绍了pod的创建流程,一般问题处理思路以及一些辅助的检查项,以编快速定位及解决问题
1.1 kubernetes故障处理思路概览图
k8s集群出现故障,一般可以从两大种情况看,个别pod异常和大量pod异常,针对两种情况,可以参考以下处理思路
1.2 pod的基本创建流程
如上图所示,是用户创建一个 Deployment 的简单流程。主要分为以下步骤:
-
kubectl 根据用户输入的命令,填充相关字段,将 deployment/pvc 对象发送给 kube-apiserver
-
kube-apiserver 会有一系列的权限/准入控制,最终将数据序列化存储在 etcd 中
-
kube-controller-manager 包含大量的控制器,这些控制器会生成 replicaset/pod 对象存储在 etcd 中。pvc 需要绑定到 pv 上,如果没有满足要求的 pv,则通过 Storage Class 动态创建一个 pv 。
-
kube-sheduler 负责给 pod 选择运行的 node 节点,然后将 NodeName 字段写入 pod 对象中。
-
kubelet 发现当前 node 节点有待创建的 pod,然后开始调用 CRI 接口去管理 pod 的生命周期。如果有 pvc,还需要将远程磁盘挂载到宿主机目录。
了解基本的创建流程,有利于排查各种可能的故障。故障可以理解为集群生命周期中的一个状态,而创建是整个生命周期的起点。同时,重置、重启都是非常快速地解决问题的方法,都涉及创建。
1.3 一般集群故障的思路
如上图所示,是我的集群故障修复思路。主要分为以下步骤:
-
kubectl get 检查 node、pod 等资源是否符合预期
-
kubectl describe 查看 Kubernetes 中的事件信息,包括 kube-sheduler 的调度、拉取镜像、启动是否成功等。通常能解决大部分的问题。
-
kubectl logs 查看负载的日志。当 pod 处于 running,但是又无法正常提供服务时,logs 信息能够给出有用的提示。有时无法查看 pod 中容器的日志,那么需要去 pod 所在的节点查看 docker 的日志。journal 通过 -u 参数指定服务,通过 -f 查看滚动的最新日志,也十分有用。
-
如果上面两种思路还不能解决问题,那么恭喜你,又有机会提高自己了。检查底层服务,也就是检查集群的基础环境,包括磁盘、允许的协议、允许的端口、防火墙、网络等。最终能不能解决,取决于你的积累和检索问题答案的能力。
1.4 必要的检查项
这里列举一些必要的检查项,可以辅助排查问题。
- node 负载
node 负载过高时,有可能导致节点 NotReady。
- node 磁盘
磁盘包括两部分,大小和 inode。
- swap、firewall
安装集群时的配置,在重启机器之后,可能会失效。
- 跨 node 的 pod 通信
跨节点通信异常时,会导致服务无法访问。
- node 节点上 kubelet、docker 的状态
systemctl status kubelet、systemctl status docker 查看组件的状态。
- 检查 kubelet 、docker 的配置
ps aux|grep kubelet 、docker info 查看相关配置是否符合预期。
- 查看存储 CSI 存储插件日志
通常 StorageClass 是通过 CSI 插件提供存储服务的,可以查看相关日志,检查是否有异常输出。
- 检查 ip 转发功能
执行命令 cat /proc/sys/net/ipv4/ip_forward ,如果输出 0 则表示未开启。ip 转发允许将一个端口的包转发到另外一个端口。未开启时,会导致网络访问失败,tcpdump 中发送了大量 syn 数据包,但是没有 ack 。
- 检查 Pod CIDR 与主机网段是否冲突
可以先查看 Pod 的 ip,检查其与主机、VPC 的 ip 是否有重叠。如果发生冲突,将会导致服务不可访问,提示 No route to host 类似的错误,需要修改 CIDR 。