Sidecar 容器与原生 sidecar
边车是一个与主容器同 Pod 运行的辅助容器,负责日志采集、代理、配置同步这类横切工作,它和主容器共享网络命名空间与挂载的卷,但各自的根文件系统独立。经典边车就是普通容器,与主容器并行启动、退出顺序不确定;较新的集群支持把 init 容器声明为 restartPolicy: Always,得到启动顺序可控的原生 sidecar。
基本信息
| 声明位置 | 经典边车在 spec.containers,原生边车在 spec.initContainers |
|---|---|
| 关键字段 | 原生边车必须写 restartPolicy: Always |
| 共享资源 | 同一 Pod 的网络命名空间与卷,不共享根文件系统 |
| 版本要求 | 原生 sidecar 在 1.28 为 alpha,1.29 起 beta 并默认开启 |
| 适用范围 | Kubernetes 1.29 及以上;更早版本只能使用经典边车 |
经典 sidecar 写法
经典 sidecar 写法
spec:
containers:
- name: app
image: registry.example.com/app:1.26.0
- name: log-shipper
image: registry.example.com/fluent-bit:2.2
volumeMounts:
- name: logs
mountPath: /var/log/app
volumes:
- name: logs
emptyDir: {}原生 sidecar 写法
原生 sidecar 写法
spec:
initContainers:
- name: proxy
image: registry.example.com/envoy:v1.29
restartPolicy: Always # init 容器总是重启即原生边车
volumeMounts:
- name: config
mountPath: /etc/proxy
containers:
- name: app
image: registry.example.com/app:1.26.0两种边车差异
| 维度 | 经典 sidecar | 原生 sidecar |
|---|---|---|
| 声明位置 | containers 中的普通容器 | initContainers 且 restartPolicy 为 Always |
| 启动顺序 | 与主容器并行启动,无顺序保证 | 按 init 顺序先启动边车,主容器随后开始 |
| 退出顺序 | 与主容器并行,先后不确定 | 主容器先停,边车最后退出 |
| 对 Job 的影响 | 常驻边车会让 Job 一直不结束 | 主容器结束后边车被终止,不阻塞 Job 完成 |
| 版本要求 | 所有版本可用 | 需要 1.29 及以上的集群 |
典型使用场景
- 日志采集:边车读共享卷里的日志文件并转发到日志平台,主容器不需要感知
- 服务网格代理:代理容器接管 Pod 的进出流量,业务容器不感知流量治理逻辑
- 配置文件热更新:边车负责拉取配置并写入共享卷,主容器定期重载
- 初始化依赖:需要先建好连接或准备目录再启动主容器,用原生边车把顺序固定下来
- Job 场景:批处理任务加日志边车时,用原生边车避免任务因边车常驻而永不完成
原生 sidecar 只接受 restartPolicy: Always 这一个取值;写其他值会被校验拒绝。它的重启行为由 kubelet 按边车语义管理,与普通业务容器的重启退避不完全相同。
在旧集群上照抄原生边车清单风险很高:字段不生效时边车会按普通 init 容器只运行一次就退出,代理与日志采集中断,而主容器看起来完全正常,问题往往在事故后才被发现。