容器的生命周期
Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 总体上的阶段一样。你可以使用容器生命周期回调来在容器生命周期中的特定时间点触发事件。
一旦调度器将 Pod 分派给某个节点,kubelet
就通过容器运行时开始为 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 中容器的状态,你可以使用 kubectl describe pod
。 其输出中包含 Pod 中每个容器的状态。
容器生命周期回调/事件/钩子
类似于许多具有生命周期回调组件的编程语言框架,例如 Angular、Vue、Kubernetes 为容器提供了生命周期回调。回调使容器能够了解其管理生命周期中的事件,并在执行相应的生命周期回调时运行在处理程序中实现的代码。
有两个回调暴露给容器:
PostStart
:这个回调在容器被创建之后立即被执行。但是,不能保证回调会在容器入口点(ENTRYPOINT)之前执行。没有参数传递给处理程序。PreStop
:在容器因 API 请求或者管理事件(诸如存活态探针、启动探针失败、资源抢占、资源竞争等)而被终止之前,此回调会被调用。如果容器已经处于已终止或者已完成状态,则对 preStop 回调的调用将失败。在用来停止容器的 TERM 信号被发出之前,回调必须执行结束。Pod 的终止宽限周期在PreStop
回调被执行之前即开始计数,所以无论回调函数的执行结果如何,容器最终都会在 Pod 的终止宽限期内被终止。没有参数会被传递给处理程序。
示例 Pod
apiVersion: v1 kind: Pod metadata: name: lifecycle spec: containers: - name: nginx image: nginx:1.19 lifecycle: postStart: # 容器创建过程中执行 exec: command: ["/bin/sh","-c","echo postStart >> /start.txt"] preStop: # 容器终止之前执行 exec: command: ["/bin/sh","-c","echo postStop >> /stop.txt && sleep 5"] ports: - containerPort: 80