解决Kubernetes Pod故障的5个简单的技巧

标签: kubernetes pod 技巧 | 发表时间:2020-04-21 13:12 | 作者:frankinbj
出处:http://weekly.dockone.io

——轻松地解决Kubernetes应用程序的故障并理解其机制

在很多情况下,你可能会发现Kubernetes中的应用程序没有正确地部署,或者没有正常地工作。今天这篇文章就提供了如何去快速解决这类故障以及一些技巧。
在阅读了这篇文章之后,你还将深入了解Kubernetes的内部机制,另外,我还将与大家分享一些关于自己操作K8S的一些非常有用的技巧。
那么,我们开始吧!
首先,Pod失败的原因一般有两个:
1. Kubernetes资源配置中的错误,例如在部署(deployment)和服务(service)里。
2. 代码中的问题。
在第一种情况下,容器一般不会启动。在后一个实例中,应用程序代码在容器启动后失败。我们将系统地处理每种情况。
在本练习中,我们会使用kubectl来实现与K8S的交互。

技巧1:检查Pod
确认Pod处于运行(Running)状态或准备就绪(Ready)的状态。
Kubectl get pods

如图,一个Pod在等待(Pending)状态9个小时,肯定不是个好事!容器没有启动,我们将会使用技巧2中的describe命令对此进行深入地研究。但,在这里我们强调一下在容器启动失败时发生的其他错误代码。如下:
• Imagepullbackoff — Docker镜像仓库不可访问,部署中指定的镜像名称或版本不正确。请确保映像名称是正确的,并且镜像仓库是可访问的以及经过身份验证的(docker login…)。
• RunContainerError — 也是一种可能。 原因:缺少ConfigMap或Secrets
• ContainerCreating — 容器创建时一些组件无法立刻启用,比如持久卷?
在研究其他错误之前,让我们先尝试使用错误的映像名称启动Pod。
# start Pod from image "ngin".
# 'web' can be any name, is the name of resulting K8S deployment
kubectl run web --image=ngin --replicas=1

最后一行展示了—镜像错误
果然,完全不存在的镜像“ngin”导致了ImagePullBackOff错误。 使用正确的镜像名称“nginx”就能解决这个问题
kubectl run temp --image=nginx --replicas=1
kubectl get pods

如图,Pod已经起来了。

接下来,这里有一些在容器启动后可能发生的错误。
• Crashloopbackoff — Pod存活检查失败或Docker镜像出错。例如,Docker CMD即刻退出。可以用下面的技巧3来检查日志。注意:此截图中的“重启(RESTARTS)”列显示了重启的次数。在这种情况下,你应该会看到一些重启,因为当错误发生时,K8S会反复尝试启动Pods。
• 如果Pod处于运行(Running)状态,而你的应用程序仍然不能正常工作,请继续技巧3和4。

技巧2: 检查和Pod相关的事件
如果你在Pod状态上看到一个错误代码,你可以使用describe命令获得更多信息。这在容器本身没有启动的情况下是很有帮助的。
kubectl describe frontend-65c58c957d-f4cqn

截图的最后一行表明,由于缺少CPU资源,Pod还没有启动,请参见底部的消息。你可以增加Pod的CPU再重新部署应用程序。

技巧3:检查日志(Log)
现在容器已经启动,可以通过检查日志来查看应用程序是否正常运行。例如,Pod frontend-65c58c957d-bzbg2:
kubectl logs --tail=10 frontend-65c58c957d-bzbg2

实时滚动查看一个正在运行的日志:
kubectl logs -f frontend-65c58c957d-bzbg2
如果kubectl logs 后没有任何输出,试试使用get pod,然后会发现这很有可能是一个新启动的Pod,因此可以尝试检查一些上一次挂掉的Pod的日志。
kubectl logs frontend-65c58c957d-bzbg2 --previous

技巧4:直接在Pod中运行“sh”、“bash”或“ash”
可以进入到Pod内部并运行命令来对应用程序进行故障排除(输入exit即可退出)。
kubectl exec -it frontend-65c58c957d-bzbg2 /bin/sh

技巧5:显示集群级别的事件
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可以列出所有kubectl的命令。
接下来,尝试用下面的命令来执行grep调试命令。
kubectl | grep -i -A 10 debugging

列出可以在K8S上运行的一些基本命令。
kubectl | grep -i -A 5 Basic

接下来,列出可操作的Kubernetes资源。
kubectl api-resources

现在可以自己搞一些命令了!你可以选择一个命令(get、describe、explain)并选取一个资源然后运行它!例如,get nodes。所以,再试试别的吧!
虽然有些组合可能并没什么意义,但除了这一点,整个command系统是相当直观和一致的;你可以轻松地编写命令并进行各种探索。
只是千万要小心,不要删除或修改你不希望碰到的对象。
列出k8名称空间(namespace):
kubectl get ns

这样,你可以使用特定的命令来更深入地研究相应的选项或示例
kubectl get --help# see K8S system pods in 'kube-system' namespace!
kubectl -n kube-system get pods

正如你所看到的,K8S的命令系统非常容易理解,简单地测试这些命令能让我们学到很多东西。

结论
有了这些,我希望你能在Kubernetes集群中找到并修复K8S资源和代码中的错误。同时我打算接下来再介绍一下K8S服务(service)和网络的调试。
如果你已经走了这么远,我想感谢你对学习Kubernetes的坚持和奉献。请在下面留下你的评论,如果你有什么想法,或者有什么想谈论的话题,也请告诉我。
最后,如果你想在K8S中部署一个真实的应用程序,请阅读我的最后一篇文章( https://medium.com/better-prog ... 2e533)。然后可以使用命令和故障排除工具对其进行修补。

进一步的阅读
• 调试Kubernetes应用程序( https://kubernetes.io/docs/tas ... tion/
• 学习K8s——deployment故障排查( https://learnk8s.io/troubleshooting-deployments

原文链接: https://medium.com/better-prog ... 03ba6

相关 [kubernetes pod 技巧] 推荐:

解决Kubernetes Pod故障的5个简单的技巧

- - DockOne.io
——轻松地解决Kubernetes应用程序的故障并理解其机制. 在很多情况下,你可能会发现Kubernetes中的应用程序没有正确地部署,或者没有正常地工作. 今天这篇文章就提供了如何去快速解决这类故障以及一些技巧. 在阅读了这篇文章之后,你还将深入了解Kubernetes的内部机制,另外,我还将与大家分享一些关于自己操作K8S的一些非常有用的技巧.

Kubernetes:玩转 Pod 滚动更新

- - IT瘾-dev
今天推荐一篇关于Kubernetes上服务滚动更新相关的配置选项的文章,文章列出了最常用的几个配置项,解释了他们是怎么影响调度器对服务进行滚动更新的,同时还带出了 Kubernetes项目中 Pod这个逻辑单元的 Ready状态是怎么确定的,并不是容器运行起来后 Pod就进入 Ready状态的.

POD驱逐-配置资源不足时的处理方式 | Kubernetes

- -
kubelet配置资源不足时的处理方式. kubelet需要保证节点稳定性. 这在处理如内存和硬盘之类的不可压缩资源时尤为重要. 如果任意一种资源耗尽,节点将会变得不稳定. kubelet支持按照以下表格中描述的信号触发驱逐决定. 每个信号的值在 description 列描述,基于. kubelet摘要 API.

Kubernetes 集群零停机更新-使用preStop优雅关停POD

- -
原文标题:Gracefully Shutting Down Pods in a Kubernetes Cluster. 发布时间:Jan 26, 2019. 原文链接:https://blog.gruntwork.io/zero-downtime-server-updates-for-your-kubernetes-cluster-902009df5b33.

浅析Kubernetes Pod重启策略和健康检查

- -
Kubernetes的主要好处之一是它具有管理和维护集群中容器的能力,几乎可以提供服务零停机时间的保障. Kubernetes会为它选择worker节点,然后将其调度到节点上运行. Kubernetes强大的功能可使应用程序的容器保持连续运行,还可以根据需求的增长自动扩展系统. Kubernetes还可以让系统实现"自愈".

Kubernetes 集群零停机更新-使用PDB保证最少可用POD数

- -
原文标题:Avoiding Outages in your Kubernetes Cluster using PodDisruptionBudgets. 发布时间:Jan 26, 2019. 原文链接:https://blog.gruntwork.io/avoiding-outages-in-your-kubernetes-cluster-using-poddisruptionbudgets-ef6a4baa5085.

Kubernetes 集群零停机更新-增加preStop延迟实现POD摘流

- -
原文标题:Gracefully Shutting Down Pods in a Kubernetes Cluster. 发布时间:Jan 26, 2019. 原文链接:https://blog.gruntwork.io/delaying-shutdown-to-wait-for-pod-deletion-propagation-445f779a8304.

Kubernetes群集的零停机更新-使用drain驱逐POD去维护NODE

- -
原文标题:Zero Downtime Server Updates For Your Kubernetes Cluster. 发布时间:Jan 26, 2019. 原文链接:https://blog.gruntwork.io/zero-downtime-server-updates-for-your-kubernetes-cluster-902009df5b33.

spring cloud kubernetes在pod模式下服务调用源码解析_水中加点糖-CSDN博客

- -
之所以只看pod模式下的服务调用链路,是因为在service模式下不会走缓存,效率低,并且负载均衡模式不能由spring cloud框架所控制,不太灵活. feign调用时用的org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient中的execute方法调用的.

# [k8s] HPA: Horizontal Pod Autoscaling

- - V2EX - 技术
HPA 是 K8S 的一大利器. 通过 HPA, 我们可以让服务的 pod 数量根据特定指标自动增加或减少, 使得在高峰期有足够的资源服务请求, 在低峰期又可以避免占用过多的资源. 同时, 在 SOA 架构下, 我们也习惯通过 HPA 来避免劳心劳力的为每个微服务计算所需的资源.. minReplicas: 允许的最小 pod 数量.