Skip to content

1.排查 K8s Deployment 故障的 3 个步骤

由于每个 deployment 包含 3 个组件,因此必须从底层开始依次 debug 这些组件。

  1. 您应该确保 Pod 处于 running 状态,然后
  2. 专注于让服务将流量路由到 Pod,然后
  3. 检查 Ingress 配置是否正确

1.1 详细操作如下

  1. 应该从底层开始对 Deployment 进行故障排查。首先检查 Pod 就绪并正在运行
  2. 如果 Pod 已就绪,则应调查服务是否可以将流量分配到 Pod
  3. 最后应该检查 Service 与 Ingress 之间的连接

1.2 排查Pod 故障

shell
#有 4 个常用的命令可以用来排查 Pod 故障

#查看Pod状态
kubectl get pods

#获取 Pod 容器的日志
kubectl logs <pod name>

#获取 Pod 相关的事件列表
kubectl describe pod <pod name>

#在 Pod 内的容器中运行一个交互式命令
kubectl exec -it <pod name> -- bash
#有 4 个常用的命令可以用来排查 Pod 故障

#查看Pod状态
kubectl get pods

#获取 Pod 容器的日志
kubectl logs <pod name>

#获取 Pod 相关的事件列表
kubectl describe pod <pod name>

#在 Pod 内的容器中运行一个交互式命令
kubectl exec -it <pod name> -- bash

❌ 注意

常见 Pod 错误

启动错误如下:

  • ImagePullBackOff
  • ImageInspectError
  • ErrImagePull
  • ErrImageNeverPull
  • RegistryUnavailavle
  • InvalidImageName

运行时错误如下:

  • CrashLoopBackOff
  • RunContainerError
  • KillContainerError
  • VerifyNonRootError
  • RunInitContainerError
  • CreatePodSandboxError
  • ConfigPodSandboxError
  • KillPodSandboxError
  • SetupNetworkError
  • TeardownNetworkError

1.3 排查 Service 故障

如果 Pod 处于 Running 状态并 Ready,但仍无法收到应用程序的相应,则应检查 Service 的配置是否正确

Service 旨在根据 Pod 的标签将流量路由至 Pod

检查的第一件事是 Service 匹配了多少 Pod

通过检查 Service 中的 Endpoint

shell
kubectl describe service <service-name> | grep Endpoints
kubectl describe service <service-name> | grep Endpoints

endpoint 是一对 <ip address: port>,并且在 Service(至少)有一个 Pod,当 Service 以 Pod 为目标时

如果“Endpoints”部分为空,则有两种解释:

  1. 您并没有运行带有正确标签的 Pod(提示:您应检查自己是否在正确的 namespace)
  2. 您在 Service 的 selector 的标签中有错别字

如果您看到了 endpoints 列表,但仍然无法访问您的应用程序,则 service 中的 targetPort出现问题

测试服务

无论服务类型如何,都可以使用 kubectl port-forward 连接到它:

 kubectl port-forward service/<service-name> 3000:80
 kubectl port-forward service/<service-name> 3000:80

其中:

  • <service-name> 是 Service 的名称
  • 3000 是您希望在您的电脑上开放的端口
  • 80 是 Service 暴露的端口

1.4 排查 Ingress 故障

  • Pod 处于 Running 状态并 Ready
  • Service 将流量分配到了 Pod

仍然看不到应用程序的响应,有可能是 Ingress 配置错误

Ingress 使用 serviceName 和 servicePort 连接到 Service

检查 Ingress 是否配置正确

kubectl describe ingress <ingress-name>
kubectl describe ingress <ingress-name>