在很多情况下,你可能会发现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. Java架构师如何学习?

    引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭",同时互联网技术又日新月异,很多工程师都疲 ...

  2. Dubbo面试专题

    Dubbo面试专题 1. 什么是dubbo Dubbo是阿里巴巴SOA服务化治理方案的核心框架,是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 2.  ...

  3. cookie,session,jwt,token,oauth2联系和区别

    为啥有这么多的东西? 由于互联网在刚开始设计的时候是展现静态网页为主,没有现在这么多的交互和互动,所以被设计为了无状态,随用随走的简单模式.随着互联网的发展,各种具有和用户交互功能的网站出现,要求用户 ...

  4. 测试同学动手搭个简易web开发项目

    技术栈 node.js, vue.js, axios, python, django, orm, restful api, djangorestframework, mysql, nginx, jen ...

  5. activiti学习笔记二

    上一篇文章大概讲了下什么是流程引擎,为什么我们要用流程引擎,他的基本原理是啥,以及怎么进行基本的使用,这篇文章我们再讲下其他的一些使用. 删除流程部署 package activiti02; impo ...

  6. Python实用笔记 (21)面向对象编程——获取对象信息

    当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> ...

  7. Scrapy框架简介及小项目应用

    今天来总结一下Scrapy框架的用法.scrapy的架构如下: Engine  :引擎,处理整个系统的数据流处理.触发事务,是整个框架的核心. Items :项目,它定义了爬取结果的数据结构,爬取的数 ...

  8. MFC 添加C++类,别的类不通过C++类的定义的对象就可以直接调用C++类里面的成员函数;

    MFC 添加C++类,不用定义C++类的对象,别的类不通过C++类的定义的对象就可以直接调用C++类里面的成员函数: 1先在mfc程序中添加普通类CProdata,然后删除头文件Prodata.h里面 ...

  9. 报错Connection refused: connect

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_34266804/article/d ...

  10. 使用SpringBoot构建REST服务-什么是REST服务

    前言: 本文按照Spring官网构建REST服务的步骤测试,可以得到结论: 到底什么样的风格才是RESTful风格呢? 1,约束请求命令如下: GET,获取资源.例如:/employees表示获取列表 ...