网站
https://learnk8s.io/troubleshooting-deployments

一、排查方法

对Kubernetes集群中常见问题的排查方法进行说明

1、查看Kubernetes对象的当前运行时信息,特别是与对象关联的Event事件

  1. kubectl describe pod <pod_name>
  2. kubectl describe servie <service_name>
  3. kubectl describe node <node_name>
  4. ... ...

2、对于服务、容器方面的问题,可能需要深入容器内部进行故障诊断,此时可以通过查看容器的运
行日志来定位具体问题。

  1. kubectl logs [-f] <pod_name> [-c <container_name>]
  2. #如果pod内有多个container,则需通过-c指定具体容器 #如需查看实时更新的日志,则需参数-f

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs

3、对于某些复杂问题,例如Pod调度这种全局性的问题,可能需要结合集群中每个节点上的
Kubernetes服务日志来排查。比如搜集Master上的kube-apiserver、kube-schedule、kube-controler-manager服务 日志,以及各个Node上的kubelet、kube-proxy服务日志,通过综合判断各种信息,就能找到问题的成因并解 决问题。

附录:常用排查命令

  1. kubectl describe pod <pod_name>
  2. kubectl logs [-f] <pod_name> [-c <container_name>]
  3. kubectl exec -it <pod_name> -- bash
  4. kubectl get deploy/nginx-1 -o yaml
  5. #副本数降为0
  6. kubectl scale deploy/nginx-1 --replicas=0

二、常见问题

Pod常见问题

Pod启动时常见错误

  • ImagePullBackoff
  • ImageInspectError
  • ErrImagePull
  • ErrImageNeverPull
  • RegistryUnavailable
  • InvalidImageName

Pod运行时常见错误

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

CrashLoopBackOff

如果容器无法启动,则 Kubernetes 将 CrashLoopBackOff 消息显示为状态。 通常,容器在以下情况下无法启动:

  • 应用程序中存在错误,导致其无法启动。
  • 您错误地配置了容器。
  • Liveness 探测失败太多次。

您应该尝试从该容器中检索日志以调查失败的原因。

如果因为容器重启太快而看不到日志,可以使用以下命令:

  1. $ kubectl logs <pod-name> --previous

RunContainerError

当容器无法启动时出现错误。 这甚至在容器内的应用程序启动之前。 该问题通常是由于配置错误造成的,例如:
挂载不存在的卷,例如 ConfigMap 或 Secrets。
将只读卷挂载为读写。

排查方法:

  1. $ kubectl describe pod <pod-name>

Pod创建成功,但RESTARTS数量持续增加
通常是因为容器的启动命令不能保持在前台运行。其解决方法为将
Docker镜像的启动命令设置为一个前台运行的命令,例如

  1. zkServer.sh start-foreground

通过服务名无法访问服务

在Kubernetes集群中应尽量使用服务名访问正在运行的微服务,但有时会访问失败。由于服务涉及服务
名的DNS域名解析、kube-proxy组件的负载分发、后端Pod列表的状态等,所以可通过以下几方面排查问
题。
(1)查看Service的后端Endpoint是否正常

  1. kubectl get endpoints <service_name>

如果列表为空,则可能是因为Service与Pod没有匹配上(Label、port)或后端Pod一直没有达到Ready状态

如果“Endpoints”部分为空,有两种解释:
您没有任何使用正确标签运行的 Pod(提示:您应该检查您是否在正确的命名空间中)。
您在服务的选择器标签中有错字

(2)查看Service的名称能否被正确解析为ClusterIP地址

  1. ping <service_name>.<namespace>.svc

通过在客户端容器中ping ..svc进行检查,如果能够得到Service的
ClusterIP地址,则说明DNS服务能够正确解析Service的名称;
如果不能得到Service的ClusterIP地址,则可能 是因为Kubernetes集群的DNS服务工作异常

参考
《Kubernetes 常见故障:Pod 无法解析域名》
https://mp.weixin.qq.com/s/wJa0rgF7l__FdNmGxlY4Hw

《K8s常见问题:Service 不能访问排查流程》
https://mp.weixin.qq.com/s/oCRWkBquUnRLC36CPwoZ1Q

Conection refused

原因分析:端口映射错误,服务正常工作,但不能提供服务。
解决方法:删除svc,重新映射端口即可。