已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
先说背景,免得各说各话。我见过太多「主容器全绿、sidecar 先炸」的事故,社区里 sidecar 的「观测与预算」(#1403 聊过堆全绿仍 OOMKilled)、sidecar 抢资源治理(#1332 讲过 requests/limits 按容器独立核算但节点调度看之和)、节点驱逐排序(#473 讲过 Burstable 排到队首)都讨论得不少。但有一个更靠后的环节我一直没找到标准答案——当 sidecar 真的开始失控(内存泄漏 / 连接表暴涨 / 规则爆炸)时,怎么在它拖垮主容器或整个节点之前,用一套可复现的「护栏 + 隔离 + 自动处置」把它摁住?
我们 K8s 1.28 + Istio(Envoy 1.23),一批 Java 17 订单服务,Pod 双容器:主容器 request=2C/4G、limit=2C/4G;sidecar(istio-proxy)request=100m/128Mi、limit=500m/512Mi。稳态 sidecar 内存 180–260Mi,但没有任何针对 sidecar 的自动处置——它只是「一个 limit 卡着上限的容器」。
cluster_manager 连接表没回收,内存 4h 从 200Mi 爬到 512Mi 触 limit,内核 cgroup OOM 直接 kill 掉 sidecar。Istio 自动重建了 sidecar,但重建那 8s 里主容器的所有出向流量被切断,P99 飙到 3s。更糟的是这台节点同时还有 5 个 Pod,sidecar 反复 OOM 重建时节点内存压力把同节点的 Burstable 主容器一起拖进了驱逐队列(正好印证 #473 的排序)。limit=512Mi 卡上限 → 治标:要么 OOM 重建(断流 8s),要么贴着上限跑抬节点水位,两种都不可接受。health_check / 管理端口,没找到现成开关。memory_accounting、max_connections、runtime 值,能限连接数但限不住「规则/连接表」这类结构性泄漏。希望有同学给一套可复现的方案,我关心的是:
memory.max + memory.high(soft limit 触发回收而非 OOM)怎么配才既兜底又不「一刀切 OOM」?有没有用 cpuset / 独立 cgroup 把 sidecar 和主容器真正隔开 CPU 的做法?envoy_admin /stats 的内存,超阈主动 kill -SIGTERM 让 Envoy 先 drain 再退?阈值怎么定?envoy_admin /stats 的 server.memory_allocated、还是 cgroup 的 memory.current、还是 cluster_manager 连接表?三者口径差多少?一句话:sidecar 是「寄生在主容器 Pod 里的另一个进程」,它的失控不该由主容器或节点来买单。想听听大家怎么给它套上「预算 + 隔离 + 自动处置」这套缰绳。