Ubuntu上Kubernetes故障排查指南
1. 节点状态核查
使用kubectl get nodes -o wide
查看节点状态(是否为Ready
)、IP地址及Kubernetes版本;通过kubectl describe node <节点名>
检查节点Conditions
(如Ready
、DiskPressure
、MemoryPressure
等),若节点为NotReady
,需重点关注kubelet服务状态、网络连通性及资源使用情况。
2. Kubernetes组件状态检查
运行kubectl get pods -n kube-system
查看系统组件Pod(如kube-apiserver
、etcd
、kube-controller-manager
、kube-scheduler
、kube-proxy
、CoreDNS
等)是否处于Running
状态;若有Pod状态异常(如Pending
、Error
、CrashLoopBackOff
),需进一步排查对应组件的日志。
1. kubelet服务状态
使用systemctl status kubelet
检查kubelet服务是否运行;若未运行,用systemctl start kubelet
启动;通过journalctl -u kubelet -f
实时查看kubelet日志,关注证书过期、容器运行时异常(如containerd
无法启动)、磁盘空间不足等问题。
2. 资源使用情况
运行df -h /var/lib/kubelet
检查kubelet数据目录磁盘空间(建议保留至少10%空闲);使用free -m
查看内存使用情况(避免OOM导致Pod被终止);通过top -p $(pgrep kubelet)
监控kubelet进程CPU占用(若过高可能影响节点性能)。
3. 容器运行时检查
使用systemctl status containerd
(或docker
,取决于容器运行时)确认容器运行时服务正常;通过ctr containers list
(containerd)或docker ps -a
查看容器列表,确认kubelet依赖的容器(如pause
容器)是否运行正常。
1. 基础网络连通性
在节点上使用ping <API-Server-IP>
测试到kube-apiserver的网络连通性;通过nc -zv <API-Server-IP> 6443
检查API Server端口(默认6443)是否开放;若无法连通,需排查节点防火墙(如ufw
)、安全组或网络配置。
2. CNI插件状态
使用kubectl get pods -n kube-system -l k8s-app=<CNI插件名>
(如calico-node
、flannel
)查看CNI插件Pod状态;通过kubectl logs <CNI-Pod-Name> -n kube-system
查看插件日志,确认网络插件是否正常运行(如Calico的BGP路由是否同步、Flannel的vxlan隧道是否建立)。
3. 网络策略与配置
使用kubectl get networkpolicies
查看集群网络策略,确认是否有策略限制了Pod或Service的通信;检查/etc/resolv.conf
文件,确认DNS配置正确(如nameserver
指向CoreDNS的ClusterIP,默认10.96.0.10
;search
包含命名空间后缀)。
1. 证书有效性
使用openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
检查kubelet客户端证书有效期(若过期需重新生成);通过kubeadm certs check-expiration
查看集群证书过期时间,及时更换即将过期的证书。
2. 内核与系统日志
使用dmesg -T | grep -i "oom\|error"
检查内核日志,关注OOM(内存不足)或硬件错误(如磁盘坏道);通过journalctl -xe
查看系统日志,排查系统级故障(如systemd
服务崩溃)。
1. Pod状态检查
使用kubectl get pods --all-namespaces
查看所有Pod状态;通过kubectl describe pod <Pod-Name> -n <Namespace>
获取Pod详细信息(包括Events
,如镜像拉取失败、资源不足、调度错误等),这是定位Pod问题的关键步骤。
2. 容器日志分析
使用kubectl logs <Pod-Name> -c <Container-Name> -n <Namespace>
查看容器日志(若Pod有多个容器,需指定-c
参数);若容器已崩溃,添加--previous
参数查看前一个容器的日志(如kubectl logs <Pod-Name> -c <Container-Name> --previous
)。
3. 常见Pod问题处理
nginx:latest
是否存在);确认私有仓库认证信息(如imagePullSecrets
)是否配置正确;用docker pull <Image-Name>
测试镜像是否能正常拉取。command
或args
(如修改启动脚本),确保应用能正常启动。kubectl describe pod <Pod-Name>
查看Events
,常见原因包括资源不足(如节点CPU/内存不够)、节点亲和性/反亲和性不匹配、镜像拉取慢;通过kubectl top nodes
查看节点资源使用情况,调整Pod的resources.requests/limits
或增加节点。1. Service状态检查
使用kubectl get svc -n <Namespace>
查看Service状态,确认CLUSTER-IP
、PORT(S)
配置正确;通过kubectl describe svc <Service-Name> -n <Namespace>
查看Service详情,确认Selector
是否匹配目标Pod的标签(如app: web
)。
2. Endpoints验证
使用kubectl get endpoints <Service-Name> -n <Namespace>
查看Service关联的Pod IP和端口;若Endpoints
为空,说明Service未正确关联到Pod,需检查Selector
是否正确、Pod标签是否匹配。
3. CoreDNS检查
使用kubectl get pods -n kube-system -l k8s-app=kube-dns
查看CoreDNS Pod状态;通过kubectl logs <CoreDNS-Pod-Name> -n kube-system
查看CoreDNS日志,确认DNS服务是否正常(如是否有查询错误);若CoreDNS异常,尝试重启Pod(kubectl delete pod <CoreDNS-Pod-Name> -n kube-system
)。
4. 网络连通性测试
在集群内部创建临时Pod(kubectl run -it --rm --image=alpine test-pod -- sh
),使用nslookup <Service-Name>
测试DNS解析是否正常;使用curl -I <Service-IP>:<Port>
或wget <Service-IP>:<Port>
测试到Service的连通性;若无法连通,检查kube-proxy服务(kubectl get pods -n kube-system -l k8s-app=kube-proxy
)是否运行正常,查看kube-proxy日志(kubectl logs <kube-proxy-Pod-Name> -n kube-system
)。