Kubernetes 故障排查在 Ubuntu 上的核心步骤与实践
在 Ubuntu 系统上排查 Kubernetes 故障,需围绕节点状态、容器运行、网络连通性、资源使用等核心维度展开,结合 Ubuntu 特有的配置文件路径(如 Kubelet 配置位于 /etc/kubernetes/kubelet.conf)和工具链(如 journalctl 管理 systemd 日志、containerd 作为默认容器运行时),以下是具体流程:
使用 kubectl 命令确认集群节点是否处于 Ready 状态,若有节点显示 NotReady,需进一步排查节点层面问题:
kubectl get nodes -o wide
验证 API Server 是否可访问,集群基础组件(如 Controller Manager、Scheduler)是否正常运行:
kubectl cluster-info
获取所有命名空间的 Pod 状态,重点关注 Error、CrashLoopBackOff 或 Pending 状态的 Pod(Pending 通常与资源不足或调度失败相关):
kubectl get pods --all-namespaces
通过 describe 命令获取 Pod 的事件日志(如镜像拉取失败、调度错误、容器崩溃原因)和状态详情:
kubectl describe pod <pod-name> -n <namespace>
查看容器内应用日志(若 Pod 有多个容器,需指定 -c 参数),日志是定位应用崩溃、报错的关键:
kubectl logs <pod-name> -n <namespace> [-c <container-name>]
若容器已崩溃,可添加 -p 参数查看上次运行日志:
kubectl logs -p <pod-name> -n <namespace>
使用 exec 命令进入容器内部,手动执行命令(如检查文件、测试网络、验证应用配置):
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
# 若容器内无 bash,可替换为 /bin/sh
Kubelet 是 Ubuntu 节点与集群通信的核心组件,需确保其运行正常:
sudo systemctl status kubelet
若服务未启动,使用以下命令启动并查看日志(日志中常包含节点无法就绪的具体原因,如证书错误、容器运行时故障):
sudo systemctl start kubelet
sudo journalctl -u kubelet -f # 实时查看日志
Ubuntu 节点默认使用 containerd 作为容器运行时,需检查其状态和连接:
sudo systemctl status containerd
crictl ps # 查看容器运行状态(需提前配置 /etc/crictl.yaml)
crictl info # 验证与 Kubelet 的连接
crictl 配置文件示例(/etc/crictl.yaml):
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
使用 top、htop 或 kubectl top node 查看 CPU、内存使用情况,若资源耗尽(如内存不足),可能导致 Pod 被驱逐或节点 NotReady:
kubectl top node
free -h # 查看内存使用
df -h # 查看磁盘空间(磁盘满会导致 Kubelet 异常)
Kubernetes 网络依赖插件(如 Calico、Flannel),需检查插件 Pod 是否运行正常:
kubectl get pods -n kube-system | grep -E 'calico|flannel'
若插件 Pod 异常,查看其日志定位问题:
kubectl logs <network-plugin-pod-name> -n kube-system
kubectl run test-tool --image=nicolaka/netshoot -it --rm -- /bin/bash
curl <target-pod-ip>:<port>
kubectl get endpoints <service-name> -n <namespace>
确保 Ubuntu 主机的防火墙(如 ufw)未拦截 Kubernetes 关键端口(如 6443(API Server)、10250(Kubelet)、10255(只读 Kubelet)):
sudo ufw status # 查看防火墙规则
sudo ufw allow 6443/tcp # 允许 API Server 端口
sudo systemctl restart kubelet)。image 字段(如 nginx:latest 是否正确),若使用私有仓库,需配置 imagePullSecrets。kubectl logs)定位崩溃原因,调整资源限制(在 Pod YAML 中添加 resources.limits)。kubeadm join 使用的 Token 或 CA 证书哈希过期(默认有效期 24 小时)。kubeadm join:# 生成新 Token
kubeadm token create
# 计算 CA 证书哈希
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
kubectl debug:无需修改 Pod 即可调试(如进入临时容器):kubectl debug -it <pod-name> --image=busybox --target=<container-name>
crictl:专门用于管理 Kubernetes 容器的命令行工具(替代 docker 命令)。Prometheus + Grafana:监控集群资源使用和 Pod 状态,提前预警资源瓶颈。通过以上步骤,可系统化排查 Ubuntu 上 Kubernetes 的常见故障。需注意,日志分析是核心(尤其是 Kubelet 日志和容器日志),多数问题可通过日志定位根本原因。