# 故障排查

如何找到真实的故障原因,每个人都有自己的实践总结。而 Kubernetes 集群的复杂性会在排查的过程中造成干扰,会让你忽视真正需要洞悉的信号。在考虑 Kubernetes 中的故障排查时,笔者通常采取分层的方法,依次 check 如下因素:

* 节点(控制面板和 node)
* 集群原生组件(apiserver、controller-manager、scheduler、kubelet、etcd、容器运行时等)
* 集群附加组件(网络和网络策略 Calico 等、服务发现 coreDNS 等)
* 终端用户应用程序(实际部署的 apps)

## 集群排错 

#### 节点 NotReady

* 检查 kube-system 命名空间下的 Pod 状态:`kubectl get pods -n kube-system -o wide` ;
* 检查是否安装了 Pod 网络附加组件,如 Calico 等;
* 检查节点组件 kubelet 是否正常运行,`systemctl is-active kubelet`;
* `PLEG`: 容器运行时是否工作正常,节点服务器的 Docker 或者 containerd 是否运行正常。

参考:https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-node-status-ready/

## 应用排错

* OOM(内存不足)事件:1)优化应用程序内部的逻辑,优化内存使用;2)内存用量达到预警值时驱逐 pod,以减少对系统的冲击并防止系统 OOM 的发生;
* `kubectl describe` 可以重点关注对象的 Event 事件信息;
* `kubectl get events` 查看 Event 事件列表;
* `kubectl logs` 查看应用程序的标准输出;
* `kubectl exec` 进入容器内,查看一些必要的信息或执行相关 debug 命令;
* `kubectl port-forward` 将服务转发至本地端口,方便调试;