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

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

那么,我们开始吧!

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

  1. Kubernetes资源配置中的错误,例如在部署(Deployment)和服务(Service)里。
  2. 代码中的问题。

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

在本练习中,我们会使用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个简单技巧的更多相关文章

  1. Kubernetes Pod故障归类与排查方法

    Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...

  2. Kubernetes Deployment故障排除图解指南

     个人K8s还在学习中,相关博客还没有写,准备学第二遍再开始学,发现这篇文章挺好,先转载一下. 原创: 白明的赞赏账户 下面是一个示意图,可帮助你调试Kubernetes Deployment(你可以 ...

  3. Kubernetes Pod 全面知识

    Pod 是在 Kubernetes 中创建和管理的.最小的可部署的计算单元,是最重要的对象之一.一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络.存储等环境. 学习 Kubern ...

  4. k8s pod故障分类与排查

    一.Pod故障状态基本有几种Pod状态 处于PendingPod状态 处于WaitingPod状态 处于ContainerCreatingPod状态 ImagePullBackOffPod状态 Cra ...

  5. 如何解决dns解析故障

    在实际应用过程中可能会遇到DNS解析错误的问题,就是说当我们访问一个域名时无法完成将其解析到IP地址的工作,而直接输入网站IP却可以正常访问,这就是因为DNS解析出现故障造成的.这个现象发生的机率比较 ...

  6. Python Django撸个WebSSH操作Kubernetes Pod(下)- 终端窗口自适应Resize

    追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整 ...

  7. k8s集群关机后,如何解决 kubernetes 重启起不来的问题

    如何解决 kubernetes 重启后,启来不来的问题 登录自己的Kubernetes测试集群时发现集群好像没有启动成功 运行 kubectl get pods --all -A ,报错如下. 第一反 ...

  8. Kubernetes Pod 驱逐详解

    原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...

  9. Kubernetes Pod 镜像拉取策略

    Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...

随机推荐

  1. Linux下9种优秀的代码比对工具推荐

    大家好,我是良许. 在我们编写代码的时候,我们经常需要知道两个文件之间,或者同一个文件不同版本之间有什么差异性.在 Windows 下有个很强大的工具叫作 BeyondCompare ,那在 Linu ...

  2. TCP协议粘包问题详解

    TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...

  3. object detection api调参详解(兼SSD算法参数详解)

    一.引言 使用谷歌提供的object detection api图像识别框架,我们可以很方便地重新训练一个预训练模型,用于自己的具体业务.以我所使用的ssd_mobilenet_v1预训练模型为例,训 ...

  4. 解决SELinux阻止Nginx访问服务

    在使用 yum 安装 nginx 后可能会出现配置完成后却无法访问的问题,查看 audit.log 会发现类似于以下的错误信息 出现此问题的原因是 SELinux 基于最小权限原则默认拦截了 Ngin ...

  5. C#由转换二进制所引起的思考,了解下?

    前言 最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题. 二进制转换问题 假设现在我们有一个int类型的数据,它 ...

  6. python数据结构与算法(一)

    1.序列中的N个元素赋值给变量 data = [1,2,3,"string!",["python","php"]] num_1,num_2, ...

  7. Linux必须要掌握的命令

    Linux必须要掌握的命令 文件目录操作命令 ls 命令格式:ls [选项] [目录名] 命令功能:列出目标目录中所有的子目录和文件 常用参数:-a,-l,-R, 例1:列出/home/peidach ...

  8. PHP用PHPExcel导出有多个工作表的Excel表格(thinkPHP3.2.3)

    直接上代码: //导出excel public function excel() { //引入相关文件 import("Org.Util.PHPExcel"); import(&q ...

  9. redis.cluster/memcached.cluster/wmware esxi

    1. 安装配置redis的cluster 集群 redis 集群高可用 实验环境 192.168.198.131 openvpn-server #42-Ubuntu SMP Mon Jun 8 14: ...

  10. Mybatis架构相关的知识

    如上所示,这是一个简单的Mybaits执行流程. 我们其实可以看到,一直到第三步(Sqlsession)那么一步,这都是我们的程序里需要创建的.而之后的步骤才是底层完成的任务. 这里就有了一个引申的概 ...