0. 简介
边车(Sidecar)一般指的一种附有单轮的设备,加装在摩托车等车侧,而边车容器指的也是这种可以随时拆卸的容器。比如我们会经常在一个 Pod 中除了设置主程序容器外,一般还会搭载一些日志收集、服务治理、健康检查等容器,这些容器就可以称之为边车容器。
1. 一个 Pod 中运行两个容器
在 k8s 1.28版本之前,如果我们想要使用边车功能,基本上就是在一个 Pod 上部署多个容器,比如我们部门现有的日志收集就是采用这种方式,这里我们仿照同 Pod 内的容器使用共享卷通信中的镜像,写如下的 Deployment:
yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: two-containers
spec:
selector:
matchLabels:
app: two-containers
replicas: 1
template:
metadata:
labels:
app: two-containers
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: debian
image: debian
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh","-c", "echo Hello from the debian container > /pod-data/index.html"]
volumes:
- name: shared-data
emptyDir: {}
以上其实就是由debian
容器写了Hello from the debian container
到共享卷中,而一个 Pod 中的容器共享卷,nginx
容器挂载目录/usr/share/nginx/html
,所以这时候执行:
bash
kubectl exec -it two-containers-65bfd6bc69-tqqcd -c nginx bash
可以进入nginx
容器,然后执行以下命令,可以展示的确实是/usr/share/nginx/html/index.html
的文件内容。
bash
~ curl localhost
Hello from the debian container
一般而言,这种方式的边车容器,和工作负载容器没有任何权限上的差异,k8s 无法控制他们之间的启动顺序,且边车容器可能会在工作负载容器退出后阻止 Pod 终止。
不过也有牛逼的大佬在看了 k8s 源码之后提出了能够控制启动和退出顺序的方式,可参考Kubernetes中Sidecar生命周期管理。
2. k8s 原生的边车容器
Kubernetes 1.28 在 Init 容器中添加了一个新的 restartPolicy
字段, 该字段在 SidecarContainers
特性门控启用时可用。
由于我的 kind 安装的 k8s 版本才 1.27,所以这里就不演示了,详情可以参考官方文档,和# 千呼万唤始出来的K8s Sidecar