kubernetes--通俗理解Sidecar容器
文章目录
- Sidecar 原理详解
- 1.1 Pod 是调度的基本单位
- 1.2 工作机制
- 通俗例子理解Sidecar
- 技术场景
- 日志收集 Sidecar
- 配置自动更新 Sidecar
- Sidecar职责分离
- 日志收集 Sidecar 示例
- 实验目标
- 完整 YAML 文件:nginx-logger-pod.yaml
- 步骤说明
- 如何运行
- 回答面试官
- Sidecar vs Init 容器
- 面试回答
在Kubernetes(K8s)中,Sidecar(边车) 是一种容器模式(Sidecar Pattern),指的是在 同一个 Pod 内 部署一个或多个 辅助容器(即 Sidecar 容器),来为 主应用容器提供附加功能,如 日志收集、配置同步、代理通信等。
Sidecar 原理详解
1.1 Pod 是调度的基本单位
在 Kubernetes 中,一个 Pod 内可以包含多个容器,这些容器共享:
- 网络命名空间(即可通过 localhost 互通)
- 存储卷(Volumes)
- 生命周期(随 Pod 一起创建、销毁)
Sidecar 就是和主应用容器部署在同一个 Pod 内的“辅助容器”,它通常和主容器 紧密协作,但 职责不同。
1.2 工作机制
Sidecar 容器利用 Pod 内的共享网络与卷,通常以以下方式提供服务:
- 在主容器启动前或同时启动
- 持续运行,监听主容器状态或输出
- 主容器关闭时,Sidecar 也随之终止
通俗例子理解Sidecar
Sidecar 是和主应用一起运行在同一个 Pod 中的“辅助容器”,用来做主应用不方便或不擅长做的事。
就像一辆摩托车边上带的“边车”,边车不会开车,但能帮你装行李、放地图、带个乘客,让你专心骑车。
想象一个开餐馆的主厨(主容器),他专注炒菜做饭(业务逻辑),但还需要有人帮忙干这些事:
- 收拾碗筷、打扫卫生(日志收集)
- 检查菜单有没有更新(配置监听)
- 替客人点单并翻译菜单(流量代理)
这时候,店里配了个助手(Sidecar),和主厨一起在厨房里配合,主厨不用亲自干这些杂活。
技术场景
日志收集 Sidecar
例子1:日志收集 Sidecar
- 主容器: Nginx
- 作用: 提供网页服务
- 问题: Nginx 只写日志文件,不能把日志发送到日志服务器
解决方法: 加一个 Sidecar 容器,它做这件事:
1.每秒读取 Nginx 写的日志文件
2. 发送到外部的日志中心(如 ELK、Promtail)所以:Sidecar 就像专门负责送日志的人。
配置自动更新 Sidecar
例子2:配置自动更新 Sidecar
- 主容器: Java 应用,需要一个配置文件 config.yaml
- 问题: 这个配置每隔几分钟会在配置中心更新,主容器不会自动拉取
Sidecar 容器做什么?
- 监听配置中心
- 拉取更新,写入共享目录,主容器实时读取
所以:Sidecar 是帮主容器搬运配置的人。
Sidecar职责分离
为什么不把这些功能写进主容器里?
这就是“职责分离”的思想:
主容器 | Sidecar 容器 |
---|---|
只做业务 | 负责辅助支持 |
减少复杂性 | 关注非核心功能 |
更通用 | 更专用(日志、代理、安全等) |
Sidecar 容器的一个 很重要的优点是可以被复用和独立更新,比如 Fluentd、Envoy、Certbot 都可以作为 Sidecar 使用在多个服务中。
Sidecar 是一种设计模式,让主应用容器更专注做核心功能,其他的交给身边的“边车”处理,这些边车在 Pod 里和主应用并肩作战。
日志收集 Sidecar 示例
主容器(Nginx)产生日志,Sidecar 容器(BusyBox)收集这些日志并打印到控制台。
实验目标
实验目标
- 启动一个 Pod,有两个容器:
- nginx:正常运行,写 access.log
- busybox:周期性读取日志内容,模拟“收集”日志
- 共享日志路径 /var/log/nginx 作为 emptyDir 卷
完整 YAML 文件:nginx-logger-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-logger-pod
spec:volumes:- name: nginx-logsemptyDir: {} # 临时共享目录containers:- name: nginximage: nginxvolumeMounts:- name: nginx-logsmountPath: /var/log/nginx # nginx 日志目录挂载出来- name: log-sidecarimage: busyboxcommand: ["/bin/sh", "-c"]args:- while true; doif [ -f /var/log/nginx/access.log ]; thentail -n 10 /var/log/nginx/access.log;fi;sleep 5;donevolumeMounts:- name: nginx-logsmountPath: /var/log/nginx # 同样挂载这个目录
步骤说明
步骤说明
- Nginx 容器会把访问日志写到 /var/log/nginx/access.log
- Sidecar(BusyBox) 会每 5 秒读取一次这个日志文件的内容
- 它们通过 emptyDir 卷共享这个目录
如何运行
kubectl apply -f nginx-logger-pod.yaml
然后你可以用如下命令观察 Sidecar 容器日志:
kubectl logs nginx-logger-pod -c log-sidecar -f
然后用下面命令触发访问日志产生:
kubectl exec -it nginx-logger-pod -c nginx -- curl localhost
再看 Sidecar 输出,会发现它打印了日志内容。
回答面试官
面试官问:
“请简述 Sidecar 模式下日志收集的实现方式。”
你可以说:
Sidecar 以辅助容器的形式,与主容器共享日志目录(通常使用 emptyDir 卷),主容器将日志写入该目录,Sidecar 容器读取并处理这些日志,例如转发到日志系统,做到日志与业务解耦。
Sidecar vs Init 容器
它们的相似点是:都运行在 Pod 中,用于“辅助”主容器,但它们的用途和生命周期是完全不同的。
项目 | Init 容器 | Sidecar 容器 |
---|---|---|
🧠 作用 | 启动前准备工作 | 运行时辅助主容器 |
⏱ 生命周期 | 运行一次,先启动,运行完即退出 | 与主容器同时启动、同时终止 |
⏳ 运行顺序 | 串行,必须全部完成主容器才启动 | 并行运行,和主容器并肩运行 |
🔁 重启行为 | 失败时重启,成功后不再运行 | 和主容器一样会被 kubelet 监控 |
🧰 常见用途 | 拉取配置、下载依赖、准备数据、权限设置等 | 日志收集、流量代理、配置监听、服务网格等 |
🪣 卷共享 | 可以和主容器共享卷 | 可以和主容器共享卷 |
🚫 网络共享 | 和主容器共享网络空间 | 和主容器共享网络空间 |
面试回答
Sidecar 和 Init 容器的核心区别在于生命周期和用途:
- Init 容器用于 Pod 启动前的初始化工作,是串行执行的,只运行一次。
- Sidecar 容器用于主容器运行时的辅助功能,是并行运行的,生命周期和主容器一致。
它们都可以共享存储卷和网络,但职责和执行时机完全不同。