一、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. OpenCascade极简环境搭建(QT环境)

    现在网上关于OpenCascade(OCCT)的环境搭建几乎都是下载源码,然后实时MinGW来编译生成源码.但是,官方有提供Windows平台下的可执行文件,如果想快速了解OpenCascade(OC ...

  2. LGP7915题解

    奇怪的乱搞做法(? 首先我们枚举序列的每一个位置,从这个位置劈开,假设这个位置是 \(i\),那么按照题意模拟,我们能够构造一个最终序列有 \(i\) 个 L 和 \(n-i\) 个 R 的符合题意的 ...

  3. django主要文件介绍及django请求生命流程图

    -mysite文件夹 --mysite文件夹 --setting.py 配置文件 --urls.py 路由和视图函数对应关系(路由层) --wsgi.py wsgiref模块 --manage.py ...

  4. vue3-插槽作用域的使用

    当我们在父组件定义了一个数组, data() { return { name: ["lkx", "msx"] } } 想把它传到子组件处理后 props: { ...

  5. 堆优化Dijkstra算法

    但是,我们会发现刚刚讲的朴素Dijkstra算法(高情商:朴素 : 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间: 所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新 ...

  6. 痞子衡嵌入式:MCUBootUtility v3.5发布,支持串行NOR的ECC及双程序启动

    -- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v3.4.0)发布过去半年了,这一次痞子衡为大家带来了版本升级 v3.5.0,这个版本主要有几个非常重要的更新需要跟大家 ...

  7. Hibernate学习笔记(一)-->数据库单表操作

    Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibern ...

  8. Ubuntu系统中防火墙的使用和开放端口

    目录 Ubuntu系统 防火墙的使用和开放端口 1.安装防火墙 2.查看防火墙状态 3.开启.重启.关闭防火墙 4.Ubuntu添加开放.关闭端口 5.开放规定协议的端口 6.关闭指定协议端口 7.开 ...

  9. PLSQL导出Oracle表结构

    tools->export tables 是导出表结构还有数据 tools->export user objects是导出表结构   可以用tools->export tables ...

  10. 实践丨SpringBoot整合Mybatis-Plus项目存在Mapper时报错

    摘要:在SpringBoot运行测试Mybatis-Plus测试的时候报错的问题分析与修复 本文分享自华为云社区<SpringBoot整合MybatisPlus项目存在Mapper时运行报错的问 ...