2021-07-23

k8s常见问题排查思路

一、pod生命周期

1.pod的四种状态

  • pending:APIserver已经创建该server,但pod内有一个或多个容器的镜像还未创建,可能在下载中。
  • running:Pod内所有的容器已创建,所有容器都是运行状态
  • failed:Pod内所有容器都已退出,其中至少有一个容器退出失败
  • unknown:由于某种原因无法获取Pod的状态,比如 网络不通。

二、k8s排错之pod异常

1.查看pod的配置是否正确

[root@k8s-master ~]# kubectl get pod <pod-name> -o yaml 

2.查看pod的事件

[root@k8s-master ~]# kubectl describe pod <pod-name> 

3.查看容器的日志

[root@k8s-master ~]# kubectl logs <pod-name> [-c <container-name>]
kubectl logs test-pod -c c1-name/  -- /bin/bash    /-c c1-name -- /bin/bash  / -c c2-name --  /bin/bash
  • 这些事件和日志通常都会有助于排查 Pod 发生的问题。

三、常见问题

1.pod一直处于pending状态

Pending 说明 Pod 还没有调度到某个 Node 上面。查看到当前 Pod 的事件,进而判断为什么没有调度。可能的原因包括
1.资源不足,集群内所有的 Node 都不满足该 Pod 请求的 CPU、内存、GPU 等资源
2.HostPort 已被占用,通常推荐使用 Service 对外开放服务端口

2.Pod 一直处于 Waiting 或 ContainerCreating 状态

查看到当前 Pod 的事件。可能的原因包括
1.镜像拉取失败
2.配置了错误镜像
3.Kubelet 无法访问镜像(国内环境访问 gcr.io 需要特殊处理)
4.私有镜像的密钥配置错误
5.镜像太大,拉取超时(可以适当调整 kubelet 的 --image-pull-progress-deadline 和 --runtime-request-timeout 选项)
CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如
1.无法配置 Pod 网络
2.无法分配ip地址
* 容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数

3.Pod 处于 ImagePullBackOff 状态

* 这通常是镜像名称配置错误或者私有镜像的密钥配置错误导致。这种情况可以使用 docker pull <image> 来验证镜像是否可以正常拉取。
* 如果是私有镜像,需要首先创建一个 docker-registry 类型的 Secret
 
 [root@k8s-master ~]# kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
 * 然后在容器中引用这个 Secret
 spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: my-secret

4.Pod 一直处于 CrashLoopBackOff 状态

  • CrashLoopBackOff 状态说明容器曾经启动了,但又异常退出了。此时可以先查看一下容器的日志
[root@k8s-master ~]# kubectl logs <pod-name>
[root@k8s-master ~]# kubectl logs --previous <pod-name>
  • 此时如果还未发现线索,还可以到容器内执行命令来进一步查看退出原因
[root@k8s-master ~]# kubectl exec cassandra -- cat /var/log/cassandra/system.log
  • 如果还是没有线索,那就需要 SSH 登录该 Pod 所在的 Node 上,查看 Kubelet 或者 Docker 的日志进一步排查了
# 查询 Node
[root@k8s-master ~]# kubectl get pod <pod-name> -o wide

5.Pod 处于 Error 状态

  • 依赖的 ConfigMap、Secret 或者 PV 等不存在
  • 请求的资源超过了管理员设置的限制,比如超过了 LimitRange 等
  • 违反集群的安全策略,比如违反了 PodSecurityPolicy 等
  • 容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定

6.Pod 处于 Terminating 或 Unknown 状态

  • 从 v1.5 开始,Kubernetes 不会因为 Node 失联而删除其上正在运行的 Pod,而是将其标记为 Terminating 或 Unknown 状态。想要删除这些状态的 Pod 有三种方法:
1.从集群中删除该 Node。使用公有云时,kube-controller-manager 会在 VM 删除后自动删除对应的 Node。而在物理机部署的集群中,需要管理员手动删除 Node(如 kubectl delete node <node-name>。
2.Node 恢复正常。Kubelet 会重新跟 kube-apiserver 通信确认这些 Pod 的期待状态,进而再决定删除或者继续运行这些 Pod。
3.用户强制删除。用户可以执行 kubectl delete pods <pod> --grace-period=0 --force 强制删除 Pod。除非明确知道 Pod 的确处于停止状态(比如 Node 所在 VM 或物理机已经关机),否则不建议使用该方法。特别是 StatefulSet 管理的 Pod,强制删除容易导致脑裂或者数据丢失等问题。
  1. Pod 行为异常
  • 这里所说的行为异常是指 Pod 没有按预期的行为执行,比如没有运行 podSpec 里面设置的命令行参数。这一般是 podSpec yaml 文件内容有误,可以尝试使用 --validate 参数重建容器,比如
[root@k8s-master ~]# kubectl delete pod mypod
[root@k8s-master ~]# kubectl create --validate -f mypod.yaml
  • 也可以查看创建后的 podSpec 是否是对的,比如
[root@k8s-master ~]# kubectl get pod mypod -o yaml

8.修改静态 Pod 的 Manifest 后未自动重建

1. Kubelet 使用 inotify (监控文件系统) 机制检测 /etc/kubernetes/manifests 目录(可通过 Kubelet 的 --pod-manifest-path 选项指定)中静态 Pod 的变化,并在文件发生变化后重新创建相应的 Pod。但有时也会发生修改静态 Pod 的 Manifest 后未自动创建新 Pod 的情景,此时一个简单的修复方法是重启 Kubelet。
2.Inotify 可用于检测单个文件,也可以检测整个目录。当检测的对象是一个目录的时候,目录本身和目录里的内容都会成为检测的对象。此种机制的出现的目的是当内核空间发生某种事件之后,可以立即通知到用户空间。方便用户做出具体的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值