Kubernetes Pod Hook

本文介绍了Kubernetes Pod的Hook机制,包括PostStart和PreStop钩子,用于实现Pod的优雅停止。PostStart钩子在容器启动后执行,PreStop钩子在容器终止前执行,用于资源部署、环境准备和应用优雅关闭。文中还通过实例演示了如何配置和使用这两个钩子,并讨论了Pod终止过程和可能遇到的问题。

Kubernetes Pod Hook

原文:https://i4t.com/4424.html
image_1dpi1lkurv0t15bq1vnut5h1k1l13.png-8.7kB


首先我们先简单的分析一下"优雅的停止Pod"

优雅停止(Graceful shutdown)这个说法来自于操作系统,比如我们windows关机系统首先会退出软件然后一步步到达关机,而相对的就是硬终止(Hard shutdown),简单的理解就是直接拔电源

到了微服务中,网关会把流量分配给每个Pod节点上,比如我们上线更新Pod的时候

  • 如果我们直接将Pod杀死,那这部分流量就无法得到正确处理,会影响部分用户,通常来说网关或者注册中心会将我们的服务保持一个心跳,过了心跳超时之后会自动摘除我们的服务,但是有一个问题就是超时时间可能是30秒也可能是60秒,虽然不会影响我们的系统,但是会产生用户轻微抖动。
  • 如果我们在停止前执行一条命令,通知网关或者注册中心这台主机进行下线,那么注册中心就会标记这台主机已经下线,不进行流量转发,用户就不会有任何影响,这就是优雅停止,将滚动更新影响最小化

Pod Hook

Pod Hook是由kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。我们可以同时为Pod中的所有容器都配置hook

在k8s中,理想的状态是pod优雅释放,并产生新的Pod。但是并不是每一个Pod都会这么顺利

  • Pod卡死,处理不了优雅退出的命令或者操作
  • 优雅退出的逻辑有BUG,陷入死循环
  • 代码问题,导致执行的命令没有效果
Kubernetes 中的 Pod 是系统中最小的部署单元,其生命周期会经历多个状态(Phase)和更详细的容器级别状态(Container Status)。以下是对 Kubernetes Pod 所有可能状态的详细说明: ### Pod 的生命周期状态(Phase) Pod 的状态(Phase)描述了其在整个生命周期中的宏观运行情况,主要包括以下几种: - **Pending**:Pod 已被 Kubernetes 系统接受,但其包含的容器尚未全部创建。这通常表示 Pod 正在调度或镜像正在拉取中。 - **Running**:Pod 已被调度到某个节点上,并且所有容器都已被创建。至少有一个容器正在运行或处于重启、启动状态。 - **Succeeded**:Pod 中的所有容器都已成功终止并不会再重启。这通常适用于完成任务后退出的 Job 类型工作负载。 - **Failed**:Pod 中至少有一个容器以非正常状态终止。这可能是因为容器退出码非零或被系统强制终止。 - **Unknown**:由于某些原因(如节点失联),Pod 的状态无法被获取,此时其状态为 Unknown。 ### 容器级别的状态(Container Status) 除了 Pod 的整体 Phase 外,每个容器的状态也提供了更详细的运行信息: - **Waiting**:表示容器尚未准备好启动。可能的原因包括: - `CrashLoopBackOff`:容器退出,kubelet 正在尝试重启。 - `ImagePullBackOff`:正在重试拉取镜像。 - `ErrImagePull`:拉取镜像失败。 - `InvalidImageName`:无法解析镜像名称。 - `ImageInspectError`:无法校验镜像。 - `CreateContainerConfigError`:无法创建 kubelet 使用的容器配置。 - `CreateContainerError`:创建容器失败。 - `RunContainerError`:启动容器失败。 - `PreStartHookError`:执行 preStart hook 报错。 - `PostStartHookError`:执行 postStart hook 报错。 - **Running**:表示容器正在正常运行。 - **Terminated**:表示容器已经终止。可能的原因包括: - `Completed`:容器正常退出,任务完成。 - `Error`:容器因错误退出。 - `OOMKilled`:容器因内存不足被杀死。 - `ContainerCannotRun`:容器无法运行。 ### 特定节点与系统级别的状态 在某些情况下,Pod 的状态可能受到节点或系统层面的影响: - **Evicted**:当节点资源不足(如内存或磁盘压力)时,Kubernetes 可能会驱逐该节点上的部分 Pod。 - **NetworkPluginNotReady**:网络插件未准备好,导致 Pod 无法正常通信。 - **DockerDaemonNotReady**:Docker 守护进程未就绪,导致容器无法启动。 - **Terminating**:Pod 正在被终止,尚未完全停止。 ### 初始化容器状态 对于包含初始化容器(Init Containers)的 Pod,还可能出现以下状态: - **PodInitializing**:Pod 正在初始化阶段。 - **ContainersNotInitialized**:初始化容器尚未完成。 - **ContainersNotReady**:容器尚未准备好(如探针未通过)。 - **ContainerCreating**:容器正在创建中。 这些状态可以帮助运维人员和开发者更好地理解 Pod 的运行状况,并进行故障排查。 ### 示例:查看 Pod 状态 可以通过以下命令查看 Pod 的状态信息: ```bash kubectl describe pod <pod-name> ``` 输出中将包含 Pod 的 Phase 和每个容器的状态信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值