排查工作负载

KubernetesBeginner
立即练习

简介

部署并不总是按计划进行。发生故障时,你需要一套可重复的排查方法。

在本实验中,你将解决「丢失镜像之谜」。

在 Kubernetes 中,排查问题通常从对象状态开始,然后查看事件,最后进行更详细的检查。本实验重点介绍这种以证据为基础的排查流程。

你将完成以下任务:

  • 创建案发现场:故意部署一个损坏的 Pod。
  • 展开调查:使用「望远镜」(get)查看异常情况。
  • 收集证据:使用「放大镜」(describe)查找根本原因。
  • 解决案件:修复配置,并观察应用恢复正常。

创建损坏的 Pod

首先部署一个包含拼写错误的 Pod。这样可以模拟一种常见错误:指定不存在的镜像。

这也提醒我们,Kubernetes 可以接受许多问题会在之后才暴露的清单文件。YAML 文件在语法上可能完全正确,但在实际运行时仍然可能配置错误。因此,排查问题时必须区分「对象是否被接受」和「工作负载是否真正成功启动」。

创建名为 broken-pod.yaml 的文件:

nano broken-pod.yaml

粘贴以下内容。注意其中可疑的镜像标签 wrongtag123。

apiVersion: v1
kind: Pod
metadata:
  name: broken-pod
spec:
  containers:
    - name: nginx
      image: nginx:wrongtag123

保存并退出(Ctrl+X、Y、Enter)。

部署 Pod:

kubectl apply -f broken-pod.yaml

由于 YAML 格式正确,Kubernetes 会接受该文件。此时,「案件」还没有被发现。

观察故障

现在查看这个部署的状态,就像用望远镜观察现场一样。

ErrImagePull 和 ImagePullBackOff 等状态是故障表现,而不是最终原因。它们会告诉你下一步应该调查什么。良好的排查方式是把状态输出当作第一个线索,而不是完整的诊断结论。

检查 default 命名空间中的 Pod:

kubectl get pods

刚开始你可能会看到 ContainerCreating,但几秒钟后,状态通常会变为 ImagePullBackOff 或 **ErrImagePull**。

ImagePullBackOff 是 Kubernetes 对以下情况的说法:「我尝试拉取这个镜像,但失败了。我会暂时退避(等待)一段时间,稍后再试。」

这说明受影响的 Pod 当前不健康。

检查事件

我们知道它失败了,但还不知道为什么失败。要查明原因,需要进一步检查。

kubectl describe 命令就是你的放大镜。它会显示特定资源的内部事件和日志。

其中,Events 部分尤其重要,因为它保留了来自调度器和 kubelet 等 Kubernetes 组件的简短过程记录。初学者如果不读取事件就直接随意修复,往往会浪费时间去解决错误的问题。

检查损坏的 Pod:

kubectl describe pod broken-pod

该命令会输出大量信息。向下滚动到最底部,找到 Events 部分。

你应该会看到类似下面的内容:

Type     Reason     Message
----     ------     -------
Normal   Pulling    Pulling image "nginx:wrongtag123"
Warning  Failed     Failed to pull image "nginx:wrongtag123": manifest unknown
Warning  Failed     Error: ErrImagePull

消息 manifest unknown 就是关键证据。这表示 Docker registry(存放镜像的位置)中没有 nginx:wrongtag123 的记录。

案件告破:镜像标签无效。

修复 Pod

现在已经找到根本原因,可以开始修复。

这一步还体现了一个更广泛的排查模式:先观察,根据证据提出假设,进行一次有针对性的修改,然后验证是否恢复。相比一次性进行多项猜测性修改,这种有纪律的循环更加可靠。

再次打开 broken-pod.yaml 文件:

nano broken-pod.yaml

修正这个「拼写错误」。将 nginx:wrongtag123 改为 nginx。nginx 默认对应 nginx:latest,这是一个有效的镜像。

apiVersion: v1
kind: Pod
metadata:
  name: broken-pod
spec:
  containers:
    - name: nginx
      image: nginx

保存并退出。

应用修复。Kubernetes 会根据新信息更新现有 Pod。

kubectl apply -f broken-pod.yaml

现在观察恢复过程:

kubectl get pods -w

你应该会看到状态从 ImagePullBackOff 变为 Running。

按 Ctrl+C 停止观察。

做得很好,侦探!你已经找到了错误,并成功恢复了服务。

总结

在本实验中,你学习了 Kubernetes 的基本排查流程:

  1. 观察:检查 kubectl get pods,找出故障工作负载。
  2. 检查:使用 kubectl describe pod 查看事件日志并查找错误消息。
  3. 修复:更新 YAML 清单文件并应用修正。

这套「Get、Describe、Fix」流程可以解决你在 Kubernetes 职业生涯中遇到的 90% 的部署问题。