一、Pod故障状态基本有几种
Pod状态 处于Pending
Pod状态 处于Waiting
Pod状态 处于ContainerCreating
Pod状态 ImagePullBackOff
Pod状态 CrashLoopBackOff
Pod状态 Error
Pod状态 Terminating
Pod状态 Unknown
Pod状态 OOM killed
pod状态 running

二、Pod故障我们可以用下面一些手段查看

1、命令
kubectl get pod <pod-name> -o yaml  # 查看Pod yaml配置是否正确
kubectl describe pod <pod-name>      # 查看Pod详细事件信息
kubectl logs <pod-name> [-c <container-name>]  # 查看容器日志
cat /var/log/messages
journalctl -u kube-scheduler
journalctl -xefu kubelet
journalctl -u kube-apiserver
journalctl -u kubelet |tail
journalctl -xe

2、样例

例1:kubectl describe pod kubernetes-dashboard-849cd79b75-s2snt --namespace kube-system
例2:kubectl logs -f pods/monitoring-influxdb-fc8f8d5cd-dbs7d -n kube-system
例3:kubectl logs --tail 200 -f kube-apiserver -n kube-system |more
例4;kubectl logs --tail 200 -f cc -n default

3、用登录到宿主机docker查看日志,因为有些问题比较复杂
docker logs 439b1f6989e3 (容器id)

四、总结我们环境下遇到的Pod故障问题与排查方法

1)、Pod 一直处于 Pending 状态
Pending 状态 意味着Pod已经开始创建,API对象已经被创建并保存在Etcd当中。
但是,这个Pod里有些容器因为某种原因而不能被顺利创建。
1、node节点资源不满足包括CPU、内存、GPU。例如:
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "2"
memory: 4Gi
2、node 标签设置错误,不能满足调度要求。即pod yaml里面的nodeSelector设置成了其他的比如: a:b
    但是node节点,没有设置该标签。
3、被调度的node节点处于not ready ,从而不被调度(rancher查看是非常方便的,包括当前cpu,内存等占用,建议安装rancher管理)
4、可以通过kubectl describe pod podname 查看具体原因

2)、Pod 一直处于Waiting或ContainerCreating状态

首先还是通过kubectl describe pod 命令查看当前Pod的事件。可能的原因有:
1、镜像拉取失败,比如远程镜像库项目地址配置错误导致拉取不到该镜像、
或node节点上没有安装包、镜像密钥配置错误、镜像太大导致拉取超时等
2、CNI网络插件错误,一般需要检查CNI网络插件的配置,比如:无法配置Pod网络、无法分配IP地址(tunl0,我们这里用的是ipip模式)。

3、容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数
4、Failed create pod sandbox,查看kubelet日志,原因可能是磁盘坏道(input/output error)。

3)、Pod 一直处于ImagePullBackOff状态

通常是镜像名称配置错误或者私有镜像的密钥配置错误导致。这种情况可以使用docker pull来验证镜像是否可以正常拉取。

如果私有镜像密钥配置错误或没有配置,按下面检查:

1、查询docker-registry类型的Secret
# 这个实际就是docker镜像仓库的密钥,我们开发打包项目,上传到我们的docker仓库
pod yaml 中会配置,只有创建该镜像的账户,根据该账户我们才可以生成对应的sercet

$ kubectl get secrets my-secret -o yaml | grep 'dockerconfigjson:' | awk '{print $NF}' | base64 -d
2、创建docker-registry类型的Secret
# 首先创建一个 docker-registry 类型的 Secret,样例
$ kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

DOCKER_REGISTRY_SERVER 是docker仓库地址,我们用的habor搭建的
--docker-username是账户名
 --docker-password 是账户密码
--docker-email 是在habor账户开通时设置的邮箱也一定要正确
# 然后在 Deployment 或sts 中引用这个 Secret
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: my-secret
4)Pod 一直处于CrashLoopBackOff状态

此状态说明容器曾经启动了,但又异常退出。这个时候我们用 pod exec 命令是进入不了pod,因为已经销毁。

通过命令 kubectl logs 和 kubectl logs --previous 可以发下一些容器退出的原因,比如:容器进程退出、健康检查失败退出; 还而已到容器内执行命令(kubectl exec cassandra - cat /var.log/cassandra/system.log)来进一步查看退出原因;如果还是没有线索,那就需要SSH登录该Pod所在的Node上,查看Kubelet或者Docker的日志进一步排查。

5)Pod 处于 Error 状态

通常处于Error状态说明Pod启动过程中发生了错误。常见的原因:依赖的ConfigMap、Secret或PV等不存在;请求的资源超过了管理员设置的限制,比如超过了LimitRange等;违反集群的安全策略,比如违反了PodSecurityPolicy等;容器无法操作集群内的资源,比如开启RDAC后,需要为ServiceAccount配置角色绑定。

6)Pod 处于Terminating或Unknown状态

从v1.5开始,Kubernetes不会因为Node失联而删除其上正在运行的Pod,而是将其标记为Terminating 或 Unknown 状态。想要删除这些状态的Pod有四种方法:

1、从集群中删除Node。使用公有云时,kube-controller-manager会在VM删除后自动删除对应的Node。而在物理机部署的集群中,需要管理员手动删除Node(kubectl delete node)。

2、Node恢复正常。kubelet会重新跟kube-apiserver通信确认这些Pod的期待状态,进而再决定删除或者继续运行这些Pod。用户强制删除,用户可以执行(kubectl delete pods pod-name --grace-period=0 --force)强制删除Pod。 
     特别是sts 管理的Pod,强制删除容易导致数据丢失等问题。

3、Pod行为异常,这里所说的行为异常是指Pod没有按预期的行为执行,比如没有运行podSpec 里面设置的命令行参数。这一般是podSpec yaml文件内容有误,可以尝试使用 --validate 参数重建容器,比如(kubectl delete pod mypod 和 kubectl create --validate -f mypod.yaml);也可以查看创建后的podSpec是否是对的,比如(kubectl get pod mypod -o yaml);修改静态Pod的Manifest后未自动重建,kubelet 使用inotify 机制检测 /etc/kubernetes/manifests 目录(可通过 kubelet 的 -pod-manifest-path 选项指定)中静态Pod的变化,并在文件发生变化后重新创建相应的 Pod。但有时也会发现修改静态Pod的 Manifest后未自动创建新 Pod的情景,此时已过简单的修复方法是重启 Kubelet。
   4、可以使用scale动态扩容,缩容的方式进行销毁。

Unknown 这个异常状态意味着Pod的状态不能持续地被 kubelet汇报给 kube-apiserver,这很有可能是主从节点间的通信出现了问题
7)内存不足  OOM killed
  yaml 里面的内存申请不正确,会出现这种状态。
8) pod处于running状态
   虽然处于running 但是却使用不了,这种情况我们遇到是,pod访问不了外网或者其他pod,主要是由于node节点机器的calico ipip模式出问题了。有的node就没有启动tunl0,
   有的机器,启动了以后没有分配ip等诸多问题。

k8s pod故障分类与排查的更多相关文章

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

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

  2. K8S线上集群排查,实测排查Node节点NotReady异常状态

    一,文章简述 大家好,本篇是个人的第 2 篇文章.是关于在之前项目中,k8s 线上集群中 Node 节点状态变成 NotReady 状态,导致整个 Node 节点中容器停止服务后的问题排查. 文章中所 ...

  3. k8s pod的4种网络模式最佳实战(externalIPs )

    [k8s]k8s pod的4种网络模式最佳实战(externalIPs )       hostPort相当于docker run -p 8081:8080,不用创建svc,因此端口只在容器运行的vm ...

  4. k8s pod节点调度及k8s资源优化

    一.k8s pod 在节点间调度控制 k8s起pod时,会通过调度器scheduler选择某个节点完成调度,选择在某个节点上完成pod创建.当需要在指定pod运行在某个节点上时,可以通过以下几种方式: ...

  5. kubectl cp 从k8s pod 中 拷贝 文件到本地

    请查看官方的说明 kubectl cp --help 官方说使用cp , pod里需要有tar命令 从k8s pod 中 拷贝 文件到本地 这是我使用的命令 kubectl exec redis-6c ...

  6. k8s pod访问不通外网问题排查

    环境概况 自建k8s集群,主机操作系统ubuntu16.04,k8s版本v1.14, 集群网络方案calico-3.3.6. worker节点数50+,均为GPU物理服务器,服务器类型异构,如Nvid ...

  7. 一次“不负责任”的 K8s 网络故障排查经验分享

    作者 | 骆冰利 来源 | Erda 公众号 ​ 某天晚上,客户碰到了这样的问题:K8s 集群一直扩容失败,所有节点都无法正常加入集群.在经过多番折腾无解后,客户将问题反馈到我们这里,希望得到技术支持 ...

  8. K8S Pod Pending 故障原因及解决方案

    文章转载自:https://mp.weixin.qq.com/s/SBpnxLfMq4Ubsvg5WH89lA

  9. k8s Pod 扩容和缩容

    在生产环境下,在面临服务需要扩容的场景时,可以使用Deployment/RC的Scale机制来实现.Kubernetes支持对Pod的手动扩容和自动扩容. 手动扩容缩容 通过执行扩容命令,对某个dep ...

随机推荐

  1. LGP4590题解

    这题好像比较牛逼,好像又不是怎么样. 考虑两个串是如何计算 LCS 的. 这还不简单?\(dp[n][m]=\max(\max(dp[n-1][m],dp[n][m-1]),[s[n]==t[m]]d ...

  2. CSS性能优化的几个技巧

    前言 随着互联网发展至今,对于网站来说,性能显的越来越重要了,CSS作为页面渲染和内容展现的重要环节,影响着用户对整个网站的第一体验.所以,我们需要重视与CSS相关的性能优化. 项目开发初期我们可能因 ...

  3. 3、Lambda表达式

    Lambda表达式 Lambda表达式(lambda expression),是一种匿名函数,即没有函数名的函数. Lambda表达式不仅在C#中使用,在Java.Phtyon.C++ 中都有使用. ...

  4. 安卓开发学习-app结构学习

    开发软件:Android Studio 全局分析 gradle与idea是AS自动生成的文件 buid是编译时生成的文件 gradle里面包含gradle wrapper配置文件 gitignore是 ...

  5. C语言对Mysql函数操作

    数据类型 MYSQL MYSQL结构代表一个数据库连接句柄,包含有关服务器的连接状态的信息,几乎所有函数都是用到它 typedef struct st_mysql { NET net; /* Comm ...

  6. JSP的常用指令有哪些?

    <% @ page %>  <% @ include %> <% @ taglib %>

  7. spring cloud 和dubbo区别?

    1.服务调用方式 dubbo是RPC springcloud Rest Api2.注册中心,dubbo 是zookeeper springcloud是eureka,也可以是zookeeper3.服务网 ...

  8. OpenSSL实现了5种信息摘要算法有哪些?

    OpenSSL实现了5种信息摘要算法,分别是MD2.MD5.MDC2.SHA(SHA1)和RIPEMD.SHA算法事实上包括了SHA和SHA1两种信息摘要算法.此外,OpenSSL还实现了DSS标准中 ...

  9. Could not find the main class

    最近开发了一个短信报警的服务,打成程序包之后,再本地windows启动(start.bat)没有问题,但是发到生产环境,报如下错: Could not find the main class 莫名其妙 ...

  10. Oracle入门基础(十一)一一PL/SQL基本语法

    1.打印Hello World declare --说明部分 begin --程序 dbms_output.put_line('Hello World'); end; 2.引用型变量 查询并打印783 ...