gpt4 book ai didi

Kubernetes多容器pod终止流程

转载 作者:行者123 更新时间:2023-12-05 03:34:57 25 4
gpt4 key购买 nike

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

为此,我在 A 上注册了一个 preStop Hook ,这样 A 就可以在 B 之前优雅地停止。

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

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

  • 调用所有容器 preStop Hook ,然后当它们遍布所有容器时,所有容器都会收到 SIGTERM,或者
  • 与此同时,如果所有容器都有一个preStop,如果没有,则直接接收SIGTERM

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

最佳答案

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

根据 the official documentation :

  1. If one of the Pod's containers has defined a preStop hook,the kubelet runs that hook inside of the container.

  2. The kubelet triggers the container runtime to send a TERM signal to process 1 inside each container.

这个数字可能会造成混淆 - 看起来只有 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

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

结果

删除 pod 后:

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

  2. Container-2 立即失去连接

结论

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

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

Note: The containers in the Pod receive the TERM signal at different times and in an arbitrary order. If the order of shutdownsmatters, consider using a preStop hook to synchronize.

关于Kubernetes多容器pod终止流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70007478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com