如何解决Kubernetes中部署故障及技巧

在很多情况下,你可能会发现kubernetes中的应用程序没有正确地部署,或者没有正常地工作。今天这篇文章就提供了如何去快速解决这类故障以及一些技巧。
在阅读了这篇文章之后,你还将深入了解kubernetes的内部机制,另外,我还将与大家分享一些关于自己操作kubernetes的一些非常有用的技巧。
那么,我们开始吧!
首先,pod失败的原因一般有两个:
kubernetes资源配置中的错误,例如在部署(deployment)和服务(service)里。
代码中的问题。
在第一种情况下,容器一般不会启动。在后一个实例中,应用程序代码在容器启动后失败。我们将系统地处理每种情况。
在本练习中,我们会使用kubectl来实现与kubernetes的交互。
技巧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 deploymentkubectl 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)”列显示了重启的次数。 在这种情况下,你应该会看到一些重启,因为当错误发生时,kubernetes会反复尝试启动pod。
如果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:显示集群级别的事件
kubernetes在它管理的资源状态发生变化(正常、警告等)时触发对应的事件。这能帮助我们了解背后到底发生了什么。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
额外的技巧
这是我最喜欢的技巧!熟练掌握各种命令会使你更有信心在游走在kubernetes集群中。
首先,输入kubectl可以列出所有kubectl的命令。
接下来,尝试用下面的命令来执行grep调试命令。
kubectl | grep -i -a 10 debugging
列出可以在kubernetes上运行的一些基本命令。
kubectl | grep -i -a 5 basic
接下来,列出可操作的kubernetes资源。
kubectl api-resources
现在可以自己搞一些命令了!你可以选择一个命令(get、describe、explain)并选取一个资源然后运行它!例如,get nodes。所以,再试试别的吧!
虽然有些组合可能并没什么意义,但除了这一点,整个command系统是相当直观和一致的;你可以轻松地编写命令并进行各种探索。
只是千万要小心,不要删除或修改你不希望碰到的对象。
列出kubernetes命名空间(namespace):
kubectl get ns
这样,你可以使用特定的命令来更深入地研究相应的选项或示例。
kubectl get --help
# see k8s system pods in ‘kube-system’ namespace!
kubectl -n kube-system get pods
正如你所看到的,kubernetes的命令系统非常容易理解,简单地测试这些命令能让我们学到很多东西。
结论
有了这些,我希望你能在kubernetes集群中找到并修复kubernetes资源和代码中的错误。同时我打算接下来再介绍一下kubernetes服务(service)和网络的调试。
如果你已经走了这么远,我想感谢你对学习kubernetes的坚持和奉献。请在下面留下你的评论,如果你有什么想法,或者有什么想谈论的话题,也请告诉我。
最后,如果你想在kubernetes中部署一个真实的应用程序,请阅读我的上一篇文章。然后可以使用命令和故障排除工具对其进行修补。

谷歌旗下的可穿戴设备制造商Fitbit,推出了一款名叫Flow的呼吸机
海尔BCD-190W双温双控电冰箱控制电路剖析
使用光纤光缆和传感器来监测和追踪海冰
箱式变压器的保护类型和要求有哪些
【高速数字化仪应用案例系列】虹科Spectrum在航空航天领域的应用
如何解决Kubernetes中部署故障及技巧
红苹果iPhone7姨妈红:你说的红是什么红
投影幕布的检测程序和相应标准
认证模块轻松向现有的MCU添加低功耗蓝牙
高通总裁表示中国将可能拥有全球最大的5G网络
TI推出新一代蓝牙低功耗应用BLE-Stack 1.2
全球新能源汽车扁线电机产业大会于9月21日在上海盛大召开!
Mouser备货Analog Devices公司最高频率PLL
移动电话中的白色LED闪光灯
智能电网是能源互联网的主要技术模式
E51.D7S系列闭环控制器的特点及应用
国内外巨头抢滩云业务 市场份额争夺战一触即发
传MTK明年砍掉Helio X系列产品线
2018中国半导体材料及设备产业发展大会:梳理发展方向,推介创新理念
残酷春天里的中国科技(二):中国科技如何自救?和全球供应链一起“仰卧起坐”