一句话定义:Sidecar 是跟主容器跑在同一个 Pod 里、专门替它处理辅助任务的辅助容器。代理、日志收集、配置同步都能做,主容器的代码一行不用改。
原理:摩托车边车
想象一辆摩托车加挂一个边车:共用同一副车架,也就是同一个 Pod、同一套生命周期和存储卷;但各有各的发动机:各自独立的进程、镜像和资源配额。边车不抢方向盘,只帮忙带东西。
关键在 Kubernetes 的规则:同一个 Pod 里的所有容器共享同一个网络命名空间。它们共用同一个 IP 和同一套端口,彼此可以用 localhost 直接访问。这正是 sidecar 能“透明劫持流量”的根本原因。
典型做法是:sidecar 里跑一个代理,监听某个端口;Pod 内的流量规则把主容器的进出流量重定向到这个端口;主容器完全不知情,照常发请求,实际上每个包都先经过 sidecar。服务网格(service mesh)就是用这个办法把重试、加密、遥测等功能附加到应用上,业务代码零改动。
最容易踩的坑:资源与权限要单独算
共享网络不等于共享一切:
- 资源配额按容器算。sidecar 的 CPU/内存 request 和 limit 要单独配置;不给它设上限,它可能挤占主容器,也可能自己被 OOM kill。整个 Pod 能调度到的资源,是各容器之和。
- 权限是各自的。sidecar 若需要改 iptables、读主机日志,这类权限只该给 sidecar,别顺手也给主容器;反过来,sidecar 拿了高权限,也就等于给整个 Pod 开了口子。
- 端口会冲突。共用网络命名空间,两个容器不能监听同一个端口。
- 启停顺序有耦合。代理没起来,主容器可能连不上外网。较新的 Kubernetes 提供了原生 sidecar 容器语义来缓解,具体行为以官方文档为准。
和相邻概念的区别
| 概念 | 何时运行 | 典型用途 | 与主容器关系 |
|---|---|---|---|
| Sidecar | 与主容器同时运行 | 代理、日志、监控 | 长期并存,辅助 |
| Init container | 主容器启动前,跑完即退 | 初始化、等依赖就绪 | 一次性前置 |
| 普通多容器 Pod | 同时运行 | 紧耦合的协作进程 | 平级,无主次 |
| 节点级 DaemonSet | 每台节点一个 | 日志采集、网络插件 | 不在 Pod 内,管整台机器 |
要注意 sidecar 不是 Kubernetes 的某个字段或资源类型,而是一种用法模式。
对你的意义
做 AI 工程的:模型服务上线时,鉴权、限流、灰度发布、链路追踪常靠 sidecar 外挂,推理代码不用动;但每加一个 sidecar 就多一跳网络,别在延迟敏感的推理路径上不考虑成本就加。
普通职场人:看到“边车”不用慌,就是个帮忙跑腿的副驾驶,只是它也要占工位、也要门禁卡,预算和权限得单独申请。
