在很多情况下,你可能会发现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. springMVC --@RequestParam注解(后台控制器获取参数)

    在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取. 1.获 ...

  2. Linux Pam后门总结拓展

    首发先知社区: https://xz.aliyun.com/t/7902 前言 渐渐发现pam后门在实战中存在种植繁琐.隐蔽性不强等缺点,这里记录下学习pam后门相关知识和pam后门的拓展改进. 0x ...

  3. springmvc-实现增删改查

    30. 尚硅谷_佟刚_SpringMVC_RESTRUL_CRUD_显示所有员工信息.avi现在需要使用restful风格实现增删改查,需要将post风格的请求转换成PUT 请求和DELETE 请求 ...

  4. 如何修改linux下tomcat指定的jdk路径

    一般情况下,一台服务器只跑一个项目,只需根据所需项目,将linux默认的jdk环境配置好即可.某些时候一台服务器上会跑多个项目,而且各个项目需要的JDK版本各不相同,或者为了使业务独立开来,需要指定T ...

  5. Laravel 中自定义 手机号和身份证号验证

    首先在 Providers\AppServiceProvider.php 文件中自定义 手机号和身份证号验证 // AppServiceProvider.php 文件 <?php namespa ...

  6. VC单选按钮控件(Radio Button)用法(转)

    先为对话框加上2个radio button,分别是Radio1和Radio2. 问题1:如何让Radio1或者Radio2默认选上?如何知道哪个被选上了? 关键是选上,“默认”只要放在OnInitDi ...

  7. SpringBoot开发案例之异常处理并邮件通知

    前言 在项目开发中,对于异常处理我们通常有多种处理方式,比如:控制层手动捕获异常,拦截器统一处理异常.今天跟大家分享一种注解的方式,统一拦截异常并处理. 异常处理 在spring 3.2中,新增了@R ...

  8. centos7设置系统时间与网络时间同步

    Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC). 系统时间:指当前Linux Kernel中的时间. 硬件时间:主板上有电池供电的时 ...

  9. Oracle收集对表收集统计信息导致全表扫描直接路径读?

    direct path read深入解析 前言 最近碰到一件很奇葩的事情,因为某条SQL执行缓慢,原因是走了笛卡尔(两组大数据结果集),而且笛卡尔还是NL的一个部分,要循环31M次. 很容易发现是统计 ...

  10. NOIp ( on line ) 提高组 2020 总结

    T1 : 序列 题意: 一共有T组数据,每组数据有两个长度为n的序列a,b,m个操作,问a序列是否可以转换成b,是输出YES,否的话输出NO. m个操作分别为ti,xi,yi,若t为1,则x和y上的数 ...