1.排查 K8s Deployment 故障的 3 个步骤
由于每个 deployment 包含 3 个组件,因此必须从底层开始依次 debug 这些组件。
- 您应该确保 Pod 处于 running 状态,然后
- 专注于让服务将流量路由到 Pod,然后
- 检查 Ingress 配置是否正确
1.1 详细操作如下
- 应该从底层开始对 Deployment 进行故障排查。首先检查 Pod 就绪并正在运行
- 如果 Pod 已就绪,则应调查服务是否可以将流量分配到 Pod
- 最后应该检查 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”部分为空,则有两种解释:
- 您并没有运行带有正确标签的 Pod(提示:您应检查自己是否在正确的 namespace)
- 您在 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>