Ubuntu K8S故障排查指南
Ubuntu环境下Kubernetes(K8s)故障排查指南
一、基础状态检查(首要步骤)
1. 集群节点状态
使用kubectl get nodes
查看节点是否处于Ready状态(若为NotReady
,需进一步排查)。通过kubectl describe node <
节点名>
获取节点详细信息,重点关注Conditions
字段(如DiskPressure
磁盘压力、MemoryPressure
内存压力、PIDPressure
进程压力等)。
2. 系统组件状态
检查Kubernetes核心组件(kube-apiserver、etcd、kube-controller-manager等)的Pod状态:kubectl get pods -n kube-system
。若组件Pod处于CrashLoopBackOff
、Pending
或Error
状态,需通过kubectl logs <
Pod名>
-n kube-system
查看其日志。
3. 组件版本兼容性
确保kubeadm
、kubelet
、kubectl
版本一致(建议使用同一小版本,如1.27.x):kubeadm version &
&
kubelet --version &
&
kubectl version
。版本不兼容可能导致集群初始化或升级失败。
二、节点级故障排查(聚焦单节点问题)
1. kubelet服务状态
kubelet是节点与集群通信的核心组件,需确保其运行正常:
systemctl status kubelet
:检查服务是否启动(若未启动,执行systemctl start kubelet
);journalctl -u kubelet -f
:实时查看kubelet日志,重点关注证书过期(如kubelet-client-current.pem
)、容器运行时异常(如containerd
连接失败)、节点资源不足(如磁盘空间耗尽)等问题。
2. 容器运行时检查
K8s默认使用containerd
作为容器运行时,需确认其状态:
systemctl status containerd
:检查服务是否运行;ctr containers list
:查看容器列表(确认容器是否正常启动);ctr images list
:查看镜像列表(确认镜像是否拉取成功)。
3. 资源使用情况
节点资源不足(磁盘、内存、CPU)会导致Pod无法调度或节点NotReady
:
df -h /var/lib/kubelet
:检查kubelet数据目录磁盘空间(建议保留至少10%空闲);free -m
:查看内存使用(若内存不足,K8s会触发OOMKiller终止Pod);top
:监控系统进程资源占用(重点关注kubelet
、containerd
进程)。
三、网络故障排查(常见通信问题)
1. 基础网络连通性
ping < 目标IP>
:测试节点间网络连通性(如Master到Node、Node到Pod CIDR);nc -zv < API-Server-IP> 6443
:检查API Server端口(默认6443)是否开放(若无法连接,可能是防火墙或网络插件问题)。
2. CNI插件状态
CNI插件(如Calico、Flannel)负责Pod网络,需确认其运行正常:
kubectl get pods -n kube-system -l k8s-app=calico-node
:查看CNI插件Pod状态(应为Running
);kubectl logs < cni-pod-name> -n kube-system
:查看插件日志(若日志中出现failed to establish network
等错误,需重新配置CNI或修复网络插件)。
3. DNS配置
Pod无法解析Service名称通常是DNS问题:
cat /etc/resolv.conf
:确认Pod内的DNS配置(默认指向集群DNS服务,如CoreDNS);kubectl get pods -n kube-system -l k8s-app=kube-dns
:检查CoreDNS Pod状态(若CoreDNS异常,需修复其配置或镜像拉取问题)。
四、Pod与容器故障排查(最常见的问题场景)
1. Pod状态检查
kubectl get pods -A
:查看所有命名空间的Pod状态(重点关注Pending
、CrashLoopBackOff
、Error
状态的Pod);kubectl describe pod < Pod名> -n < 命名空间>
:获取Pod事件(如镜像拉取失败、资源不足、调度失败)和状态详情(如容器退出码)。
2. 容器日志分析
kubectl logs < Pod名> -c < 容器名> -n < 命名空间>
:查看容器日志(若Pod有多个容器,需指定-c
参数);kubectl logs -f < Pod名> -c < 容器名>
:实时查看日志(用于排查运行时错误,如应用崩溃、数据库连接失败)。
3. 常见Pod问题处理
- 镜像拉取失败:检查镜像名称、标签是否正确(如
nginx:latest
是否存在),或配置私有仓库凭证(imagePullSecrets
); - CrashLoopBackOff:通过
kubectl logs
查看容器崩溃原因(如应用代码错误、配置文件缺失),修复后重启Pod; - Pending状态:通过
kubectl describe pod
查看原因(如资源不足、节点选择器不匹配),调整Pod资源请求或扩容节点。
五、存储故障排查(持久化问题)
1. PVC与PV状态
kubectl get pvc -A
:查看持久化卷声明(PVC)状态(若为Pending
,说明未绑定PV);kubectl get pv
:查看持久化卷(PV)状态(若为Available
,说明未被PVC绑定);kubectl describe pvc < PVC名> -n < 命名空间>
:查看PVC绑定详情(如存储类storageClassName
是否正确)。
2. 存储卷挂载检查
kubectl describe pod < Pod名> -n < 命名空间>
:查看Volumes
部分(确认卷是否挂载成功,如MountPath
是否正确);kubectl exec -it < Pod名> -n < 命名空间> -- df -h
:进入Pod查看存储卷挂载情况(若挂载失败,可能是存储类配置错误或后端存储故障)。
六、证书与安全问题(影响集群通信)
1. 证书有效期检查
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
:检查kubelet客户端证书有效期(若过期,需通过kubeadm certs renew kubelet-client-current.pem
续订);openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
:检查API Server证书有效期(若过期,需重新初始化集群或续订证书)。
2. Token过期问题
若Node无法加入集群,可能是kubeadm join
使用的Token过期:
kubeadm token list
:查看Token列表(若无输出或Token已过期,需生成新Token:kubeadm token create
);- 计算新的
discovery-token-ca-cert-hash
:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2> /dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
,替换kubeadm join
命令中的Token和Hash。
七、高级排查工具(复杂问题辅助)
1. kubectl debug
通过kubectl debug
创建诊断容器,进入节点或Pod执行诊断命令(如ping
、traceroute
、nslookup
):
kubectl debug node/< 节点名> -it --image=nicolaka/netshoot --target=< 容器名>
:进入节点诊断(nicolaka/netshoot
包含常用网络工具);kubectl debug -it < Pod名> --image=busybox --target=< 容器名>
:进入Pod诊断(适用于容器内进程问题)。
2. 集中监控与告警
部署Prometheus+Grafana监控集群状态(如节点资源、Pod状态、网络流量),设置阈值告警(如节点磁盘空间超过80%、Pod内存使用超过90%),及时发现潜在问题。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu K8S故障排查指南
本文地址: https://pptw.com/jishu/726142.html