Kubernetes的 pod 重启策略、Pod状态、生命周期

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Pod的重启策略

Pod的重启策略指的是当Pod中的容器终止退出后重启容器的策略。需要注意的是因为Docker容器的轻量级重启容器的做法实际上是直接重建容器所以容器中的数据将会丢失如有需要持久化的数据那么需要使用数据卷进行持久化设置。

重启策略是通过Pod定义中的.spec.restartPolicy 进行设置的目前支持以下3种策略。

  • Always当容器终止退出后总是重启容器默认策略。

  • OnFailure当容器终止异常退出退出码非0时才重启容器。

  • Never当容器终止退出时从不重启容器。

重启策略设置建议

因为重启策略默认的是Always这也是合理的因此在一般情况下重启策略不需要设置这里仅仅是作为知识点拿出来展示一下在实际使用中在大多数情况下都不需要进行重启策略配置

Pod状态

常见异常状态

1、Pod 一直处于Pending状态

Pending状态意味着Pod的YAML文件已经提交给KubernetesAPI对象已经被创建并保存在Etcd当中。但是这个Pod里有些容器因为某种原因而不能被顺利创建。比如调度不成功(可以通过kubectl describe pod命令查看到当前Pod的事件进而判断为什么没有调度)。

可能原因

资源不足集群内所有的Node都不满足该Pod请求的CPU、内存、GPU等资源); HostPort 已被占用(通常推荐使用Service对外开放服务端口)。

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

首先还是通过 kubectl describe pod命令查看当前Pod的事件。

可能的原因有:

1、镜像拉取失败比如镜像地址配置错误、拉取不了国外镜像源gcr.io)、私有镜像密钥配置错误、镜像太大导致拉取超时 (可以适当调整kubelet的-image-pull-progress-deadline和-runtime-request-timeout选项)等。

2、CNI网络错误一般需要检查CNI网络插件的配置比如:无法配置Pod 网络、无法分配IP地址。

3、容器无法启动需要检查是否打包了正确的镜像或者是否配置了正确的容器参数

4、Failed create pod sandbox查看kubelet日志原因可能是磁盘坏道input/output error)。

3、Pod 一直处于ImagePullBackOff状态

通常是镜像名称配置错误或者私有镜像的密钥配置错误导致。

4、Pod 一直处于CrashLoopBackOff状态

此状态说明容器曾经启动了但又异常退出。这时可以先查看一下容器的日志。

通过命令kubectl logs 和kubectl logs --previous 可以发下一些容器退出的原因

比如:容器进程退出、健康检查失败退出;此时如果还未发现线索还而已到容器内执行命令(kubectl exec cassandra - cat /var.log/cassandra/system.loq)来进一步查看退出原因;如果还是没有线索那就需要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。而在物理机部署的集群中需要管理员手动删除Nodekubectl delete node。

2、Node恢复正常。kubelet会重新跟kube-apiserver通信确认这些Pod的期待状态进而再决定删除或者继续运行这些Pod。用户强制删除用户可以执行kubectl delete pods pod-name --grace-period=0 --force强制删除Pod。除非明确知道Pod的确处于停止状态比如Node所在VM或物理机已经关机否则不建议使用该方法。特别是StatefulSet 管理的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。

Unknown 这个异常状态意味着Pod的状态不能持续地被 kubelet汇报给 kube-apiserver这很有可能是主从节点Master 和 Kubelet间的通信出现了问题。

其它pod状态

CrashLoopBackOff    #容器退出kubelet正在将它重启
InvalidImageName    #无法解析镜像名称
ImageInspectError   #无法校验镜像
ErrImageNeverPull   #策略禁止拉取镜像
ImagePullBackOff    #正在重试拉取
RegistryUnavailable #连接不到镜像中心
ErrImagePull        #通用的拉取镜像出错
CreateContainerConfigError #不能创建kubelet使用的容器配置
CreateContainerError #创建容器失败
m.internalLifecycle.PreStartContainer #执行hook报错
RunContainerError   #启动容器失败
PostStartHookError  #执行hook报错
ContainersNotInitialized #容器没有初始化完毕
ContainersNotReady   #容器没有准备完毕
ContainerCreating    #容器创建中
PodInitializingpod   #初始化中
DockerDaemonNotReady  #docker还没有完全启动
NetworkPluginNotReady #网络插件还没有完全启动
Evicte:     #pod被驱赶

pod 生命周期

Pod 遵循预定义的生命周期起始于 Pending 阶段 如果至少其中有一个主要容器正常启动则进入 Running之后取决于 Pod 中是否有容器以失败状态结束而进入 Succeeded 或者 Failed 阶段。
Pod 在其生命周期中只会被调度一次。 一旦 Pod 被调度分派到某个节点Pod 会一直在该节点运行直到 Pod 停止或者被终止。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s