容器服务常见故障处理(持续更新)

容器服务常见故障处理(持续更新),第1张

容器服务常见故障处理(持续更新)

容器服务常见故障处理
      • 一、pod状态异常查看方法
          • 1.查看Pod状态
          • 2.常见Pod状态
          • 3.输出Pod的yaml文件
          • 4.查看Pod详细信息
          • 5.查看Pod里对应容器的日志
      • 二、Pod几种异常状态问题分析
          • 1.详细解释Pod常见异常状态
      • 三、故障排查案例
          • 1.镜像拉取失败案例分析
          • 2.Pid占用导致docker无法启动

一、pod状态异常查看方法 1.查看Pod状态
#使用--all-namespaces查看所有命名空间下的pod
kubectl get pod -n  -o wide

2.常见Pod状态 状态解释Running运行中Pending等待被调度Waiting等待启动CrashLoopBackOff容器退出,kubelet 正在将它重启Error启动过程中发生错误Unknown所在节点失联或其它未知异常Evicted容器被驱逐Terminating正在被销毁ContainerCreating容器正在被创建ImageInspectError无法校验镜像InvalidImageName无法解析镜像名称ErrImageNeverPull策略禁止拉取镜像ErrImagePull通用的拉取镜像出错CreateContainerConfigError不能创建 kubelet 使用的容器配置CreateContainerError创建容器失败RunContainerError启动容器失败 3.输出Pod的yaml文件
# -o可以指定文件输出格式如yaml、josn等
kubectl get pod  -n  -o yam
#修改yaml文件可用edit
kubectl edit <控制器类型> pod  -n  -o yaml

4.查看Pod详细信息
kubectl describe  pod  -n 

5.查看Pod里对应容器的日志
#使用logs -f参数可以实时跟踪日志
kubectl logs    -c  -n 

二、Pod几种异常状态问题分析 1.详细解释Pod常见异常状态
1.pending状态
Pending是挂起状态: 表示创建的Pod找不到可以运行它的物理节点, 不能调度到相应的节点上运行,我门可以从两个层面分析问题:

物理层面:
查看节点资源使用情况: 如free -m查看内存、 top查看CPU使用率、 df – h查看磁盘使用情况, 这样就可以快速定位节点资源情况, 判断是不是节点有问题
查看节点污点: kubectl describe nodes master1(控制节点名字),如果节点定义了污点, 那么Pod不能容忍污点, 就会导致调度失败, 如下: Taints: node-role.kubernetes.io/master:NoSchedule 这个看到的是控制节点的污点, 表示不允许Pod调度(如果Pod定义容忍度, 则可以实现调度)

HostPort被占用
pod本身分析:
在定义pod时, 如果指定了nodeName是不存在的, 那也会调度失败
在定义Pod时, 如果定义的资源请求比较大, 导致物理节点资源不够也是不会调度的

2.ImagePullBackOff状态
拉取镜像时间长导致超时
配置的镜像有错误: 如镜像名字不存在等
配置的镜像无法访问: 如网络限制无法访问hub上的镜像
配置的私有镜像仓库参数错误: 如imagePullSecret没有配置或者配置错误
dockerfile打包的镜像不可用

3.CrashLoopBackOff状态
容器内应用一直在崩溃,健康检查失败
yaml文件中对pod的一些字段配置有误
k8s集群的部署有问题

4.Error/Terminating/Unknow状态

Error:依赖的ConfigMap、 Secret、 PV、 StorageClass等不存在;
请求的资源超过了管理员设置的限制, 比如超过了limits等;
无法 *** 作集群内的资源, 比如开启RBAC后, 需要为ServiceAccount配置权限。
违反集群的安全策略,比如违反了 PodSecurityPolicy 等

Terminating:pod未被正确回收
Unknow:kubelet未启动 kubelet节点与apiserver通信异常

5.Waiting /ContainerCreating/Evicted
Waiting /ContainerCreating:
镜像拉取失败,比如配置了镜像错误、Kubelet 无法访问镜像、私有镜像的密钥配置错误、镜像太大,拉取超时等
CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如无法配置 Pod 、无法分配 IP 地址
容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数
Evicted:多见于系统内存或硬盘资源不足
三、故障排查案例 1.镜像拉取失败案例分析

问题现象:济南节点coredns镜像拉取失败

排查思路:
Pod imagepullbackoff常见情况
拉取镜像时间长导致超时
配置的镜像有错误: 如镜像名字不存在等
配置的镜像无法访问: 如网络限制无法访问hub上的镜像
配置的私有镜像仓库参数错误: 如imagePullSecret没有配置或者配置错误
dockerfile打包的镜像不可用

详细步骤:查看docker日志去对应节点查看你详细信息


解决方案
Telent 仓库ip :80 不通
镜像仓库策略问题,复制本地正常镜像到故障机器,重新reload下,恢复正常。

2.Pid占用导致docker无法启动

通过查看节点信息可以看到node状态处于Notready导致caclico异常。

#查看节点详细信息
kubectl get node -o wide

#查看calico的网卡信息
calicoctl node status

#在线下载calicoctl的方法
Curl方法:
curl -O https://github.com/projectcalico/calicoctl/releases/download/v3.5.4/calicoctl

Wget方法:
wget https://github.com/projectcalico/calicoctl/releases/download/v3.5.4/calicoctl -O /usr/bin/calicoctl


通过journalctl -u kubelet命令查看kubelet日志发现kubelet启动失败。这里尝试重启还是失败。那么我们就需要看下docker的状态的了。

#通过时间去查找当天的日志信息
journalctl -u <服务名> -S '2021-12-29'

#实时跟踪产生的日志
journalctl -xefu <服务名> 


这里我们查看了docker状态,发现是failed,尝试systemctl start docker直接退出。

这个时候需要我们看一下docker的日志。

journalctl -u docker -f

我这里没有看到docker日志,所以那就看下service文件有没有配置错误的参数。(如果docker有日志,就查看docker的报错信息。)

确定service文件没错之后,我们用启动命令debug一下。不加参数启动成功。看来问题是出现在参数部分。

/usr/bin/dockerd


因为之前的docker服务退出异常,pid还在被占用。备份将这个pid移走。再次启动服务即可。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5681763.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存