同 Pod 内的辅助容器
Sidecar 是在同一个 Pod 里放辅助容器(日志转发、代理、配置渲染)的做法:它们共享网络命名空间与卷,生命周期与 Pod 绑定,一起启停。Kubernetes 1.29 起支持原生 sidecar:把容器声明在 initContainers 里并设置 restartPolicy: Always,从而获得独立生命周期,并在主容器之前启动。
基本信息
| 共享内容 | 网络命名空间(可经 localhost 互访)、卷、Pod 级生命周期 |
|---|---|
| 典型用途 | 日志收集、服务网格代理、配置热更新、凭据注入 |
| 原生 sidecar | initContainers 中声明并设 restartPolicy: Always,先于主容器启动且可独立重启 |
| 普通 sidecar | 与主容器同启同停,没有启动顺序保证 |
| 资源与探针 | 需要按正式容器对待,配置 requests 与就绪探针 |
| 端口 | 同一 Pod 内端口共享,绑定前先确认不冲突 |
典型使用场景
- 把应用写在文件里的日志转发到集中式日志系统,不改动应用镜像
- 服务网格的数据面代理处理进出流量,由平台统一注入
- 从配置中心拉取配置并渲染到共享卷,应用只读文件
- 为应用注入短期凭据并定时轮换
- 在应用容器之外做指标导出,避免改动业务镜像
Sidecar 示例
Sidecar 示例
spec:
containers:
- name: app
image: registry.example.com/team/app:1.2.3
volumeMounts:
- { name: logs, mountPath: /var/log/app }
- name: log-tailer
image: busybox:1.36
command: ["sh", "-c", "tail -F /var/log/app/app.log"] # 转发共享卷里的日志
volumeMounts:
- { name: logs, mountPath: /var/log/app }
volumes:
- name: logs
emptyDir: {} # Pod 内共享,随 Pod 生命周期存在
两种 sidecar 对比
| 维度 | 普通 sidecar | 原生 sidecar |
|---|---|---|
| 声明位置 | containers 列表 | initContainers 且 restartPolicy: Always |
| 启动顺序 | 无保证 | 先于主容器启动 |
| 退出行为 | 主容器结束则 Pod 终止 | 可独立重启,不影响主容器启动 |
| 版本要求 | 所有版本可用 | 1.29 起支持,旧版本按普通容器处理 |
同一 Pod 内的端口是共享资源:sidecar 监听端口前先确认与主容器不冲突。另一个容易忽略的点是任务类工作负载:主容器结束后 sidecar 仍在运行会让任务迟迟无法完成。
sidecar 崩溃同样算 Pod 故障:它的就绪状态与资源占用直接决定 Pod 是否可用,必须按正式容器对待,配置探针与资源上限,而不是当成可选的附加组件。