20

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

 4 years ago
source link: http://dockone.io/article/10055
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

fMVNjuv.jpg!web

在很多情况下,你可能会发现Kubernetes中的应用程序没有正确地部署,或者没有正常地工作。今天这篇文章就提供了如何去快速解决这类故障以及一些技巧。

在阅读了这篇文章之后,你还将深入了解Kubernetes的内部机制,另外,我还将与大家分享一些关于自己操作K8S的一些非常有用的技巧。

那么,我们开始吧!

首先,Pod失败的原因一般有两个:

1. Kubernetes资源配置中的错误,例如在部署(deployment)和服务(service)里。

2. 代码中的问题。

在第一种情况下,容器一般不会启动。在后一个实例中,应用程序代码在容器启动后失败。我们将系统地处理每种情况。

在本练习中,我们会使用kubectl来实现与K8S的交互。

技巧1:检查Pod

确认Pod处于运行(Running)状态或准备就绪(Ready)的状态。

Kubectl get pods

eeU3aeI.png!web

如图,一个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

M7jeUby.png!web

最后一行展示了—镜像错误

果然,完全不存在的镜像“ngin”导致了ImagePullBackOff错误。 使用正确的镜像名称“nginx”就能解决这个问题

kubectl run temp --image=nginx --replicas=1

kubectl get pods

NZJZVnE.png!web

如图,Pod已经起来了。

接下来,这里有一些在容器启动后可能发生的错误。

• Crashloopbackoff — Pod存活检查失败或Docker镜像出错。例如,Docker CMD即刻退出。可以用下面的技巧3来检查日志。注意:此截图中的“重启(RESTARTS)”列显示了重启的次数。在这种情况下,你应该会看到一些重启,因为当错误发生时,K8S会反复尝试启动Pods。

• 如果Pod处于运行(Running)状态,而你的应用程序仍然不能正常工作,请继续技巧3和4。

技巧2: 检查和Pod相关的事件

如果你在Pod状态上看到一个错误代码,你可以使用describe命令获得更多信息。这在容器本身没有启动的情况下是很有帮助的。

kubectl describe frontend-65c58c957d-f4cqn

Yr2ERfY.png!web

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

技巧3:检查日志(Log)

现在容器已经启动,可以通过检查日志来查看应用程序是否正常运行。例如,Pod frontend-65c58c957d-bzbg2:

kubectl logs --tail=10 frontend-65c58c957d-bzbg2

a26NFju.png!web

实时滚动查看一个正在运行的日志:

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

FRJFJvi.png!web

列出可以在K8S上运行的一些基本命令。

kubectl | grep -i -A 5 Basic

QfueEbr.png!web

接下来,列出可操作的Kubernetes资源。

kubectl api-resources

rm2a6v7.png!web

现在可以自己搞一些命令了!你可以选择一个命令(get、describe、explain)并选取一个资源然后运行它!例如,get nodes。所以,再试试别的吧!

虽然有些组合可能并没什么意义,但除了这一点,整个command系统是相当直观和一致的;你可以轻松地编写命令并进行各种探索。

只是千万要小心,不要删除或修改你不希望碰到的对象。

列出k8名称空间(namespace):

kubectl get ns

uyQrmiZ.png!web

这样,你可以使用特定的命令来更深入地研究相应的选项或示例

kubectl get --help# see K8S system pods in 'kube-system' namespace!

kubectl -n kube-system get pods

nERRv2n.png!web

正如你所看到的,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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK