Pod 什么时候被销毁?

When does a Pod get destroyed?

Pod 生命周期由数据平面中的 Kubelet 管理。

根据定义:如果 liveness 探测失败,kubelet 将杀死容器

Pod 只是一个带有专用网络命名空间和 IPC 命名空间的容器,带有一个沙箱容器。


比如说,如果 Pod 是单个应用程序容器 Pod,那么在活动失败时:

pod 确实是 Kubernetes 中最小的元素,但这并不意味着它实际上是没有容器的“空”。

为了生成一个 pod 以及附加更多容器所需的容器元素,使用 pause 图像创建了一个非常小的容器。 这用于分配一个 IP,然后用于 Pod。 之后启动为 pod 声明的初始容器或运行时容器。

如果lifeness探测失败,容器会重启。 pod 幸免于难。这甚至很重要:之后您可能想获取 crashed/restarted 容器的日志。如果 pod 被销毁并重新创建,这是不可能的。

kubelet 使用 liveness 探测器来了解何时重启容器(不是 整个 Pod)。如果 liveness 探测失败,kubelet 会杀死容器,然后容器可能会重新启动,但这取决于它的 restart policy.


我创建了一个简单示例来演示其工作原理。

首先,我创建了一个带有两个容器(webdb)的 app-1 Pod。 web 容器配置了 liveness 探测,总是失败,因为 /healthz 路径没有配置。

$ cat app-1.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: app-1
  name: app-1
spec:
  containers:
  - image: nginx
    name: web
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
  - image: postgres
    name: db
    env:
    - name: POSTGRES_PASSWORD
      value: example

应用上述清单并等待一段时间后,我们可以描述 app-1 Pod 以检查是否只有 web 容器已重启,db 容器 运行 不间断:
注意: 我只提供了来自 kubectl describe pod app-1 命令的重要信息,而不是整个输出。

$ kubectl apply -f app-1.yml
pod/app-1 created
    
$ kubectl describe pod app-1
    
Name:         app-1
...
Containers:
  web:
...
    Restart Count:  4   <--- Note that the "web" container was restarted 4 times
    Liveness:       http-get http://:8080/healthz delay=0s timeout=1s period=10s #success=1 #failure=3
...
  db:
...
    Restart Count:  0   <--- Note that the "db" container works fine
...
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
...
  Normal   Killing    78s (x2 over 108s)   kubelet            Container web failed liveness probe, will be restarted
...

我们可以连接到db容器看看是不是运行:
注意:即使重新启动 web容器,我们也可以使用db容器。

$ kubectl exec -it app-1 -c db -- bash
root@app-1:/#

相比之下,连接到web容器后,我们可以观察到liveness probe重启了这个容器:

$ kubectl exec -it app-1 -c web -- bash
root@app-1:/# command terminated with exit code 137