温馨提示×

Ubuntu Kubernetes 故障如何排查

小樊
49
2025-09-25 10:29:55
栏目: 智能运维

Ubuntu Kubernetes故障排查指南

一、基础环境检查

在排查具体故障前,需先确认Ubuntu系统和Kubernetes基础环境的稳定性:

  1. 系统更新:运行sudo apt update && sudo apt upgrade确保Ubuntu系统为最新版本,避免因系统漏洞或兼容性问题引发故障。
  2. Kubernetes组件版本兼容性:使用kubeadm versionkubelet --versionkubectl version检查kubeadm、kubelet、kubectl的版本,确保三者兼容(如均支持同一Kubernetes版本)。
  3. Kubelet状态:通过sudo systemctl status kubelet确认kubelet服务是否运行;若未运行,用sudo systemctl start kubelet启动;若启动失败,用sudo journalctl -u kubelet查看日志定位具体错误(如证书过期、配置文件损坏)。
  4. Ubuntu节点特定配置:检查kubelet配置文件(通常位于/etc/kubernetes/kubelet.conf/var/lib/kubelet/config.yaml),确认--image-pull-progress-deadline--runtime-request-timeout等参数设置合理(如避免镜像拉取超时);同时用df -h检查磁盘空间(建议保留至少10%空闲空间),防止磁盘满导致Pod无法启动。

二、集群状态验证

确认Kubernetes集群整体运行状态是否正常:

  1. 集群信息检查:运行kubectl cluster-info,查看Master节点API Server地址(如https://<Master-IP>:6443)和DNS服务(如CoreDNS)状态;若无法访问API Server,需检查Master节点网络或防火墙设置。
  2. 节点状态检查:使用kubectl get nodes查看所有节点状态,若节点显示为NotReady,用kubectl describe node <node-name>查看详细事件(如kubelet未注册、CNI插件未就绪);常见原因包括kubelet服务未启动、网络插件故障、节点资源不足。

三、Pod故障排查

Pod是Kubernetes的核心运行单元,多数故障集中在Pod状态异常(如Pending、CrashLoopBackOff、Error):

  1. 查看Pod状态:用kubectl get pods --all-namespaces列出所有Pod,重点关注STATUS列(如Pending表示调度失败,CrashLoopBackOff表示容器反复崩溃)。
  2. 查看Pod详情与事件:通过kubectl describe pod <pod-name> -n <namespace>获取Pod的详细信息,包括事件列表(如调度失败、镜像拉取失败、健康检查未通过);事件会明确提示故障原因(如“Insufficient CPU”表示节点资源不足,“Failed to pull image”表示镜像拉取失败)。
  3. 查看容器日志:若Pod中有容器运行,用kubectl logs <pod-name> -c <container-name> -n <namespace>查看容器日志(若容器已崩溃,添加--previous查看前一次实例日志);日志中通常包含应用错误(如端口冲突、数据库连接失败)。
  4. 进入容器调试:若日志无法定位问题,用kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- /bin/sh(或/bin/bash)进入容器,手动执行命令(如ls查看文件、curl测试服务)排查应用层问题。
  5. 检查Pod配置:确认Pod的YAML配置文件是否正确,重点检查以下内容:
    • 镜像名称与标签:确保镜像存在(如docker pull <image>测试),标签与配置一致;
    • 资源请求与限制resources.requests(请求资源)和resources.limits(限制资源)设置合理(如不超过节点可用资源);
    • 环境变量env字段中的变量是否正确(如数据库连接字符串);
    • 卷挂载volumeMountsvolumes配置是否匹配(如持久卷是否存在)。

四、Service访问故障排查

若Pod运行正常但无法通过Service访问,需检查Service及网络配置:

  1. 检查Service状态与配置:用kubectl describe service <service-name>查看Service详情,确认以下内容:
    • 端口配置spec.ports.port(Service端口)、targetPort(容器端口)、nodePort(NodePort类型端口)是否正确;
    • 选择器spec.selector是否匹配目标Pod的标签(如app: web);
    • 类型spec.type(如ClusterIP、NodePort、LoadBalancer)是否符合需求。
  2. 检查Endpoints:用kubectl get endpoints <service-name>查看Service关联的Pod IP和端口,若Endpoints为空,说明Service未正确选择到Pod(需检查选择器与Pod标签是否一致)。
  3. 测试DNS解析:若通过Service名称访问(如http://web-service),需测试DNS解析是否正常:
    • 创建临时Pod:kubectl run -it --rm --image=busybox:1.28.4 -- sh
    • 在Pod中执行nslookup <service-name>.<namespace>(如nslookup web-service.default),若解析失败,需检查CoreDNS服务(见下一步)。
  4. 检查CoreDNS服务:用kubectl get pods -n kube-system查看CoreDNS Pod状态(应为Running);若未运行,用kubectl logs <coredns-pod-name> -n kube-system查看日志(如镜像拉取失败、配置错误);必要时重启CoreDNS(kubectl delete pod <coredns-pod-name> -n kube-system,Kubernetes会自动重建)。
  5. 检查网络策略与插件
    • kubectl get networkpolicies查看是否有网络策略限制了Service访问(如禁止某命名空间的流量);
    • 检查CNI插件(如Calico、Flannel)是否正常运行(kubectl get pods -n kube-system | grep cni),若插件异常,需查看插件日志(kubectl logs <cni-pod-name> -n kube-system);
    • 测试网络连通性:在集群内部创建临时Pod,用kubectl run --rm -it --image=alpine ping <service-ip>测试到Service IP的连通性,用nslookup <service-name>测试DNS解析。

五、节点级故障排查

若多个Pod或Service出现故障,需检查Ubuntu节点本身的状态:

  1. 节点资源监控:使用kubectl top node查看节点CPU、内存使用情况,若资源使用率过高(如超过80%),需扩容节点(添加新节点)或优化Pod资源分配(调整resources.requestsresources.limits)。
  2. Kubelet日志分析:用sudo journalctl -u kubelet -f实时查看kubelet日志,重点关注以下错误:
    • 镜像拉取失败:如“Failed to pull image”(需检查镜像仓库权限、网络连接);
    • 卷挂载失败:如“Volume mount failed”(需检查存储类、持久卷配置);
    • 证书问题:如“Certificate expired”(需更换证书)。
  3. 系统资源检查:用free -h查看内存使用情况,df -h查看磁盘空间,top查看CPU负载;若磁盘空间不足,清理无用文件(如/var/log下的旧日志);若内存不足,需增加节点内存或优化应用内存使用。

0