前言
轻松排除Kubernetes应用程序的故障并了解其机制在许多情况下,您可能会发现Kubernetes中的应用程序没有正确部署,或者没有正常工作。这篇文章提供了快速解决这种情况的故障排除技巧。
首先,你的Pod会失败有两个原因。 Kubernetes资源配置中的错误,如部署和服务。 代码中的问题。 在前一种情况下,容器不会启动。在后一种情况下,应用程序代码在容器启动后失败。 在本练习中,将使用kubectl命令行实用程序与K8S进行交互。
1.观测Pod
验证pod处于运行状态或就绪状态。
kubectl get pods
一个Pod处于待定状态九个小时,这可不好!容器没有启动,我们将使用技巧二中的describe命令对此进行研究。 同时,下面是容器启动失败时出现的其他错误代码。
- ImagePullBackoff-Docker映像注册表不可访问,部署中指定的映像名称/版本不正确。确保图像名称是正确的,注册表是可访问的和经过身份验证的(docker登录…)。
- RunContainerError-一个可能的原因:缺少配置映射/机密。
- ContainerCreating——不能立即获得的东西,持久卷?
在我们调查其他错误之前,让我们尝试使用不正确的映像名称启动Pod。
# start Pod from image "ngin".
# 'web' can be any name, is the name of resulting K8S deployment
kubectl run temp --image=ngin --replicas=1
kubectl run temp --image=nginx --replicas=1
kubectl get pods
接下来,下面是容器启动后可能出现的一些错误。
- CrashLoopBackOff-Pod活性检查失败或Docker映像有问题。E、g.,Docker命令正在立即退出。请参见技巧三来检查日志。注意:屏幕截图中的“重新启动”列显示了重新启动的次数。在这种情况下,您应该会看到一些重启,因为当出现错误时,K8S会重复尝试启动pod。
- 如果Pod处于运行状态,而您的应用程序仍然不能正常工作,请继续提示三和四。
2.检查与Pod相关的事件
如果您在Pod状态上看到其中一个错误代码,您可以使用describe命令获取更多信息。这在容器本身没有启动的情况下很有帮助。
kubectl describe frontend-65c58c957d-f4cqn
截图的最后一行表示由于缺乏CPU资源,Pod尚未启动,请参见底部的消息。您可以增加Pod的CPU份额并重新部署应用程序。
3.检日志
截图的最后一行表示由于缺乏CPU资源,Pod尚未启动,请参见底部的消息。您可以增加Pod的CPU份额并重新部署应用程序。
kubectl logs --tail=10 frontend-65c58c957d-bzbg2
正在运行的应用程序的Steam日志。
kubectl logs -f frontend-65c58c957d-bzbg2
如果日志的命令没有产生任何输出,那么get pod可能显示了一个新重新启动的pod,因此请检查之前的死pod。
kubectl logs frontend-65c58c957d-bzbg2 --previous
4.直接在pod中运行“sh”、“bash”或“ash”
您可以进入Pods并运行命令来对您的应用程序进行故障排除(点击exit退出)。
kubectl exec -it frontend-65c58c957d-bzbg2 /bin/sh
5.展示集群日志
每当K8S管理的资源的状态发生变化(正常、警告等)时,K8S就会触发事件。他们帮助我们了解幕后发生的事情。get events命令提供事件的聚合透视图。
# all events sorted by time.
kubectl get events --sort-by=.metadata.creationTimestamp# warnings only
kubectl get events --field-selector type=Warning# events related to Nodes
kubectl get events --field-selector involvedObject.kind=Node
其他
这是我最喜欢的提示!熟悉命令让您有信心在K8S集群中导航。 首先,在命令列表中键入kubectl。 接下来,尝试这里显示的命令来grep调试命令。
kubectl | grep -i -A 10 debugging
列出了可以在K8S资源上运行的基本命令。
kubectl | grep -i -A 5 Basic
接下来,列出您可以操作的Kubernetes资源。
kubectl api-resources
现在做你自己的命令!您可以选择一个命令(获取、描述、解释)并在这些资源中的一个上运行它!E、g.获取节点。试试别人! 虽然有些组合没有意义,但除此之外,命令系统相当直观和一致;您可以轻松地编写命令和浏览。 只是要小心不要删除或修改你不想触摸的对象。 列出K8S命名空间:
kubectl get ns
您可以深入研究特定的命令来理解您的选项和示例。
kubectl get --help# see K8S system pods in 'kube-system' namespace!
kubectl -n kube-system get pods
正如您所看到的,K8S命令系统非常容易理解,您可以通过试验这些命令学到很多东西。
总结
在Kubernetes集群中工作很舒服,定位并修复K8S资源和代码中的错误。快速定位排除K8s异常,如果有能力可以阅读K8s源码,对自己的编程能力又非常大的提升,熟悉operator原理和调协可以在异常情况下万变不离其宗的排除。