k8s pod故障分类与排查
一、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故障分类与排查的更多相关文章
- Kubernetes Pod故障归类与排查方法
Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...
- K8S线上集群排查,实测排查Node节点NotReady异常状态
一,文章简述 大家好,本篇是个人的第 2 篇文章.是关于在之前项目中,k8s 线上集群中 Node 节点状态变成 NotReady 状态,导致整个 Node 节点中容器停止服务后的问题排查. 文章中所 ...
- k8s pod的4种网络模式最佳实战(externalIPs )
[k8s]k8s pod的4种网络模式最佳实战(externalIPs ) hostPort相当于docker run -p 8081:8080,不用创建svc,因此端口只在容器运行的vm ...
- k8s pod节点调度及k8s资源优化
一.k8s pod 在节点间调度控制 k8s起pod时,会通过调度器scheduler选择某个节点完成调度,选择在某个节点上完成pod创建.当需要在指定pod运行在某个节点上时,可以通过以下几种方式: ...
- kubectl cp 从k8s pod 中 拷贝 文件到本地
请查看官方的说明 kubectl cp --help 官方说使用cp , pod里需要有tar命令 从k8s pod 中 拷贝 文件到本地 这是我使用的命令 kubectl exec redis-6c ...
- k8s pod访问不通外网问题排查
环境概况 自建k8s集群,主机操作系统ubuntu16.04,k8s版本v1.14, 集群网络方案calico-3.3.6. worker节点数50+,均为GPU物理服务器,服务器类型异构,如Nvid ...
- 一次“不负责任”的 K8s 网络故障排查经验分享
作者 | 骆冰利 来源 | Erda 公众号 某天晚上,客户碰到了这样的问题:K8s 集群一直扩容失败,所有节点都无法正常加入集群.在经过多番折腾无解后,客户将问题反馈到我们这里,希望得到技术支持 ...
- K8S Pod Pending 故障原因及解决方案
文章转载自:https://mp.weixin.qq.com/s/SBpnxLfMq4Ubsvg5WH89lA
- k8s Pod 扩容和缩容
在生产环境下,在面临服务需要扩容的场景时,可以使用Deployment/RC的Scale机制来实现.Kubernetes支持对Pod的手动扩容和自动扩容. 手动扩容缩容 通过执行扩容命令,对某个dep ...
随机推荐
- Linux指令_入门基础
一.基础指令语法 1.ls指令: 用法1:#ls 含义:列出当前工作目录下的所有文件/文件夹的名称. 用法2:#ls 路径 含义:列出指定路径下的所有文件/文件夹的名称 用法3:#ls 选项 路径 含 ...
- logging 日志配用
第一步,创建一个logger: 第二步,创建一个handler,用于写入日志文件: 第三步,再创建一个handler,用于输出到控制台: 第四步,定义handler的输出格式: 第五步,将logger ...
- 前端知识之BOM和DOM
前端基础之BOM和DOM windw对象 指浏览器窗口,所有的浏览器都支持window对象 常用的window方法 window.innerHeight 浏览器窗口的内部高度 window.inner ...
- 浅析 c++ bitset 的用法
浅析 c++ bitset 的用法 总述 C++的 \(bitset\) 位于 <bitset> 头文件中,这是一种类似于数组的数据结构,每个位置存储 \(0\ or\ 1\) ,并且每个 ...
- 通过DP总线实现S7-300/400与SINAMICS S120 通讯
一.DP总线通讯功能概述 S7-300/400与SINAMICS S120 之间通过DP总线可进行周期性及非周期性数据通讯. 使用标准S7功能块SFC14/SFC15,S7-300/400PLC通过P ...
- bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)
bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥) bzoj Luogu 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...
- buu equation wp
知识点考察:jsfuck解码.js逆向.z3处理大量数据 源码分析 源码 根据提示猜测有jsfuck Jsfuck编码共六个字符分别为[.].+.!.(.) 观察上述不难发现l['jsfuck']=' ...
- 序列化与反序列化、def的介绍与快速使用、cbv源码分析、APIView与request对象分析
今日内容概要 序列化与反序列化 def介绍和快速使用 cbv源码流程分析 drf之APIView和Request对象分析 内容详细 1.序列化和反序列化 # api接口开发 最核心最常见的一个过程就是 ...
- Spring Boot 多模块项目创建与配置 (转)
转载:https://www.cnblogs.com/MaxElephant/p/8205234.html 最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多 ...
- iHTML 的 form 提交之前如何验证数值文本框的内容全部为数字
<input type="text" id="d1" onblur=" chkNumber (this)"/> <scri ...