Kubernetes SidecarContainer 边车容器
Kubernetes 中的边车容器
边车容器是与主应用容器在同一个 Pod 中运行的辅助容器。 这些容器通过提供额外的服务或功能(如日志记录、监控、安全性或数据同步)来增强或扩展主应用容器的功能, 而无需直接修改主应用代码。
通常,一个 Pod 中只有一个应用容器。 例如,如果你有一个需要本地 Web 服务器的 Web 应用, 则本地 Web 服务器以边车容器形式运行,而 Web 应用本身以应用容器形式运行。比如 nginx 边车容器加上 Python Flask 应用容器。
Kubernetes 从 v1.28 版本开始,引入了边车容器(SidecarContainer)的特性,自 v1.29 起默认启用,v1.33 版本变成 stable 阶段默认。可以将某个初始化容器当作一个长时间运行的边车容器来使用,并且允许为该初始化容器设置独立的重启策略和健康检查探针。
与常规初始化容器不同的是,在边车初始化容器中,系统只要判定边车初始化容器启动完成(Started=true),就运行后续的其他容器,不会等到边车初始化容器成功运行完毕后再继续。对于配置了StartupProbe探针的边车初始化容器,系统会确保在StartupProbe成功运行完毕后再继续运行后续的容器。边车初始化容器的重启策略只能被设置为“Always”。
你可以为 Pod 的 initContainers 字段中列出的容器指定restartPolicy。 这些可重新启动的边车(Sidecar) 容器独立于其他 Init 容器以及同一 Pod 内的主应用容器, 这些容器可以启动、停止和重新启动,而不会影响主应用容器和其他 Init 容器。
如果是不需要控制哪些容器先启动或停止的,除了用 Init 容器或边车容器,你也可以把所有容器都作为普通应用容器放在spec.containers里,不区分主次。如果 Kubernetes ≤1.29(特性门控 SidecarContainers),则无法将 Init 容器变成边车容器,只能用普通容器方案,无法实现边车的“先启动、后停止”特性。
边车容器和 Pod 生命周期
如果创建 Init 容器时将restartPolicy设置为Always, 则它将在整个 Pod 的生命周期内启动并持续运行。这对于运行与主应用容器分离的支持服务非常有帮助。
如果为此 Init 容器指定了readinessProbe,其结果将用于确定 Pod 的ready状态。
在 Pod 终止时, kubelet 会推迟终止边车容器,直到主应用容器已完全停止。边车容器随后将按照它们在 Pod 规约中出现的相反顺序被关闭。 这种方法确保了在不再需要边车服务之前这些边车继续发挥作用,以支持 Pod 内的其他容器。
简单类比:
| 方式 | 类比 | 控制精度 |
|---|---|---|
| 普通容器 | 一群人同时起跑、同时到达 | 无 |
| Init 容器 | 接力赛,前一棒跑完下一棒才开始 | 严格顺序 |
| 边车容器 | 裁判/后勤先就位,运动员比赛,裁判最后撤 | 先启后停 |
与 Init 容器的区别
边车容器与主容器并行工作,扩展其功能并提供附加服务。
边车容器与主应用容器同时运行。它们在整个 Pod 的生命周期中都处于活动状态,并且可以独立于主容器启动和停止。 与 Init 容器不同, 边车容器支持探针来控制其生命周期。
边车容器可以直接与主应用容器交互,因为与 Init 容器一样, 它们总是与应用容器共享相同的网络,并且还可以选择共享卷(文件系统)。
Init 容器在主容器启动之前停止,因此 Init 容器无法与 Pod 中的应用容器交换消息。 所有数据传递都是单向的(例如,Init 容器可以将信息放入 emptyDir 卷中)。
变更边车容器的镜像不会导致 Pod 重启,但会触发容器重启。
应用示例
带边车容器的 Deployment
下面是一个包含两个容器的 Deployment 示例,其中一个容器是边车形式:
说明:
在此示例中,边车容器被有意定义在 initContainers 下,并设置了 restartPolicy: Always。 Kubernetes 会将此类容器视为边车容器,并在整个 Pod 生命周期内持续运行。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: alpine:latest
command: ['sh', '-c', 'while true; do echo "logging" >> /opt/logs.txt; sleep 1; done']
volumeMounts:
- name: data
mountPath: /opt
initContainers:
- name: logshipper
image: alpine:latest
restartPolicy: Always
command: ['sh', '-c', 'tail -F /opt/logs.txt']
volumeMounts:
- name: data
mountPath: /opt
volumes:
- name: data
emptyDir: {}
带边车容器的 Job
边车初始化容器也适用于 Job 类型的工作负载,不过如果主容器运行结束,Job 就运行完成了。边车初始化容器虽然设置了restartPolicy=Always,但它也会随着 Job 的运行结束而终止,不会长期运行。
以下是一个具有两个容器的 Job 示例,其中一个是边车:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: myjob
image: alpine:latest
command: ['sh', '-c', 'echo "logging" > /opt/logs.txt']
volumeMounts:
- name: data
mountPath: /opt
initContainers:
- name: logshipper
image: alpine:latest
restartPolicy: Always
command: ['sh', '-c', 'tail -F /opt/logs.txt']
volumeMounts:
- name: data
mountPath: /opt
restartPolicy: Never
volumes:
- name: data
emptyDir: {}
Kubernetes SidecarContainer 边车容器
https://www.seafog.cn/archives/C2TrRtkk