【云原生|Kubernetes】06-Pod的生命周期和重启策略

news2024/10/7 11:26:21

【云原生|Kubernetes】06-Pod的生命周期和重启策略

文章目录

  • 【云原生|Kubernetes】06-Pod的生命周期和重启策略
    • Pod生命周期
      • 生命周期
      • Pod的状态
      • Pod子状态
    • Pod重启策略
    • 调试Pod
      • Pod 停滞在 Pending 状态
      • Pod 停滞在 Waiting 状态
      • Pod 处于 Crashing 或别的不健康状态
      • Pod 处于 Running 态但是没有正常工作

Pod生命周期

生命周期

我们一般把Pod从创建到结束删除这段时间范围叫做Pod的什么周期,它主要包括一下几个过程:

  • 对于所有的pod来说,首先是Pause容器的启动,Pause容器会为我们创建pod网络,volume,并随着pod一起运行;
  • 随后将是init容器启动,一个pod中可以定义多个初始化容器,他们必须是串行执行,只有当所有的初始化容器执行完后,对应的主容器才会启动;
    • init容器可有可无,可多可少
    • 一个Init C完成后,才能进行下一个Init C的构建。如果Init容器失败,k8s会不断重启该Pod,直到Init容器运行成功为止。然而,如果pod对应的restartPolicy为Never,那么它不会重启
  • 随后主容器启动,主容器Main C运行过程中,如果定义了start操作,首先进行一个start操作。然后如果定义了readiness就绪检测,就执行readiness就绪检测,readiness检测成功完成后,pod才会显示running,才会对外提供服务。如果定义了liveness存活检测,也会同时开始执行,如果liveness检测失败,kubelet杀死该Pod,然后根据重启策略restartPolicy决定是否对pod执行重启。若容器中不包含liveness探针,则kubelet认为该pod的liveness探针返回值永远是success。liveness存活检测是持续过程,一直持续到stop操作完成之后,Main C结束之前。
    • 可以使用 Pod 的配置文件定义主容器的启动操作。您可以使用 commandargs 字段来定义容器启动时要执行的命令或参数(即start操作)
  • 主容器Main C结束退出时,如果定义了stop操作,则先进行stop操作,stop操作完成以后才允许退出。
    • 可以使用 Pod 的配置文件定义主容器的停止操作。您可以使用 lifecycle 字段来定义容器在停止时要执行的命令或操作。(即stop操作)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ImxNsWud-1685096614937)(D:\学习\学习笔记\图片\116.png)]

Pod的状态

Pod在整个生命周期中被系统定义了各种状态,熟悉Pod的各种状态对于理解如何设置Pod的调度策略,重启策略和排查pod的启动异常事很有必要的。

状态值描述
PendingAPI Server已经创建该Pod,但是在Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程。当 Pod 创建后,它将进入 “Pending” 状态。在这个阶段中,Kubernetes 正在为该 Pod 分配节点和资源,并启动 Pod 中的容器。如果 Pod 中的容器无法启动,该 Pod 将一直停留在 “Pending” 状态。
Running当 Pod 中的容器成功启动并运行后,该 Pod 将进入 “Running” 状态。在这个阶段中,Pod 中的容器正在运行,并且可以通过 Kubernetes API 进行访问。
Successed当 Pod 中的所有容器成功完成其任务并退出时,该 Pod 将被标记为 “Succeeded” 状态。在这个阶段中,Pod 中的所有容器都已经完成了它们的任务,并且成功退出了。
Failed如果 Pod 中的容器由于错误或其他原因而意外终止,该 Pod 将被标记为 “Failed” 状态。在这个阶段中,Pod 中的容器已经停止运行,并且可能需要手动修复或重新创建。
Unkone果 Kubernetes 状态检查器无法确定 Pod 的状态,该 Pod 将被标记为 “Unknown” 状态。在这个阶段中,Kubernetes 可能无法连接到 Pod 中的容器,或者容器的状态可能无法被正确报告。

Pod子状态

状态值描述
ContainerCreatingPod 中的一个或多个容器正在创建,并且尚未完成启动。这种状态通常表示容器镜像在下载或容器正在启动过程中。
TerminatedPod 中的所有容器都已经终止或退出,并且没有任何重启。这种状态通常表示 Pod 已经完成了它的任务或者已经被删除。
Unschedulable该子状态表示 Pod 无法被调度到任何节点上。这可能是由于节点资源不足、Pod 的调度要求无法满足、网络或存储问题等原因导致的。
CrashLoopBackOff该子状态表示容器已经因为某种原因而崩溃,并且 Kubernetes 正在尝试重新启动容器。如果容器在启动后立即崩溃,则可能会导致 CrashLoopBackOff。
ImagePullBackOff该子状态表示容器镜像无法下载或者容器镜像在下载时发生了错误。这可能是由于镜像名称或标记错误、访问控制问题等原因导致的。
PodInitializing该子状态表示 Pod 已经被调度到节点上,并且正在启动 Init 容器。Init 容器是在其他容器启动之前运行的容器,它们用于执行初始化任务。
VolumePending该子状态表示 Pod 中的某些卷正在等待创建或者挂载到节点上。这可能是由于卷的创建或者挂载需要一些时间,或者卷的资源不足导致的。
ErrImagePull该子状态表示容器镜像无法下载或者容器镜像在下载时发生了错误。这可能是由于镜像名称或标记错误、访问控制问题等原因导致的。
ImageInspectError该子状态表示 Kubernetes 无法检查容器镜像。这可能是由于镜像名称或标记错误、访问控制问题等原因导致的。
CreateContainerConfigError子状态表示容器无法被创建,因为容器配置存在问题。这可能是由于容器的配置文件错误或者缺失、容器启动命令错误等原因导致的。
CreateContainerError该子状态表示容器无法被创建,因为容器运行时存在问题。这可能是由于容器镜像问题、容器与节点的通信问题等原因导致的。
PodScheduled该子状态表示 Pod 已经被 Kubernetes API 接受,并且已经被调度到了某个节点上
Initialized该子状态表示 Pod 中的所有 Init 容器都已经成功初始化并且已经退出。
Ready该子状态表示 Pod 中的所有容器都已经就绪,可以接收网络流量。
ContainersReady该子状态表示 Pod 中的所有容器都已经启动并且就绪,可以接收网络流量
Terminating该子状态表示 Pod 正在被删除,其中的容器正在被终止。

Pod重启策略

  • Pod的重启策略应用于Pod内的所有容器,并且仅在Pod所处的Node上由Kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置进行相应的操作。
  • Pod的重启策略包括Always,OnFailure,Never;默认值为Always
设置值描述
Always该重启策略表示容器将一直被重启,无论容器是如何终止的。如果容器崩溃、被删除或者因为其他原因被终止,Kubernetes 都将自动重启该容器。
OnFailure该重启策略表示容器只有在失败时才会被重启。如果容器崩溃、被删除或者因为其他原因被终止,Kubernetes 将自动重启该容器。如果容器自行退出或者正常终止,不会被重启。
Never该重启策略表示容器只会在 Pod 第一次启动时被启动。如果容器崩溃、被删除或者因为其他原因被终止,Kubernetes 不会自动重启该容器。
  • 不同资源类型对应的策略

Pod的重启策略与控制方式息息相关,当前可用于管理Pod的控制器 包括ReplicationController、Job、DaemonSet及直接通过kubelet管理(静 态Pod)。每种控制器对Pod的重启策略要求如下:

  • RC和DaemonSet:必须设置为Always,需要保证该容器持续运行。
  • Job:OnFailure或Never,确保容器执行完成后不再重启。
  • kubelet:在Pod失效时自动重启它,不论将RestartPolicy设置为 什么值,也不会对Pod进行健康检查。
  • 结合Pod的状态和重启策略,列出一些常见的状态转换场景:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrSHJIi6-1685096614938)(C:\Users\xhz\Pictures\116.png)]

调试Pod

调试 Pod 的第一步是查看 Pod 信息。用如下命令查看 Pod 的当前状态和最近的事件:

kubectl describe pods ${POD_NAME}

查看一下 Pod 中的容器所处的状态。这些容器的状态都是 Running 吗?最近有没有重启过?后面的调试都是要依靠 Pod 的状态的。

Pod 停滞在 Pending 状态

如果一个 Pod 停滞在 Pending 状态,表示 Pod 没有被调度到节点上。通常这是因为 某种类型的资源不足导致无法调度。 查看上面的 kubectl describe ... 命令的输出,其中应该显示了为什么没被调度的原因。 常见原因如下:

  • 资源不足: 你可能耗尽了集群上所有的 CPU 或内存。此时,你需要删除 Pod、调整资源请求或者为集群添加节点。 更多信息请参阅计算资源文档
  • 使用了 hostPort: 如果绑定 Pod 到 hostPort,那么能够运行该 Pod 的节点就有限了。 多数情况下,hostPort 是非必要的,而应该采用 Service 对象来暴露 Pod。 如果确实需要使用 hostPort,那么集群中节点的个数就是所能创建的 Pod 的数量上限。

Pod 停滞在 Waiting 状态

如果 Pod 停滞在 Waiting 状态,则表示 Pod 已经被调度到某工作节点,但是无法在该节点上运行。 同样,kubectl describe ... 命令的输出可能很有用。 Waiting 状态的最常见原因是拉取镜像失败。要检查的有三个方面:

  • 确保镜像名字拼写正确
  • 确保镜像已被推送到镜像仓库
  • 尝试手动是否能拉取镜像。例如,如果你在你的 PC 上使用 Docker,请运行 docker pull <镜像>

Pod 处于 Crashing 或别的不健康状态

一旦 Pod 被调度,就可以采用 调试运行中的 Pod 中的方法来进一步调试。

Pod 处于 Running 态但是没有正常工作

​ 如果 Pod 行为不符合预期,很可能 Pod 描述(例如你本地机器上的 mypod.yaml)中有问题, 并且该错误在创建 Pod 时被忽略掉,没有报错。 通常,Pod 的定义中节区嵌套关系错误、字段名字拼错的情况都会引起对应内容被忽略掉。 例如,如果你误将 command 写成 commnd,Pod 虽然可以创建, 但它不会执行你期望它执行的命令行。

可以做的第一件事是删除你的 Pod,并尝试带有 --validate 选项重新创建。 例如,运行 kubectl apply --validate -f mypod.yaml。 如果 command 被误拼成 commnd,你将会看到下面的错误信息:

I0805 10:43:25.129850   46757 schema.go:126] unknown field: commnd
I0805 10:43:25.129973   46757 schema.go:129] this may be a false alarm, see https://github.com/kubernetes/kubernetes/issues/6842
pods/mypod

​ 接下来就要检查的是 API 服务器上的 Pod 与你所期望创建的是否匹配 (例如,你原本使用本机上的一个 YAML 文件来创建 Pod)。 例如,运行 kubectl get pods/mypod -o yaml > mypod-on-apiserver.yaml, 之后手动比较 mypod.yaml 与从 API 服务器取回的 Pod 描述。 从 API 服务器处获得的 YAML 通常包含一些创建 Pod 所用的 YAML 中不存在的行,这是正常的。 不过,如果如果源文件中有些行在 API 服务器版本中不存在,则意味着 Pod 规约是有问题的。
l` 与从 API 服务器取回的 Pod 描述。 从 API 服务器处获得的 YAML 通常包含一些创建 Pod 所用的 YAML 中不存在的行,这是正常的。 不过,如果如果源文件中有些行在 API 服务器版本中不存在,则意味着 Pod 规约是有问题的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode热题100】打卡第4天:寻找两个正序数组的中位数

文章目录 寻找两个正序数组的中位数⛅前言&#x1f512;题目&#x1f511;题解 寻找两个正序数组的中位数 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的…

89.qt qml-WorkerScript多线程使用(无需C++代码)

由于我们自定义Table中需要实现排序,如下图所示: 考虑到如果数据量太大的情况,为了避免主线程阻塞,所以我们添加多线程排序功能,为了方便大家更好学习qml组件,所以学习WorkerScript实现多线程,无需C++ 1.描述 使用 WorkerScript 在新线程中运行操作。这对于在后台运行操…

微信小程序为什么不用HTML5、CSS,自己搞了个WXML、WXSS,很多框架用不了,好处一点不知道?

你在小程序中需要使用HTML5、 CSS来创建页面&#xff0c;那么你一定会碰到一些问题&#xff0c;比如&#xff1a; 1.小程序中的布局没有 JS支持&#xff0c;没有 JS渲染逻辑。 2.没有内置 css&#xff0c;都是靠 JS自己实现的。 3.很多框架不能使用&#xff0c;比如&#xf…

5年华为外包,外包究竟怎么样....

最近身边很多人进了外包或者被问到进到外包公司怎么样&#xff0c;感觉大家对外包公司不是很了解&#xff0c;也有一些误解&#xff0c;我们看看过来人怎么说。 5年外包时光 我曾是华为外包软件测试员工&#xff0c;就职于东莞松山湖&#xff0c;2017年9月12号入职&#xff0c…

ARM--计算机基础知识

目录 一.Linux层次结构 谈谈对嵌入式的理解 三层&#xff1a; 应用层 内核层 硬件层 二、计算机的进制 三、计算机的组成 1.输入设备 2.输出设备 3.存储器 4.运算器 5.控制器 总线 四、ARM存储模型 1. Cache:高速缓冲存储器 2. 主存储器&#xff1a;相当于内存 …

Day1:手写第一个Win32程序

学习重点&#xff1a; 1. 理解这个Win32窗口程序的实现逻辑 2. 学习Windows消息循环机制 3. 了解Windows的数据类型 4. 明白Winmain函数的作用 首先这个Winodws窗口程序在之后的学习并不需要进行手写&#xff0c;这里的重点是学习代码的逻辑&#xff0c;虽然有一些参数的含义尚…

vue3 集成kindeditor研究

kindeditor虽然老&#xff0c;但是稳定&#xff0c;最大的好外是word贴进去不变形&#xff0c;后端部分有安全隐患&#xff0c;我给去掉了&#xff0c;只保留了前端&#xff0c;集成jquery添加了跨域ajax上传功能。 用iframe引用实属无奈&#xff0c;因为尝试了好多次用ts封装都…

如何在华为OD机试中获得满分?Java实现【快速开租建站】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 当前IT部门支撑了子公司…

【2023年电工杯竞赛】B题 人工智能对大学生学习影响的评价 数学建模方案和python代码

1 题目 B题 人工智能对大学生学习影响的评价 人工智能简称AI&#xff0c;最初由麦卡锡、明斯基等科学家于1956年在美国达特茅斯学院开会研讨时提出。 2016年&#xff0c;人工智能AlphaGo 4:1战胜韩国围棋高手李世石&#xff0c;期后波士顿动力公司的人形机器人Atlas也展示了…

【PICO G2 4K】 + 【Unity2020.3.40】 :Android 发布设置

一、【设备】设置 设备开始USB调试模式&#xff0c;然后用usb线连接到电脑&#xff0c;识别后下拉框会显示该设备 二、【脚本调试】的Debug设置 如果要在PICO上读取脚本的Debug信息&#xff0c;则需要开启下图中选项&#xff0c;并配置adb工具读取log日志。 参考之前的blog…

学了两个多月软件测试,顺利过了试用期,拿到12K的我很满足了

先介绍一下&#xff0c;我是机械专业的&#xff0c;在一个大厂做售后工程师&#xff08;就是修东西的&#xff09;&#xff0c;做了几年没啥成绩&#xff0c;年龄越大&#xff0c;心里压力也越大&#xff0c;而且这种大型设备维修很容易出事故&#xff0c;就想着搞一门好点的技…

软件测试面试题【内附超详细面试宝典】

一般软件测试的面试分为三轮&#xff1a;笔试&#xff0c;HR面试&#xff0c;技术面试。 前两轮&#xff0c;根据不同企业&#xff0c;或有或无&#xff0c;但最后一个技术面试是企业了解你“行不行”的关键环节&#xff0c;每个企业都会有的。 在平时的学习、工作中一定要善…

《Zookeeper》从零开始学Zookeeper源码(一)之源码环境搭建

目录 源码环境搭建1. 下载源码2. 编译3. Eclipse启动服务端4. 启动客户端 源码环境搭建 1. 下载源码 下载地址&#xff1a; github 2. 编译 进入下载好的源码的根目录&#xff0c;因为下载依赖的时候需要apache的maven元数据&#xff0c;目前最高的版本为3.8.0-SNAPSHOT&am…

【分享】科大讯飞星火认知大模型(初体验)

前言&#xff1a; 哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 随着人工智能技术的迅猛发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;成为了热门话题。在众多NLP模型中&#xff0c;科大讯飞星火认知大模型成为了一个备受瞩目的新秀&#xff0c;今天我们来了解…

C++中string::npos 的使用

string::npos 的作用 string::npos 的意思:The constant is the largest representable value of type size_type. It is assuredly larger than max_size(); hence it serves as either a very large value or as a special code. 大致意思 是一个常量, 是size_type类型,是一…

策略模式-类型统计

文章目录 前言一、策略模式是什么&#xff1f;二、策略模式应用场景三、策略模式优点四、策略模式缺点五、场景案例&#xff1a;类型统计1.项目结构2.UML图解3.代码实现3.1 指标枚举3.2 请求体3.3 响应体3.4.分析统计指标策略3.5.接口3.6.扩展接口3.7.接口实现3.8.控制层 六、P…

2023年本科应届生,金融转行做数据分析有前景吗?

当然有前景的&#xff0c;尤其是数据分析本身的发展前景是无限的&#xff1b;而作为个人而言&#xff0c;只要你专业技能掌握得好&#xff0c;对于业务的理解分析能力过关&#xff0c;也是非常有发展前景的&#xff0c;尤其是在数据分析人才紧缺的阶段&#xff0c;众多行业领域…

直播预告:聚焦盗号 企业邮件安全的威胁分析与应对

根据Coremail邮件安全人工实验室数据监测&#xff0c;2023年Q1全国企业级用户遭受超过17.45亿次暴力破解&#xff0c;虽然无差别的暴力破解攻击从去年Q4开始有相当幅度的下降趋势&#xff0c;但在今年2-3月&#xff0c;全域暴力破解攻击次数又开始回升。 根据Coremail邮件安全专…

Go 存储系列:Hash存储引擎 Bitcask

Hash 存储引擎 在现代软件系统中&#xff0c;存储和检索数据是一个非常重要的任务。随着数据量的不断增长&#xff0c;如何高效地存储和检索数据变得越来越重要。Hash 存储引擎是一种常见的存储引擎&#xff0c;它可以快速地存储和检索数据。 在本文中&#xff0c;我们将介绍…

深入篇【C++】类与对象:友元函数与友元类

深入篇【C】类与对象&#xff1a;友元函数与友元类 ①.提出问题&#xff1a;重载operator<<②.解决问题&#xff1a;友元Ⅰ.友元函数【特点】 Ⅱ.友元类【特点】 ③.总结问题 ①.提出问题&#xff1a;重载operator<< 如果我们尝试去重载运算符operator<<,你…