You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes Pod关闭时Sidecar容器是否立即终止?实际场景确认

Kubernetes Sidecar容器终止场景分析

问题背景

我在Kubernetes Pod中运行一个Java服务容器与heapdump-sidecar容器,该Sidecar的作用是当Java服务因OOM崩溃重启时,将堆转储文件上传至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

现有两种假设场景:

  • 场景1:Pod收到SIGTERM信号开始关闭流程,Sidecar容器立即终止,Pod等待Java服务容器关闭(10秒),最终Pod在10秒后被销毁。
  • 场景2:Pod收到SIGTERM信号开始关闭流程,Sidecar容器不立即终止。Java服务容器10秒后关闭,但Pod需等待未终止的Sidecar,30秒优雅期结束后Pod被强制销毁,总耗时30秒。

请问实际会是哪种场景?

结论

实际会是场景2。

原因分析

  1. Kubernetes Pod终止逻辑:当Pod收到SIGTERM信号时,会同时向Pod内所有容器发送SIGTERM信号,随后启动默认30秒的优雅终止倒计时。只有当所有容器都主动退出后,Pod才会被销毁;若倒计时结束仍有容器未退出,Kubernetes会向这些容器发送SIGKILL强制终止。
  2. Sidecar的信号处理缺陷:该Sidecar通过/bin/sh -c执行循环脚本,默认情况下sh进程不会将收到的SIGTERM信号转发给其启动的子进程(循环逻辑、sleep命令等),且脚本本身未添加捕获SIGTERM并主动退出的逻辑。因此,当SIGTERM发给Sidecar的sh进程时,它不会立即终止,会继续执行完当前循环的sleep 5,甚至重复循环,直到优雅期结束被强制杀死。
  3. Java服务容器的行为:假设Java服务容器正确处理了SIGTERM信号,会在10秒内完成优雅关闭,但此时Sidecar仍在运行,Pod会继续等待,直到30秒优雅期结束,最终被强制销毁,总耗时30秒。

内容的提问来源于stack exchange,提问作者rishav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:21:03