当前位置: 首页 > news >正文

Kubernetes从零入门(四):工作负载--pod

Pod 的生命周期

Pod 遵循预定义的生命周期,起始于 Pending 阶段, 如果至少其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以失败状态结束而进入 Succeeded 或者 Failed 阶段。

和一个个独立的应用容器一样,Pod 也被认为是相对临时性(而不是长期存在)的实体。 Pod 会被创建、赋予一个唯一的 ID(UID), 并被调度到节点,并在终止(根据重启策略)或删除之前一直运行在该节点。 如果一个节点死掉了,调度到该节点的 Pod 也被计划在给定超时期限结束后删除。

Pod 生命期

在 Pod 运行期间,kubelet 能够重启容器以处理一些失效场景。 在 Pod 内部,Kubernetes 跟踪不同容器的状态并确定使 Pod 重新变得健康所需要采取的动作。

Pod 在其生命周期中只会被调度一次。 将 Pod 分配到特定节点的过程称为绑定,而选择使用哪个节点的过程称为调度。 一旦 Pod 被调度并绑定到某个节点,Kubernetes 会尝试在该节点上运行 Pod。 Pod 会在该节点上运行,直到 Pod 停止或者被终止; 如果 Kubernetes 无法在选定的节点上启动 Pod(例如,如果节点在 Pod 启动前崩溃), 那么特定的 Pod 将永远不会启动。

Pod 和故障恢复

如果 Pod 中的某个容器失败,Kubernetes 可能会尝试重启特定的容器。 

然而,Pod 也可能以集群无法恢复的方式失败,在这种情况下,Kubernetes 不会进一步尝试修复 Pod; 相反,Kubernetes 会删除 Pod 并依赖其他组件提供自动修复。

如果 Pod 被调度到某个节点而该节点之后失效, Pod 会被视为不健康,最终 Kubernetes 会删除 Pod。 Pod 无法在因节点资源耗尽或者节点维护而被驱逐期间继续存活。

Kubernetes 使用一种高级抽象来管理这些相对而言可随时丢弃的 Pod 实例, 称作控制器

任何给定的 Pod (由 UID 定义)从不会被“重新调度(rescheduled)”到不同的节点; 相反,这一 Pod 可以被一个新的、几乎完全相同的 Pod 替换掉。 如果你创建一个替换 Pod,它甚至可以拥有与旧 Pod 相同的名称(如 .metadata.name), 但替换 Pod 将具有与旧 Pod 不同的 .metadata.uid

Kubernetes 不保证现有 Pod 的替换 Pod 会被调度到与被替换的旧 Pod 相同的节点。

关联的生命期

如果某物声称其生命期与某 Pod 相同,例如存储卷, 这就意味着该对象在此 Pod (UID 亦相同)存在期间也一直存在。 如果 Pod 因为任何原因被删除,甚至某完全相同的替代 Pod 被创建时, 这个相关的对象(例如这里的卷)也会被删除并重建。

Pod 阶段

Pod 的 status 字段是一个 PodStatus 对象,其中包含一个 phase 字段。

Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简单宏观概述。 该阶段并不是对容器或 Pod 状态的综合汇总,也不是为了成为完整的状态机。

Pod 阶段的数量和含义是严格定义的。 除了本文档中列举的内容外,不应该再假定 Pod 有其他的 phase 值。

下面是 phase 可能的值:

取值描述
Pending(悬决)Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
Running(运行中)Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
Succeeded(成功)Pod 中的所有容器都已成功结束,并且不会再重启。
Failed(失败)Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止,且未被设置为自动重启。
Unknown(未知)因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

当 Pod 反复启动失败时,某些 kubectl 命令的 Status 字段中可能会出现 CrashLoopBackOff。 同样,当 Pod 被删除时,某些 kubectl 命令的 Status 字段中可能会出现 Terminating

确保不要将 Status(kubectl 用于用户直觉的显示字段)与 Pod 的 phase 混淆。 Pod 阶段(phase)是 Kubernetes 数据模型和 Pod API 的一个明确的部分。

容器状态

Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 总体上的阶段一样。 你可以使用容器生命周期回调 来在容器生命周期中的特定时间点触发事件。

一旦调度器将 Pod 分派给某个节点,kubelet 就通过容器运行时开始为 Pod 创建容器。容器的状态有三种:Waiting(等待)、Running(运行中)和 Terminated(已终止)。

要检查 Pod 中容器的状态,你可以使用 kubectl describe pod <pod 名称>。 其输出中包含 Pod 中每个容器的状态。

每种状态都有特定的含义:

Waiting(等待)

如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态。 处于 Waiting 状态的容器仍在运行它完成启动所需要的操作:例如, 从某个容器镜像仓库拉取容器镜像,或者向容器应用 Secret 数据等等。 当你使用 kubectl 来查询包含 Waiting 状态的容器的 Pod 时,你也会看到一个 Reason 字段,其中给出了容器处于等待状态的原因。

Running(运行中)

Running 状态表明容器正在执行状态并且没有问题发生。 如果配置了 postStart 回调,那么该回调已经执行且已完成。 如果你使用 kubectl 来查询包含 Running 状态的容器的 Pod 时, 你也会看到关于容器进入 Running 状态的信息。

Terminated(已终止)

处于 Terminated 状态的容器开始执行后,或者运行至正常结束或者因为某些原因失败。 如果你使用 kubectl 来查询包含 Terminated 状态的容器的 Pod 时, 你会看到容器进入此状态的原因、退出代码以及容器执行期间的起止时间。

如果容器配置了 preStop 回调,则该回调会在容器进入 Terminated 状态之前执行。

Pod 如何处理容器问题

Kubernetes 通过在 Pod spec 中定义的 restartPolicy 管理 Pod 内容器出现的失效。 该策略决定了 Kubernetes 如何对由于错误或其他原因而退出的容器做出反应,其顺序如下:

  1. 最初的崩溃:Kubernetes 尝试根据 Pod 的 restartPolicy 立即重新启动。
  2. 反复的崩溃:在最初的崩溃之后,Kubernetes 对于后续重新启动的容器采用指数级回退延迟机制, 如 restartPolicy 中所述。 这一机制可以防止快速、重复的重新启动尝试导致系统过载。
  3. CrashLoopBackOff 状态:这一状态表明,对于一个给定的、处于崩溃循环、反复失效并重启的容器, 回退延迟机制目前正在生效。
  4. 回退重置:如果容器成功运行了一定时间(如 10 分钟), Kubernetes 会重置回退延迟机制,将新的崩溃视为第一次崩溃。

在实际部署中,CrashLoopBackOff 是在描述或列出 Pod 时从 kubectl 命令输出的一种状况或事件。 当 Pod 中的容器无法正常启动,并反复进入尝试与失败的循环时就会出现。

换句话说,当容器进入崩溃循环时,Kubernetes 会应用容器重启策略 中提到的指数级回退延迟机制。这种机制可以防止有问题的容器因不断进行启动失败尝试而导致系统不堪重负。

下列问题可以导致 CrashLoopBackOff

  • 应用程序错误导致的容器退出。
  • 配置错误,如环境变量不正确或配置文件丢失。
  • 资源限制,容器可能没有足够的内存或 CPU 正常启动。
  • 如果应用程序没有在预期时间内启动服务,健康检查就会失败。
  • 容器的存活探针或者启动探针返回 失败 结果,如探针部分所述。

要调查 CrashLoopBackOff 问题的根本原因,用户可以:

  1. 检查日志:使用 kubectl logs <pod名称> 检查容器的日志。 这通常是诊断导致崩溃的问题的最直接方法。
  2. 检查事件:使用 kubectl describe pod <pod名称> 查看 Pod 的事件, 这可以提供有关配置或资源问题的提示。
  3. 审查配置:确保 Pod 配置正确无误,包括环境变量和挂载卷,并且所有必需的外部资源都可用。
  4. 检查资源限制: 确保容器被分配了足够的 CPU 和内存。有时,增加 Pod 定义中的资源可以解决问题。
  5. 调试应用程序:应用程序代码中可能存在错误或配置不当。 在本地或开发环境中运行此容器镜像有助于诊断应用程序的特定问题。

容器重启

Pod 级别容器重启策略

Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。

restartPolicy 应用于 Pod 中的应用容器和常规的 Init 容器。 Sidecar 容器忽略 Pod 级别的 restartPolicy 字段:在 Kubernetes 中,Sidecar 被定义为 initContainers 内的一个条目,其容器级别的 restartPolicy 被设置为 Always。 对于因错误而退出的 Init 容器,如果 Pod 级别 restartPolicy 为 OnFailure 或 Always, 则 kubelet 会重新启动 Init 容器。

  • Always:只要容器终止就自动重启容器。
  • OnFailure:只有在容器错误退出(退出状态非零)时才重新启动容器。
  • Never:不会自动重启已终止的容器。

当 kubelet 根据配置的重启策略处理容器重启时,仅适用于同一 Pod 内替换容器并在同一节点上运行的重启。当 Pod 中的容器退出时,kubelet 会以指数级回退延迟机制(10 秒、20 秒、40 秒......)重启容器, 上限为 300 秒(5 分钟)。一旦容器顺利执行了 10 分钟, kubelet 就会重置该容器的重启延迟计时器。 Sidecar 容器和 Pod 生命周期中解释了 init containers 在指定 restartpolicy 字段时的行为。

单个容器的重启策略与规则

如果你的集群启用了 ContainerRestartRules 特性门控,你可以针对单个容器指定 restartPolicy 和 restartPolicyRules 来覆盖 Pod 重启策略。容器重启策略和规则适用于 Pod 中的应用容器以及常规的 Init 容器。

Kubernetes 原生的边车容器将其容器级别的 restartPolicy 设置为 Always,并且不支持 restartPolicyRules

容器重启会遵循与前文所述的 Pod 重启策略相同的指数回退机制。支持的容器重启策略有:

  • Always:在任何原因的容器终止后都会自动重启容器。
  • OnFailure:仅当容器因错误退出(非零退出状态)时才重启。
  • Never:不自动重启已终止的容器。

此外,单个容器可以指定 restartPolicyRules。如果指定了 restartPolicyRules 字段, 则必须同时指定容器的 restartPolicyrestartPolicyRules 定义了一系列在容器退出时应用的规则。 每条规则由条件和动作组成。支持的条件是 exitCodes,用于将容器的退出码与给定值列表进行比较。 支持的动作是 Restart,表示容器将被重启。这些规则会按顺序进行评估。一旦匹配成功,立即执行相应动作。 如果没有任何规则的状况被匹配,Kubernetes 回退到容器配置的 restartPolicy

减少容器重启延迟

启用 Alpha 特性开关 ReduceDefaultCrashLoopBackOffDecay 后, 集群中容器启动重试的初始延迟将从 10 秒减少到 1 秒, 之后每次重启延迟时间按 2 倍指数增长,直到达到最大延迟 60 秒(之前为 300 秒,即 5 分钟)。

可配置的容器重启延迟

启用 Alpha 特性门控 KubeletCrashLoopBackOffMax 后, 你可以重新配置容器启动重试之间的最大延迟,默认值为 300 秒(5 分钟)。 此配置是针对每个节点使用 kubelet 配置进行设置的。 在你的 kubelet 配置中, 在 crashLoopBackOff 下设置 maxContainerRestartPeriod 字段,取值范围在 "1s" 到 "300s" 之间。 如上文容器重启策略所述,该节点上的延迟仍将从 10 秒开始,并在每次重启后以指数方式增加 2 倍,但现在其上限将被限制为你所配置的最大值。如果你配置的 maxContainerRestartPeriod 小于默认初始值 10 秒, 则初始延迟将被设置为配置的最大值。

Pod 状况

Pod 有一个 PodStatus 对象,其中包含一个 PodConditions 数组。Pod 可能通过也可能未通过其中的一些状况测试。 Kubelet 管理以下 PodCondition:

  • PodScheduled:Pod 已经被调度到某节点;
  • PodReadyToStartContainers:Pod 沙箱被成功创建并且配置了网络(Beta 特性,默认启用);
  • ContainersReady:Pod 中所有容器都已就绪;
  • Initialized:所有的 Init 容器都已成功完成;
  • Ready:Pod 可以为请求提供服务,并且应该被添加到对应服务的负载均衡池中。
  • DisruptionTarget:由于干扰(例如抢占、驱逐或垃圾回收),Pod 即将被终止。
  • PodResizePending:已请求对 Pod 进行调整大小,但尚无法应用。 详见 Pod 调整大小状态。
  • PodResizeInProgress:Pod 正在调整大小中。 详见 Pod 调整大小状态。

容器探针

检查机制

使用探针来检查容器有四种不同的方法。 每个探针都必须准确定义为这四种机制中的一种:

exec

在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。

grpc

使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC 健康检查。 如果响应的状态是 "SERVING",则认为诊断成功。

httpGet

对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

tcpSocket

对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。 如果远程系统(容器)在打开连接后立即将其关闭,这算作是健康的。

探测结果

每次探测都将获得以下三种结果之一:

Success(成功)

容器通过了诊断。

Failure(失败)

容器未通过诊断。

Unknown(未知)

诊断失败,因此不会采取任何行动。

探测类型

针对运行中的容器,kubelet 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应:

livenessProbe

指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success

readinessProbe

指示容器是否准备好为请求提供服务。如果就绪态探测失败, EndpointSlice 控制器将从与该 Pod 匹配的所有 Service 的 EndpointSlice 中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success

startupProbe

指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器, 而容器依其重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success

何时该使用存活态探针?

如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活态探针; kubelet 将根据 Pod 的 restartPolicy 自动执行修复操作。

如果你希望容器在探测失败时被杀死并重新启动,那么请指定一个存活态探针, 并指定 restartPolicy 为 "Always" 或 "OnFailure"。

何时该使用就绪态探针?

如果要仅在探测成功时才开始向 Pod 发送请求流量,请指定就绪态探针。 在这种情况下,就绪态探针可能与存活态探针相同,但是规约中的就绪态探针的存在意味着 Pod 将在启动阶段不接收任何数据,并且只有在探针探测成功后才开始接收数据。

如果你希望容器能够自行进入维护状态,也可以指定一个就绪态探针, 检查某个特定于就绪态的因此不同于存活态探测的端点。

如果你的应用程序对后端服务有严格的依赖性,你可以同时实现存活态和就绪态探针。 当应用程序本身是健康的,存活态探针检测通过后,就绪态探针会额外检查每个所需的后端服务是否可用。 这可以帮助你避免将流量导向只能返回错误信息的 Pod。

如果你的容器需要在启动期间加载大型数据、配置文件或执行迁移, 你可以使用启动探针。(这时,存活探针和就绪探针不会生效,留给容器足够的启动时间) 然而,如果你想区分已经失败的应用和仍在处理其启动数据的应用,你可能更倾向于使用就绪探针。(

  • 启动中应用​​:就绪探针失败但容器不重启

  • ​已失败应用​​:存活探针(Liveness Probe)失败导致容器重启

http://www.dtcms.com/a/492454.html

相关文章:

  • STM32F103C8T6蓝牙3.0模块 SPP透传 兼容HC-05/06从机 JDY-31的使用方法和代码驱动
  • 湖南网站搜索排名优化电话代还软件开发
  • 冠珠瓷砖X东方的东方,专访设计大师尼克、孙云、程绍正韬,探索东方人居范式设计美学
  • 小工厂ERP系统特点与选型建议
  • wordpress站群远程管理软件wordpress 去掉版权
  • javax.el.PropertyNotFoundException: Cannot resolve identifier ‘approved‘
  • 你好南京网站店铺起名网免费取名
  • 客户案例:Clearpath Robotics—让机器人技术更易于使用
  • 用Deepseek 实现一个基于web的扣图应用
  • 如何给网站续费typecho转WordPress插件
  • 网站建设申请报告上海网站设计公司
  • Spring Boot 入门:5分钟搭建Hello World
  • 网站建设频教程网站建设小程序开发公司
  • 个人网站建站指南重庆网站搭建公司
  • 小百姓这个网站谁做的怎么进入wordpress修改界面
  • 专业网站建设推广个人互联网创业项目
  • 机关网站建设工作总结常用来做网站的首页
  • 贵阳公司做网站做网站需要哪些技能
  • 高权重网站发外链枣强网址建站
  • FPGA实现CIC抽取滤波器
  • 深圳快速网站制作哪家快wordpress自适应设置宽度
  • qq临时会话网站搜索引擎网站推广法 怎么做
  • 国内可以做的国外兼职网站高端网站建设论坛
  • 网站广告策划wordpress如何使用
  • 网站品牌推广公司最新被百度收录的网站
  • 19. Linux free命令、awk命令
  • NewStarCTF2025-Week2-Pwn
  • 网站建设5个why分销网站怎么做
  • 永州做网站的公司河南省建设厅执业资格注册中心网站
  • 3-C++中类大小影响因素