Kubernetes 中的 PreStop 钩子永远不会被执行

clo*_*aut 2 kubernetes

我正在尝试使用两个容器创建一个小 Pod 示例,这些容器通过 emptyDir 卷共享数据。在第一个容器中,我在它被销毁之前等待了几秒钟。

在 postStart 中,我将文件写入名为“started”的共享卷,在 preStop 中,我正在将文件写入名为“finished”的共享卷。

在第二个容器中,我循环输出共享卷的内容几秒钟,但从未创建“已完成”文件。描述 pod 也不会显示挂钩错误。

也许有人知道我做错了什么

apiVersion: v1
kind: Pod
metadata:
  name: shared-data-example
  labels:
    app: shared-data-example
spec:
  volumes:
  - name: shared-data
    emptyDir: {}
  containers:

  - name: first-container
    image: ubuntu
    command: ["/bin/bash"]
    args: ["-c", "for i in {1..4}; do echo Welcome $i;sleep 1;done"]
    imagePullPolicy: Never
    env:
    - name: TERM
      value: xterm
    volumeMounts:
    - name: shared-data
      mountPath: /myshareddata
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo First container finished > /myshareddata/finished"]
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo First container started > /myshareddata/started"]

  - name: second-container
    image: ubuntu
    command: ["/bin/bash"]
    args: ["-c", "for i in {1..20}; do ls /myshareddata;sleep 1;done"]
    imagePullPolicy: Never
    env:
    - name: TERM
      value: xterm
    volumeMounts:
    - name: shared-data
      mountPath: /myshareddata
  restartPolicy: Never
Run Code Online (Sandbox Code Playgroud)

Ant*_*nko 8

发生这种情况是因为 pod 的最终状态是Completed容器内的应用程序在没有任何外部调用的情况下停止。

KubernetespreStop仅在 pod 解析外部信号以停止时才运行钩子。当你需要停止 pod 时,钩子被用来为 pod 内的应用程序实现优雅的自定义关闭。在您的情况下,您的应用程序已经自行正常停止,因此 Kubernetes 没有理由调用钩子。

如果你想检查一个钩子是如何工作的,你可以尝试Deployment通过kubectl rolling-update例如创建和更新它的图像。在这种情况下,Kubernetes 将停止旧版本的应用程序,并preStop调用 hook。