首页/云/云与容器速查/Sidecar 多容器与共享
Kubernetes68 条

Sidecar 多容器与共享

同一个 Pod 里放辅助容器(日志转发、代理、配置渲染):共享网络与卷,生命周期同进退;K8s 1.29+ 支持原生 sidecar(initContainer 且 restartPolicy: Always)。

云与容器速查云更新于 2026-10-13

同 Pod 内的辅助容器

Sidecar 是在同一个 Pod 里放辅助容器(日志转发、代理、配置渲染)的做法:它们共享网络命名空间与卷,生命周期与 Pod 绑定,一起启停。Kubernetes 1.29 起支持原生 sidecar:把容器声明在 initContainers 里并设置 restartPolicy: Always,从而获得独立生命周期,并在主容器之前启动。

基本信息

共享内容网络命名空间(可经 localhost 互访)、卷、Pod 级生命周期
典型用途日志收集、服务网格代理、配置热更新、凭据注入
原生 sidecarinitContainers 中声明并设 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 是否可用,必须按正式容器对待,配置探针与资源上限,而不是当成可选的附加组件。

易错点

  • sidecar 崩溃也算 Pod 故障:不配探针与资源上限,最终表现为业务容器无辜重启
  • 用 sidecar 跑有状态存储:Pod 重建数据即丢,持久化数据必须落到卷或外部存储
  • 端口冲突:同 Pod 共享网络命名空间,两个容器绑定同一端口必然失败
  • 在任务类工作负载里使用普通 sidecar:主容器已完成但 sidecar 不退出,任务一直不结束

数据来源与参考

  • Kubernetes Docs:Sidecar Containers
  • Kubernetes Docs:Pods

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌