【问题标题】:When does a Pod get destroyed?Pod 什么时候被销毁?
【发布时间】:2023-03-31 04:06:01
【问题描述】:

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

根据定义:如果 liveness probe 失败,kubelet 会杀死容器

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


说,如果 Pod 是单个应用容器 Pod,那么在 liveness 失败时:

  • kubelet 会杀死 Pod 吗?

  • kubelet 是否会(仅)杀死 Pod 中的容器?

【问题讨论】:

标签: kubernetes kubernetes-pod livenessprobe


【解决方案1】:

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

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

如果生命周期探测失败,则重新启动容器。豆荚幸免于难。这甚至很重要:您可能希望在之后获取崩溃/重新启动的容器的日志。如果 pod 被销毁并重新创建,这是不可能的。

【讨论】:

    【解决方案2】:

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


    我创建了一个简单的示例来演示它是如何工作的。

    首先,我创建了一个带有两个容器(webdb)的 app-1 Pod。 web 容器配置了一个 liveness probe,由于没有配置 /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
    

    应用上面的manifest并等待一段时间后,我们可以描述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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 2019-12-09
      相关资源
      最近更新 更多