【问题标题】:Kubernetes multi-container pod termination processKubernetes 多容器 pod 终止流程
【发布时间】:2021-12-28 14:42:26
【问题描述】:

我在 k8s 中有一个多容器 pod,我们称它们为 A 和 B。停止 pod 时,A 必须在 B 之前停止,因为 A 需要 B 直到它关闭。

为此,我在 A 上注册了一个 preStop 挂钩,以便 A 可以在 B 之前优雅地停止。

但是我不确定这是一个好的解决方案,因为我错过了一些在 k8s 文档中找不到的信息:

当多容器 pod 停止时会发生什么?

  • 调用所有容器preStop钩子,然后当它们全部完成时,所有容器接收SIGTERM,或者
  • 并行地,如果所有容器都有preStop,如果没有,则直接接收SIGTERM

在第二种情况下,preStop 对我想做的事情毫无用处,因为 B 会被立即杀死。

【问题讨论】:

  • 应该不是反过来吧,B应该有一个preStop hook来检查a是否宕机?

标签: kubernetes kubernetes-pod termination


【解决方案1】:

通常,在 pod 删除期间,容器运行时会向每个容器中的主进程发送一个 TERM 信号。

根据the official documentation

  1. 如果 Pod 的容器之一定义了 preStop hook, kubelet 在容器内运行该钩子。

  2. kubelet 触发容器运行时向每个容器内的进程 1 发送 TERM 信号。

这个数字可能会混淆 - 看起来只有在 preStop 钩子完成后才会发送 TERM 信号。 我决定通过下面的一个简单示例来检查工作顺序。

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  restartPolicy: Never
  volumes:
  - name: config
    configMap:
      name: nginx-conf
  containers:
  - name: container-1
    image: nginx
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sleep","15"]
    ports:
    - containerPort: 80
  - name: container-2
    image: nginx
    ports:
    - containerPort: 81
    volumeMounts:
    - name: config
      mountPath: /etc/nginx/conf.d
  terminationGracePeriodSeconds: 30

Container-1 有 preStop 钩子延迟 15 秒。 我已连接到两个容器以查看 pod 删除期间的行为。

结果

pod 删除后:

  1. Container-1 在连接丢失之前工作了 15 秒

  2. Container-2 立即失去连接

结论

如果容器有preStop 钩子,它会尝试执行它。只有这样它才会收到 TERM 信号。 本案的主要条件:宽限期未到期。

如果容器没有 preStop 钩子,它会在删除 pod 的命令后立即收到 TERM 信号。因此,它不会等待preStop 钩子将为另一个容器执行。

注意: Pod 中的容器在不同时间以任意顺序接收 TERM 信号。如果关闭的顺序 重要的是,考虑使用preStop 挂钩进行同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 2017-07-09
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多