Ubuntu上Kubernetes故障如何排查
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
服务崩溃)。
五、Pod与容器故障排查
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问题处理
- 镜像拉取失败(ImagePullBackOff/ErrImagePull):检查镜像名称、标签是否正确(如
nginx:latest
是否存在);确认私有仓库认证信息(如imagePullSecrets
)是否配置正确;用docker pull < Image-Name>
测试镜像是否能正常拉取。 - 容器崩溃(CrashLoopBackOff):查看容器日志,定位崩溃原因(如应用代码bug、配置文件错误、依赖服务不可用);调整容器
command
或args
(如修改启动脚本),确保应用能正常启动。 - Pending状态:通过
kubectl describe pod < Pod-Name>
查看Events
,常见原因包括资源不足(如节点CPU/内存不够)、节点亲和性/反亲和性不匹配、镜像拉取慢;通过kubectl top nodes
查看节点资源使用情况,调整Pod的resources.requests/limits
或增加节点。
六、Service与网络访问故障排查
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
)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu上Kubernetes故障如何排查
本文地址: https://pptw.com/jishu/722227.html