网站
https://learnk8s.io/troubleshooting-deployments
一、排查方法
对Kubernetes集群中常见问题的排查方法进行说明
1、查看Kubernetes对象的当前运行时信息,特别是与对象关联的Event事件。
kubectl describe pod <pod_name>
kubectl describe servie <service_name>
kubectl describe node <node_name>
... ...
2、对于服务、容器方面的问题,可能需要深入容器内部进行故障诊断,此时可以通过查看容器的运
行日志来定位具体问题。
kubectl logs [-f] <pod_name> [-c <container_name>]
#如果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服务日志,通过综合判断各种信息,就能找到问题的成因并解 决问题。
附录:常用排查命令
kubectl describe pod <pod_name>
kubectl logs [-f] <pod_name> [-c <container_name>]
kubectl exec -it <pod_name> -- bash
kubectl get deploy/nginx-1 -o yaml
#副本数降为0
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 探测失败太多次。
您应该尝试从该容器中检索日志以调查失败的原因。
如果因为容器重启太快而看不到日志,可以使用以下命令:
$ kubectl logs <pod-name> --previous
RunContainerError
当容器无法启动时出现错误。 这甚至在容器内的应用程序启动之前。 该问题通常是由于配置错误造成的,例如:
挂载不存在的卷,例如 ConfigMap 或 Secrets。
将只读卷挂载为读写。
排查方法:
$ kubectl describe pod <pod-name>
Pod创建成功,但RESTARTS数量持续增加
通常是因为容器的启动命令不能保持在前台运行。其解决方法为将
Docker镜像的启动命令设置为一个前台运行的命令,例如
zkServer.sh start-foreground
通过服务名无法访问服务
在Kubernetes集群中应尽量使用服务名访问正在运行的微服务,但有时会访问失败。由于服务涉及服务
名的DNS域名解析、kube-proxy组件的负载分发、后端Pod列表的状态等,所以可通过以下几方面排查问
题。
(1)查看Service的后端Endpoint是否正常
kubectl get endpoints <service_name>
如果列表为空,则可能是因为Service与Pod没有匹配上(Label、port)或后端Pod一直没有达到Ready状态
如果“Endpoints”部分为空,有两种解释:
您没有任何使用正确标签运行的 Pod(提示:您应该检查您是否在正确的命名空间中)。
您在服务的选择器标签中有错字
(2)查看Service的名称能否被正确解析为ClusterIP地址
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,重新映射端口即可。