我正在尝试使用两个容器创建一个小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
答案 0 :(得分:2)
这种情况正在发生,因为您的pod的最终状态为Completed
,并且容器内的应用程序在没有任何外部调用的情况下停止。
仅当pod解析外部信号停止时,Kubernetes才会运行preStop
挂钩。当您需要停止时,挂钩用于为pod内的应用程序实现优雅的自定义关闭。在您的情况下,您的应用程序已经自行优雅地停止,因此Kubernetes没有理由调用它。
如果您想检查一个钩子是如何工作的,您可以尝试创建Deployment
并通过kubectl rolling-update
更新它的图像。在这种情况下,Kubernetes将停止旧版本的应用程序,并将调用preStop
钩子。