k8s排错思路整理
概要:Kubernetes 生态系统充斥着各种工具,例如监控、可观察性、跟踪、日志记录等,但一般很难真正理解故障排除与这些工具有何联系。当故障发生时,我们要掌握是从哪里发生,了解所面临的问题,解决眼前的问题,然后修复根本原因。随着系统规模的扩大,这一切会变得越来越复杂。Kubernetes 生态系统充斥着各种工具,例如监控、可观察性、跟踪、日志记录等,但一般很难真正理解故障排除与这些工具有何联系。
概要:Kubernetes 生态系统充斥着各种工具,例如监控、可观察性、跟踪、日志记录等,但一般很难真正理解故障排除与这些工具有何联系。当故障发生时,我们要掌握是从哪里发生,了解所面临的问题,解决眼前的问题,然后修复根本原因。随着系统规模的扩大,这一切会变得越来越复杂。
在排除故障问题时,我们可以采取以下步骤来缩小问题的范围。
1、kubectl get pods
查看所有pod的运行状态,-n 指定pods对应的命名空间,不加表示default空间下
(1)是否处于PENDING状态
① kubectl describe pod <pod-name>
查看pod具体信息,判断集群是否饱和,若饱和则需扩容,非饱和则下一步;
②查看是否达到资源配置限制,若达到限制则需放宽限制条件,非资源限制则下一步;
③查看是否正在装载挂起的持久卷声明,若是则先修复该持久卷,不是则进行下一步;
④ kubectl get pods -o wide
查看pod是否已分配给node节点,若已分配则可能是kubelet的问题,未分配则可能是Scheduler调度有问题。
(2)是否处于RUNNING状态
①若是则跳转至(3),不是则打印pod日志(kubectl logs ),判断是否为应用部署错误,若是则修复应用后重新部署,不是则下一步;
②容器是否重启的太快看不到日志,是跳转至③,不是跳转至④;
③kubectl logs --previous 重新查看日志返回步骤①,若依旧看不到日志则执行步骤④;
④ kubectl describe pod <pod-name>
查看pod状态,判断是否为拉取不到镜像报错(ImagePullBackOff),若是则执行以下检查,不是则跳转⑤;
1)判断镜像名称是否正确,不正确则修改正确后跳转至⑤;
2)判断镜像标签是否有效,不正确则修改正确后跳转至⑤;
3)判断镜像是否能够成功从私有仓库拉取下来,能拉取则配置私有仓库镜像,不能拉取则可能是docker、CRI、Kubelet的问题;
⑤判断是否为崩溃回退报错(CrashLoopBackOff),若是则执行以下检查,不是则跳转⑥;
1)检查日志并修复应用,若无问题进行下一步;
2)检查Dockerfile中的CMD命令,若无问题进行下一步;
3)检查是否pod不断频繁重启并在RUNNING状态与CrashLoopBackOff状态来回切换,若是则可能是健康检查问题,需修复liveness probe
4)上述都不是,出现未知的崩溃回退问题
⑥判断是否为容器运行时错误(RunContainerError),若是则可能为挂载卷问题,检查yaml配置及卷状态,不是则跳转⑦;
⑦判断是否有任一容器正在运行,若有则可能为节点生命周期控制器的问题,检查集群基础服务,不是则可能为栈溢出错误(StackOverflow)
(3)是否处于READY状态
①查看pod状态
(kubectl describe pod <pod-name>)
,检查是否为Readiness probe failing,若是则修复Readiness probe
② kubectl port-forward <pod-name> 8080:<pod-port>
,检查应用是否能被访问,若无法访问,则检查容器的端口 暴露是否配置正确,若可以访问则pod无问题
2、Pod运行正常,检查service
(1) kubectl describe service <service-name>
检查pod所在service状态
①检查是否能看到endpoints列表
②若是则跳转至(2),不是则进行以下检查
1)检查pod标签是否匹配,若不匹配则必须修改正确,继续下一步检查
2)检查pod是否分配了ip地址,若分配了ip地址则可能为kubelet的问题,若未分配则是控制管理器的问题,检查集群的Controller manager
(2) kubectl port-forward service/<service-name> 8080:<service-port>
检查service是否能访问
①检查通过service是否能访问应用,若可以访问则service运行正常,若无法访问则进入下一步检查;
②检查service的target port 与容器的Port是否匹配,若不匹配则进行修改后返回①,若匹配正确仍无法访问,则可能为kube proxy的问题,需检查基础组件
3、Service运行正常,检查ingress
(1) kubectl describe ingress <ingress-name>
检查ingress状态
①检查是否有backends列表
②若是则跳转至(2),不是则检查serviceName与servicePort是否正确匹配service,若不匹配则修改正确,匹配正确后跳转至步骤①
(2) kubectl port-forward <ingress-pod-name> 8080:<ingress-port>
检查ingress访问
①检查通过ingress是否能访问应用
②若能访问则ingress无问题,若不能访问则可能是ingress的问题,需仔细检查ingress配置文件,确认无误后重新部署启动。
4、Ingress运行正常,检查公网是否可以访问。通过公网访问ingress服务,若无法访问则可能是基础组件问题或集群未暴露在公网问题。
只有让团队成员真正了解他们的系统,并对产生的告警采取对应的行动,将最好的开发人员和运维人员结合在一起时,通过更好地合作来更快地解决故障。
作者:詹琉
链接:移动云开发者社区
来源:移动云官网开发者社区
更多推荐
所有评论(0)