【K8S系列】Pod重启策略及重启可能原因

简介: 【K8S系列】Pod重启策略及重启可能原因

1 重启策略

1.1 Always

Pod中的容器,不管因为什么原因停止,都会自动重启。

该为默认策略,

没有定义重启策略时,默认的就是always

1.2  OnFailure

Pod中的容器,非正常停止/异常退出时,会自动重启容器,如果是正常停止,则不会

1.3 Nerver

Pod中容器不管以什么原因退出,都不会自动重启容器

1.4 yaml示例

其关键字为:restartPolicy

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-test
spec:
  restartPolicy: Always/OnFailure/Nerver # 重启策略,根据需求选择一种即可
  containers:
    - name: nginx-pod-test
      image: nginx

2 Pod常见异常状态

  • Pending状态
  • Waiting/ContainerCreating状态
  • CrashLoopBackOff状态
  • ImagePullBackOff状态
  • Error状态
  • 其他状态说明

2.1  Pending状态

Pending状态:

  1. 说明Pod的YAML文件已提交给Kubernetes
  2. API对象已经被创建并保存在Etcd当中

原因:这个Pod里有些容器因为某种原因而不能被顺利创建

可能原因:

  • 调度不成功
  1. 可以通过命令查看到当前Pod的事件,进而判断为什么没有调度。
kubectl describe pod {podname}
  • 资源不足
  1. 原因:集群内所有的Node都不满足该Pod请求的CPU、内存、GPU等资源
  2. 解决方法:增加资源配置/优化容器资源使用方式
  • HostPort 已被占用
  1. 解决方法:使用Service对外开放服务端口

2.2 Waiting/ContainerCreating状态

首先通过 命令查看当前Pod的事件

kubectl describe pod {podname}

可能的原因有:

  • 镜像拉取失败:比如镜像地址配置错误、拉取不了国外镜像源(gcr.io)、私有镜像密钥配置错误、镜像太大导致拉取超时 (可以适当调整kubelet的-image-pull-progress-deadline和-runtime-request-timeout选项)等。
  • CNI网络错误:检查CNI网络插件的配置,比如:无法配置Pod 网络、无法分配IP地址。
  • 容器无法启动:检查是否打包了正确的镜像或者是否配置了正确的容器参数
  • Failed create pod sandbox:查看kubelet日志,原因可能是磁盘坏道(input/output error)。

2.3 CrashLoopBackOff状态

处于CrashLoopBackOff状态

说明容器曾经启动了,但又异常退出

1.查看容器的日志,查看退出原因

kubectl logs {podname}
kubectl logs --previous {podname}

2.进入容器查看

kubectl exec {mypodname} -c {containername} -it -- bash

3.ssh登录Node查看

2.4 ImagePullBackOff状态

处于ImagePullBackOff状态

原因:是镜像名称配置错误或者私有镜像的密钥配置错误导致

2.5 Error状态

Pod处于Error状态,说明Pod启动过程中发生了错误。

2.6 其他状态说明

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

tips:

k8s中不支持重启Pod资源,只有删除重建!重建!

3.自动重启的可能原因:

  1. Xms超出了k8s分配
  2. docker容器的内存限制
  3. 出现OOMKilled事件

3.1  Xms超出了k8s分配

在没有给jvm指定内存大小的情况下,机器物理内存很大时,jvm默认占用的内存Xms超出了k8s分配给pod的内存导致pod内存溢出,从而k8s不断重启pod

或者运行过程中,jvm不断申请内存直到最大heap内存Xmx,Xmx超出了k8s分配给pod的内存,从而k8s自动重启pod。

解决方法在启动的脚本中设置jvm内存-Xms、-Xmx参数

例如:java -Xms1024m -Xmx1024m -jar test.jar

3.2 docker容器的内存限制

设置了docker容器的内存限制,制作的镜像未对JVM进行配置,

JVM 会默认设置堆栈的大小。

这样,当jvm占用内存超过docker容器限制时,就会出现container 被docker killed情况。

解决方法:一样是设置jvm内存-Xms、-Xmx参数

注意要小于docker容器的内存限制。

3.3 出现OOMKilled事件

pod运行过程中出现了OOMKilled事件

即pod运行过程内存需求持续增加,超过为pod设置的内存大小时,pod会被重启。

解决方法将pod的内存配置项的值修改大点

例如之前是1/2,可改为2/4


4 投票

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
509 25
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
480 12
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
296 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
存储 运维 Kubernetes
K8s业务迁移最佳实践: 灵活管理资源备份与调整策略,实现高效简便的应用恢复
在当今快速变化的云原生领域,Kubernetes(K8s)集群的运维面临着诸多挑战,其中灾备与业务迁移尤为关键。ACK备份中心支持丰富的资源调整策略,在数据恢复阶段即可自动适配目标集群环境,确保业务无缝重启。
|
应用服务中间件 调度 nginx
Kubernetes-项目中pod调度使用法则
前言kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。
2243 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
1635 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
本文讲的是Kubernetes之Pod调度【编者的话】Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
2999 0
|
6月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
574 1
|
6月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
390 89

推荐镜像

更多
下一篇
开通oss服务