当前位置: 首页 > 科技观察

KubernetesPod故障排除的5个简单提示

时间:2023-03-16 16:57:32 科技观察

在许多情况下,您可能会发现Kubernetes中的应用程序未正确部署或无法正常工作。今天的文章提供了如何快速解决此类故障和一些技巧。看完本文,你也会对Kubernetes的内部机制有更深刻的理解。此外,我还会分享一些非常有用的自己操作Kubernetes的技巧。那么,让我们开始吧!首先,Pod失败一般有两种原因:Kubernetes资源配置错误,比如部署(Deployment)和服务(Service)。代码中的问题。第一种情况,容器一般不会启动。在后一种情况下,应用程序代码在容器启动后失败。我们将系统地处理每种情况。在本练习中,我们将使用kubectl与Kubernetes进行交互。Tip1:查看pod,确认pod是处于运行(Running)状态还是就绪(Ready)状态。如kubectlgetpods所示,一个Pod处于Pending状态9个小时,这绝对不是什么好事!容器没有启动,我们将使用技巧2中的describe命令来深入研究这个问题。但是,这里我们重点介绍当容器无法启动时出现的其他错误代码。如下:Imagepullbackoff:Docker镜像仓库无法访问,部署时指定的镜像名称或版本不正确。请确保图像名称正确并且注册表可访问并经过身份验证(docker登录...)。RunContainerError:也是一种可能性。原因:缺少ConfigMap或Secrets。ContainerCreating:有些组件不能在容器创建时立即启用,比如持久化卷?在查看其他错误之前,让我们先尝试使用错误的图像名称启动一个pod。#startPodfromimage"ngin".#'web'canbeanyname,isthenameofresultingK8Sdeploymentkubectlrunweb--image=ngin--replicas=1最后一行显示图片错误果然是完全不存在的图片“ngin”导致了ImagePullBackOff错误。使用正确的图像名称“nginx”将解决此问题。kubectlruntemp--image=nginx--replicas=1kubectlgetpods如图,Pod就起来了。接下来,这里是容器启动后可能发生的一些错误。Crashloopbackoff:Pod生存检查失败或Docker镜像错误。例如,DockerCMD立即退出。您可以使用下面的提示3检查日志。注意:此屏幕截图中的“RESTARTS”列显示重新启动的次数。在这种情况下,您应该会看到一些重启,因为Kubernetes在错误发生时反复尝试启动pod。如果Pod处于Running状态并且您的应用程序仍然无法运行,请继续提示3和4。提示2:检查Pod相关事件如果您在Pod状态上看到错误代码,您可以使用describe命令来获取更多信息。这在容器本身未启动的情况下很有用。kubectldescribefrontend-65c58c957d-f4cqn截图的最后一行显示由于CPU资源不足导致Pod没有启动,请参见底部的消息。您可以增加Pod的CPU并重新部署应用程序。技巧三:查看日志(Log)既然容器已经启动了,那么可以查看日志,看看应用是否正常运行。比如Podfrontend-65c58c957d-bzbg2:kubectllogs--tail=10frontend-65c58c957d-bzbg2滚动查看一个实时运行日志:kubectllogs-ffrontend-65c58c957d-bzbg2如果kubectllogs后没有输出,试试getpod,然后你会发现这很有可能是一个新启动的Pod,那么你可以尝试查看一些上次挂掉的Pod的日志。kubectllogsfrontend-65c58c957d-bzbg2--previous技巧4:直接在Pod中运行“sh”、“bash”或“ash”以进入Pod并运行命令对应用程序进行故障排除(键入exit退出)。kubectlexec-itfrontend-65c58c957d-bzbg2/bin/sh技巧5:显示集群级事件Kubernetes在其管理的资源状态发生变化(正常、警告等)时触发事件。这可以帮助我们了解幕后发生的事情。getevents命令提供事件的聚合视角。#alleventssortedbytime.kubectlgetevents--sort-by=.metadata.creationTimestamp#warningsonlykubectlgetevents--field-selectortype=Warning#eventsrelatedtoNodeskubectlgetevents--field-selectorinvolvedObject.kind=节点额外技巧这是我最喜欢的技巧!熟练掌握各种命令,会让你在Kubernetes集群中行走更有底气。首先,输入kubectl列出所有kubectl命令。接下来,尝试使用以下命令执行grepdebug命令。kubectl|grep-i-A10debugging列出了一些可以在Kubernetes上运行的基本命令。kubectl|grep-i-A5Basic接下来,列出可操作的Kubernetes资源。kubectlapi-resources现在可以自己执行一些命令!您可以选择一个命令(获取、描述、解释)并选择一个资源并运行它!例如,获取节点。所以,试试别的吧!虽然有些组合可能没有多大意义,但除此之外,整个命令系统相当直观和一致;您可以轻松编写命令并进行各种探索。请注意不要删除或修改您不想触摸的对象。列出Kubernetes命名空间(namespace):kubectlgetns这样,您可以使用特定命令更深入地钻取相应的选项或示例。kubectlget--help#seeK8Ssystempodsin'kube-system'namespace!kubectl-nkube-systemgetpods可以看到,Kubernetes的命令系统非常容易理解,通过简单地测试这些命令我们可以学到很多东西。结论至此,我希望您能够找到并修复Kubernetes集群中Kubernetes资源和代码中的错误。同时打算接下来介绍Kubernetes服务(Service)和网络的调试。如果你已经走到这一步,我要感谢你对学习Kubernetes的坚持和奉献。请在下方留下您的评论,如果您有任何想法或任何想谈的话题,请告诉我。最后,如果你想在Kubernetes中部署一个真正的应用,请阅读我之前的文章。然后可以使用命令和故障排除工具对其进行修补。