我有一个 sidecar 容器与 Kubernetes pod 中的 Java 服务容器一起运行。这个 sidecar 容器的工作是当 Java 服务容器因 OOM 崩溃而重新启动时,将 heapdump 传输到 GCP 存储桶。 Sidecar 就是这样做的:
- name: heapdump-sidecar
image: google/cloud-sdk:latest
command:
- /bin/sh
- -c
- |
while true; do
heap_dump_file="/appdata/java/heapdumps/heapdump.hprof";
gs_bucket="gs://namespace-non-prod/heap-dump-{{ .Values.environment }}-bucket/";
if [ -f "$heap_dump_file" ]; then
echo "Heap dump file found. Uploading to GCS...";
gsutil cp "$heap_dump_file" "$gs_bucket{{ .Chart.Name }}-$(date +%Y-%m-%d-%H-%M-%S).hprof";
if [ $? -eq 0 ]; then
echo "Heap dump uploaded successfully.";
rm -rf /appdata/java/heapdumps/*;
else
echo "Heap dump upload failed";
fi;
else
echo "Heap dump file not found. Waiting...";
fi;
sleep 5;
done
问题: 当 Pod 必须关闭时,此容器是否会延迟 Pod 的关闭?我的期望是 sidecar 容器立即关闭,并且不会强制 pod 等待终止宽限期,从而延迟关闭。
您的期望是正确的,当 Pod 必须关闭时,容器可能会延迟 Pod 的关闭。当 Kubernetes Pod 关闭时,Sidecar 容器会立即关闭。
根据 Sandeep Dinesh 的官方 GCP 博客:
“Kubernetes 等待指定的时间,称为终止宽限期。默认情况下,该时间为 30 秒。值得注意的是,这与 preStop 挂钩和 SIGTERM 信号同时发生。 Kubernetes 不会等待 preStop 钩子完成。如果您的 Pod 通常需要超过 30 秒才能关闭,请确保增加宽限期。您可以通过在 Pod YAML 中设置终止GracePeriodSeconds 选项来做到这一点。”
根据 Marko Lukša 撰写的 Medium 博客,“如果 sidecar 容器提供了一个等待 sidecar 准备就绪的可执行文件,您可以在容器的启动后挂钩中调用它,以阻止其余容器的启动吊舱。”