解决Kubernetes Pod故障的5个简单技巧
在很多情况下,你可能会发现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 deployment
.kubectl run web --image=ngin --replicas=
最后一行展示了镜像错误
果然,完全不存在的镜像“ngin”导致了ImagePullBackOff错误。使用正确的镜像名称“nginx”就能解决这个问题。
.kubectl run temp --image=nginx --replicas=
.
.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= 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 onlykubectl get events --field-selector type=Warning# events related to Nodeskubectl get events --field-selector involvedObject.kind=Node
额外的技巧
这是我最喜欢的技巧!熟练掌握各种命令会使你更有信心在游走在Kubernetes集群中。
首先,输入kubectl可以列出所有kubectl的命令。
接下来,尝试用下面的命令来执行grep调试命令。
.kubectl | grep -i -A debugging
列出可以在Kubernetes上运行的一些基本命令。
.kubectl | grep -i -A 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的命令系统非常容易理解,简单地测试这些命令能让我们学到很多东西。
最后给大家一个大福利,扫描添加,发送"阿里云",即可免费获得 整整172页的《阿里云内部超全K8s实战手册》
解决Kubernetes Pod故障的5个简单技巧的更多相关文章
- Kubernetes Pod故障归类与排查方法
Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...
- Kubernetes Deployment故障排除图解指南
个人K8s还在学习中,相关博客还没有写,准备学第二遍再开始学,发现这篇文章挺好,先转载一下. 原创: 白明的赞赏账户 下面是一个示意图,可帮助你调试Kubernetes Deployment(你可以 ...
- Kubernetes Pod 全面知识
Pod 是在 Kubernetes 中创建和管理的.最小的可部署的计算单元,是最重要的对象之一.一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络.存储等环境. 学习 Kubern ...
- k8s pod故障分类与排查
一.Pod故障状态基本有几种Pod状态 处于PendingPod状态 处于WaitingPod状态 处于ContainerCreatingPod状态 ImagePullBackOffPod状态 Cra ...
- 如何解决dns解析故障
在实际应用过程中可能会遇到DNS解析错误的问题,就是说当我们访问一个域名时无法完成将其解析到IP地址的工作,而直接输入网站IP却可以正常访问,这就是因为DNS解析出现故障造成的.这个现象发生的机率比较 ...
- Python Django撸个WebSSH操作Kubernetes Pod(下)- 终端窗口自适应Resize
追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整 ...
- k8s集群关机后,如何解决 kubernetes 重启起不来的问题
如何解决 kubernetes 重启后,启来不来的问题 登录自己的Kubernetes测试集群时发现集群好像没有启动成功 运行 kubectl get pods --all -A ,报错如下. 第一反 ...
- Kubernetes Pod 驱逐详解
原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...
- Kubernetes Pod 镜像拉取策略
Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...
随机推荐
- MySQL 视图 事务 索引 外连接
视图 1.定义 select 语句的结果集,是一张虚拟的表2.创建视图语句create view 视图名 as select语句3.查看视图show views;4.使用视图select * from ...
- Redis持久性——RDB和AOF
Redis持久性 Redis提供了不同的持久性选项: RDB持久性以指定的时间间隔执行数据集的时间点快照. AOF持久性记录服务器接收的每个写入操作,将在服务器启动时再次播放,重建原始数据集.使用与R ...
- ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)
Blazor支持渐进式应用开发也就是PWA.使用PWA模式可以使得web应用有原生应用般的体验. 什么是PWA PWA应用是指那些使用指定技术和标准模式来开发的web应用,这将同时赋予它们web应用和 ...
- Python实用笔记 (9)高级特性——列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, ...
- socket 建立网络连接,client && server
client代码: package socket; import java.io.IOException; import java.net.Socket; /** * 客户端_聊天室 * * @aut ...
- 修改CentOS7登录欢迎界面信息
vi /etc/issue 添加自己喜欢的内容,保存即可. 特殊字符的含义: \d 本地端时间的日期: \l 显示第几个终端机接口: \m 显示硬件的等级 (i386/i486/i586/i686.. ...
- 基于4G Cat.1的内网穿透实例分享
上一篇分享了:小熊派4G开发板初体验 这一篇继续BearPi-4G开发板实践:内网穿透实验. 基本TCP的socket通信测试 之前我们学习WiFi模块时,与PC进行TCP协议的socket通信测试我 ...
- 从零创建发布属于自己的composer包
原文地址:https://www.wjcms.net/archives/从零创建发布属于自己的composer包 今天给大家讲解一下如何从零创建发布属于自己的composer包. composer包用 ...
- (一)ansible 安装配置
CentOS 7.5 一,安装 yum -y install ansible 二,配置hosts文件 /etc/ansible/hosts s1 ansible_ssh_port= ansible_s ...
- 「STL中的常用函数 容器」
占个坑,下午在更 二分操作:lower_bound和upper_bound 存图/数列操作:vector容器 全排列:next_permutation和prev_permutation 字符串转数列: ...