Kubernetes多容器Pod终止过程。

4
我有一个在k8s中的多容器pod,我们称之为A和B。在停止该pod时,A必须先于B停止,因为A需要B直到它关闭。
为了做到这一点,我在A上注册了一个preStop钩子,以便A可以在B之前优雅地停止。
但是我不确定这是否是一个好的解决方案,因为我错过了一些我在k8s文档中找不到的信息:
当一个多容器pod被停止时会发生什么?
  • 所有容器的preStop钩子都会被调用,然后当它们都结束时,所有容器都会收到SIGTERM信号,或者
  • 并行地,如果所有容器都有preStop,则它们都会接收到preStop,否则直接接收到SIGTERM
在第二种情况下,preStop对于我想要做的事情是无用的,因为B将立即被杀死。

难道不应该反过来吗?B 应该有一个 preStop 链接来检查 a 是否已经停止了吗? - Rakesh Gupta
1个回答

4
通常,在删除Pod时,容器运行时会向每个容器中的主进程发送TERM信号。
根据官方文档
  1. 如果Pod的其中一个容器定义了preStophook,kubelet将在容器内运行该钩子。

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

这种编号可能会让人困惑-看起来只有在完成preStop hook之后才会发送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

容器1有一个15秒延迟的preStop钩子。我已经连接到两个容器,以观察在删除pod期间的行为。

结果

在删除pod后:

  1. 容器1工作了15秒钟,然后失去了连接

  2. 容器2立即失去连接

结论

如果容器有一个preStop钩子,它将尝试执行它。只有在此之后它才会收到TERM信号。在这种情况下的主要条件是:优雅期限还没有过期。

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

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


所以我猜如果有依赖关系,最好的方法是在必须等待其他容器的容器上添加一个preStop,并在其中加入一个比其他容器的截止时间更长的简单休眠。 - Benjamin Barrois

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接