Kubernetes学习笔记(三十八):Trouble shooting
Application Failure
-
查看Service的状态
- 使用应用程序或者
curl检查是否可以在节点端口的IP上访问web服务器curl http://web-service-ip:node-port - 检查服务
kubectl describe svc web-service的Endpoints - 如果没有查询到以上Endpoint,比对一下
Selector
- 使用应用程序或者
-
查看Pod的状态
kubectl describe pod webkubectl logs web,-f全称--follow,因为应用程序关闭就无法看到日志,只能等的应用程序再次失败,或者使用--previous查看上一个pod的日志
-
查看依赖Service
- 检查
db-service状态 - 检查 db pod 自身
- 检查
参考文档:https://kubernetes.io/docs/tasks/debug/debug-application/debug-pods/
Control Plane Failure
- 查看 Node 状态
kubectl get nodes - 查看 Pod 状态
kubectl get pods - 查看 Control Plane 组件状态
- 如果 controlplane 组件部署为 pod,使用 kubeadm 工具部署集群的情况下,查看controlplane pod 状态
kubectl -n kube-system get pods - 如果 controlplane 组件被部署为 service,则检查 master node 上的 service 的状态:如
service kube-apiserver status,service kube-controller-manager status,service kube-scheduler status,service kubelet status,service kube-proxy status
- 如果 controlplane 组件部署为 pod,使用 kubeadm 工具部署集群的情况下,查看controlplane pod 状态
- 查看 Service 日志
- 如果使用 kubeadm 工具部署集群,则使用
kubectl -n kube-system logs kube-apiserver-master - 如果服务是在主节点上本地配置的,清使用host的日志解决方案查看 service 日志,
journalctl -u kube-apiserver
- 如果使用 kubeadm 工具部署集群,则使用
更多参考资料:https://kubernetes.io/docs/tasks/debug-application-cluster/debug-cluster
Worker Node Failure
-
查看 Node 状态
kubectl get nodes,查看节点详细kubectl describe node worker-1
-
检查节点上可能得CPU、内存和磁盘空间
top,df -h -
查看 kubelet 状态
service kubelet status,sudo journalctl -u kubelet -
检查 kubelet 证书,确保它们未过期,属于正确的组,并且证书由正确的 CA 颁发
openssl x509 -in /var/lib/kubelet/worker-1.crt -text
Network Troubleshooting
CoreDNS
-
如果 CoreDNS pod 处于 pending 状态,请首先检查 CNI 是否安装
-
如果 CoreDNS pod 处于 CrashLoopBackOff 或 Error 状态:
如果节点使用旧版本的 Docker 运行 SELinux,可能会遇到 CoreDNS pod 未启动的情况,要解决此问题,可以尝试以下选项
-
升级到更新版本的 Docker
-
禁用 SELinux
-
修改 CoreDNS 部署,将 allowPrivilegeEscalation 设置为 true
-
CoreDNS 发生 CrashLoopBackOff 的另一个原因是 CoreDNS pod 检测到循环
解决方式有:
- 将以下内容添加到您的 kubelet 配置 yaml:
resolvConf: <path-to-your-real-resolv-conf-file>此标志告诉kubelet将备用resolv.conf传递给 Pod 。对于使用systemd-resolved的系统,/run/systemd/resolve/resolv.conf通常是“真实”resolv.conf的位置,尽管这可能因您的发行版而异 - 禁用主机节点上的本地 DNS 缓存,并将
/etc/resolv.conf恢复为原始 - 一个快速的解决方法是编辑您的 Corefile,替换 forward /etc/resolv.conf 与您的上游 DNS 的 IP 地址,例如 forward 8.8.8.8。但这仅解决了 CoreDNS 的问题,kubelet 将继续将无效的 resolv.conf 转发到所有默认的 dnsPolicy Pod,使它们无法解析 DNS
- 将以下内容添加到您的 kubelet 配置 yaml:
-
-
如果 CoreDNS pod 和 kube-dns 服务工作正常,请检查 kube-dns 服务是否有有效的端点。如果服务没有端点,请检查服务并确保它使用正确的选择器和端口
kube-proxy
kube-proxy 负责监视与每个服务关联的服务和端点。当客户端要使用虚拟 IP 连接到服务时,kube-proxy 负责将流量发送到实际的 Pod
- 检查 kube-system ns 中的 kube-proxy pod 正在运行
- 检查 kube-proxy 日志
- 检查 configmap 是否正确定义,运行 kube-proxy 二进制文件的配置文件是否正确
- kube-config 在 config map 中定义
- 检查 kube-proxy 是否在容器内运行
更多参考资料:
https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/
https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/

浙公网安备 33010602011771号