温馨提示×

Kubernetes 故障排查在 Ubuntu 上怎么做

小樊
38
2025-10-08 03:43:58
栏目: 智能运维

Kubernetes 故障排查在 Ubuntu 上的核心步骤与实践

在 Ubuntu 系统上排查 Kubernetes 故障,需围绕节点状态、容器运行、网络连通性、资源使用等核心维度展开,结合 Ubuntu 特有的配置文件路径(如 Kubelet 配置位于 /etc/kubernetes/kubelet.conf)和工具链(如 journalctl 管理 systemd 日志、containerd 作为默认容器运行时),以下是具体流程:

一、基础状态检查

1. 检查节点就绪状态

使用 kubectl 命令确认集群节点是否处于 Ready 状态,若有节点显示 NotReady,需进一步排查节点层面问题:

kubectl get nodes -o wide

2. 查看集群整体信息

验证 API Server 是否可访问,集群基础组件(如 Controller Manager、Scheduler)是否正常运行:

kubectl cluster-info

3. 检查 Pod 运行状态

获取所有命名空间的 Pod 状态,重点关注 ErrorCrashLoopBackOffPending 状态的 Pod(Pending 通常与资源不足或调度失败相关):

kubectl get pods --all-namespaces

二、容器级故障排查

1. 查看 Pod 详细信息

通过 describe 命令获取 Pod 的事件日志(如镜像拉取失败、调度错误、容器崩溃原因)和状态详情:

kubectl describe pod <pod-name> -n <namespace>

2. 获取容器日志

查看容器内应用日志(若 Pod 有多个容器,需指定 -c 参数),日志是定位应用崩溃、报错的关键:

kubectl logs <pod-name> -n <namespace> [-c <container-name>]

若容器已崩溃,可添加 -p 参数查看上次运行日志:

kubectl logs -p <pod-name> -n <namespace>

3. 进入容器调试

使用 exec 命令进入容器内部,手动执行命令(如检查文件、测试网络、验证应用配置):

kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
# 若容器内无 bash,可替换为 /bin/sh

三、Ubuntu 节点特定排查

1. 检查 Kubelet 服务状态

Kubelet 是 Ubuntu 节点与集群通信的核心组件,需确保其运行正常:

sudo systemctl status kubelet

若服务未启动,使用以下命令启动并查看日志(日志中常包含节点无法就绪的具体原因,如证书错误、容器运行时故障):

sudo systemctl start kubelet
sudo journalctl -u kubelet -f  # 实时查看日志

2. 验证容器运行时

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

3. 检查系统资源

使用 tophtopkubectl top node 查看 CPU、内存使用情况,若资源耗尽(如内存不足),可能导致 Pod 被驱逐或节点 NotReady

kubectl top node
free -h  # 查看内存使用
df -h  # 查看磁盘空间(磁盘满会导致 Kubelet 异常)

四、网络问题排查

1. 验证网络插件

Kubernetes 网络依赖插件(如 Calico、Flannel),需检查插件 Pod 是否运行正常:

kubectl get pods -n kube-system | grep -E 'calico|flannel'

若插件 Pod 异常,查看其日志定位问题:

kubectl logs <network-plugin-pod-name> -n kube-system

2. 测试网络连通性

  • Pod 间通信:进入一个 Pod,尝试访问另一个 Pod 的 ClusterIP 或 Pod IP(需提前知道目标 Pod IP):
    kubectl run test-tool --image=nicolaka/netshoot -it --rm -- /bin/bash
    curl <target-pod-ip>:<port>
    
  • Service 访问:检查 Service 的 Endpoints 是否正常(Endpoints 列表应包含后端 Pod IP):
    kubectl get endpoints <service-name> -n <namespace>
    

3. 检查防火墙与端口

确保 Ubuntu 主机的防火墙(如 ufw)未拦截 Kubernetes 关键端口(如 6443(API Server)、10250(Kubelet)、10255(只读 Kubelet)):

sudo ufw status  # 查看防火墙规则
sudo ufw allow 6443/tcp  # 允许 API Server 端口

五、常见故障场景解决

1. 节点 NotReady

  • 原因:Kubelet 未运行、容器运行时故障、网络插件未启动。
  • 解决:按照上述“Ubuntu 节点特定排查”步骤逐一检查,修复对应问题(如重启 Kubelet:sudo systemctl restart kubelet)。

2. 镜像拉取失败(ErrImagePull)

  • 原因:镜像名称错误、标签不存在、私有仓库权限不足。
  • 解决:检查 Pod YAML 中的 image 字段(如 nginx:latest 是否正确),若使用私有仓库,需配置 imagePullSecrets

3. 容器 CrashLoopBackOff

  • 原因:应用崩溃(如端口冲突、依赖缺失)、资源限制过低(CPU/内存不足)。
  • 解决:查看容器日志(kubectl logs)定位崩溃原因,调整资源限制(在 Pod YAML 中添加 resources.limits)。

4. Token 过期(Node 无法加入集群)

  • 原因kubeadm join 使用的 Token 或 CA 证书哈希过期(默认有效期 24 小时)。
  • 解决:在 Master 节点生成新 Token 和 CA 证书哈希,重新执行 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 日志和容器日志),多数问题可通过日志定位根本原因。

0