已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景 10 节点(16C64G,Kubernetes 1.28.9,containerd 1.7.13,cgroup v2)在线集群,订单服务 Pod 结构:
-Xmx3g,Mem 4G limitsidecar 上周被 OOMKilled 过一次(memory.events oom_kill +1,512Mi 顶穿),关键现象:sidecar 死之后 主容器完全活着——kubelet 只按容器级重启 sidecar(进 CrashLoopBackOff,Back-off restarting failed container),main 的 liveness/readiness 全绿,Endpoints 没动。但 main 每 500ms 调一次 sidecar 的 127.0.0.1:9092/produce,这 10 秒窗口里(sidecar 首次退避重启)所有 produce 都是 connection refused,main 侧重试队列堆积,业务侧表现为订单事件延迟 10~30s 但接口 200。
现象
kubectl get pod 显示 READY 2/2(sidecar 在 CrashLoop 但 kubelet 还维持容器存在态)/healthz 只查 JVM 自身,不感知 sidecar 死活已尝试的排查与结果
/healthz 里加一个 HTTP 探测 127.0.0.1:9092/health,sidecar 死 → main readiness 失败 → kubelet 摘 Endpoint。
periodSeconds=10s,意味着 sidecar 死后最多 10s 才会摘流;再叠加 Ingress/Service 的会话保持,实际摘流延迟 15~20s。periodSeconds 压到 1s:kubelet 的探测开销能接受,但Ingress Controller 的 upstream 健康检查是独立的,我这边摘了 Endpoint,Ingress 侧的 keep-alive 连接还在,前几个请求照样打到 main → main → refused sidecar。exit(1),走「可控重启」而非 OOMKilled。
/var/log/orders/),DaemonSet 化后要跨容器读文件,要么共享 PVC(IO 开销 + 调度耦合),要么走网络(延迟 + 复杂度),对本地日志场景 ROI 不高。期望得到的答案形态
restartPolicy: Always 对「sidecar 死 → main readiness 联动」有没有新机制?还是说仍然要靠 main 自己探测?(引用:#621 讲 sidecar 顺序与陪葬机制,#1847 讲 Full GC 打挂 liveness 的重启风暴,#20 讲探针三件套的默认值陷阱。我的问题是:在「sidecar 挂了主容器不陪葬」这个前提下,半死窗口内的摘流延迟与假成功怎么在工程上根治。)