介绍
SideCar
北京土话叫三蹦子,通俗叫便是带棚子的三轮摩托车。今日咱们要聊的 K8S 中三蹦子也称为边三轮车:边三轮车是在摩托车边上挂靠一个拖斗,云原生中的叫法是主容器和边车容器。本系列文章将展现SideCar
形式的用法,以及怎么经过KCL等面向装备的编程言语来简化 YAML 的编写。
一个最简略的云原生 Web 服务
首先以最简方法在Kubernetes
环境发动一个 Web 服务。在下面pod.yaml
文件中定义一个Pod
,其中只要一个Nginx
服务,在 80 端口发动一个web
服务。
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- image: nginx
name: main-container
ports:
- containerPort: 80
Pod
是云原生中的一个根底原语。Pod
将多个容器包装为一个逻辑单元,Kubernetes
运行时保证Pod
中的容器运行在一个机器上。因而Pod
中的所有容器都同享生命周期、同享磁盘卷、同享网络环境等。SideCar
形式便是在Pod
中添加其他容器来扩展和增强主容器的才能。
然后经过kubectl create
命令行工具创立Pod
,然后经过kubectl get po
检查Pod
履行状态:
$ kubectl create -f pod.yaml
$ kubectl get po
NAME READY STATUS RESTARTS AGE
web-app 1/1 Running 0 45m
能够看到一个名为web-app
的Pod
现已正常发动并运行,其中包括Nginx
服务。为了便于外部访问装备端口转发,将宿主的 3999 端口对应到主容器的 80 端口:
$ kubectl port-forward web-app 3999:80
Forwarding from 127.0.0.1:3999 ->80
Forwarding from [::1]:3999 -> 80
端口转发是一个阻塞程序,保持命令行窗口翻开。然后在浏览器翻开测试页面:
经过 SideCar 定扩展页面内容
现在咱们测验在不修正原始Nginx
容器镜像的前提下,经过SideCar
形式为Nginx
服务添加定制Web
页面的才能。在开端前先删除之前发动的Pod
:
$ kubectl delete po web-app
pod "web-app" deleted
然后在Pod
中添加第二个Busybox SideCar
容器,完整的pod.yaml
文件如下:
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- image: nginx
name: main-container
ports:
- containerPort: 80
# --- 以下是新添加的内容 ---
# 和 SideCar 经过 磁盘卷同享要发布的文件目录
volumeMounts:
- name: var-logs
mountPath: /usr/share/nginx/html
# SideCar 容器
- image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date -u) 'Hi I am from Sidecar container' > /var/log/index.html; sleep 5;done"]
name: sidecar-container
volumeMounts: var-logs
mountPath: /var/log
# Pod 中悉数容器同享磁盘卷
volumes:
- name: var-logs
emptyDir: {}
Busybox SideCar
容器履行的命令对应以下Shell
脚本:
while true; do
echo $(date -u) 'Hi I am from Sidecar container' > /var/log/index.html;
sleep 5;
done
SideCar
容器只要一个功用:每隔 5 秒钟覆盖一次/var/log/index.html
文件,这个文件刚好对应Nginx
的服务的主页页面文件。
然后从头发动Pod
,并从头映射本地宿主机端口到容器端口:
$ kubectl create -f pod.yaml
pod/web-app created
$ kubectl port-forward web-app 3999:80
Forwarding from 127.0.0.1:3999 -> 80
Forwarding from [::1]:3999 -> 80
从头翻开浏览器后将看到以下页面:
SideCar 形式的作业原理
简略来说,Busybox
是SideCar
容器人物,负责生产主页数据;而Nginx
是主容器,负责消费Busybox
生产的主页数据;两个容器经过var-logs
磁盘卷同享空间。假如以 Go 言语的术语类比,Nginx
是主Goroutine
,Busybox
是后台干脏活的Goroutine
,而同享的磁盘卷相似Channel
的作用。
在这个比方中Nginx
依然是主容器,SideCar
容器是BusyBox
。咱们还能够挂更多SideCar
容器,比方网络、监控、日志等等。
这样就经过SideCar
形式,在不修正Nginx
主容器的前提下,扩展出了网络、监控、日志等才能。
SideCar 形式的长处
现在容器现已成为一种盛行的打包技能,各种不同人物的同学能够经过容器以统一的方法构建、发布和运行程序,甚至办理各种资源。因而容器更像一个功用清晰的产品,它有自己的运行时、发布周期、文档和 API 等。好的容器/产品只负责解决一个问题,保持了 KISS 准则能够让容器本身具有极高的重用性和可被代替性。正是由于可重用才使得现代化的构建程序的流程更加灵敏和高效。可是可复用的容器一般都功用单一,咱们常常需要经过各种手法扩展容器的功用,以及需要更多的容器之间的协同。
三蹦子SideCar
能够在不改造主摩托车的前提下添加 N 个拖车功用,相应地云原生SideCar
形式能够在无需修正主容器的前提下扩展并增强已有主容器功用。假如将云原生的玩法和面向对象编程联系起来,容器镜像便是Java
中的class
,而履行中的容器便是class
的实例。而面向对象的class
承继便是根据已有的容器镜像做扩展,SideCar
则是经过相似组合的形式扩展class
的才能。
面向对象编程中有一个“组合优于承继,多用组合少用承继”的规则,因而 SideCar 也是引荐运用的形式。正是由于三蹦子形式的长处,最近在云原生场景也被大量运用:比方在边车上架一些相似机关枪的网络服务、监控、盯梢等功用。
总结
这一篇文章咱们扼要介绍并在Kubernetes
环境展现了SideCar
形式,同时结合传统的面向对象编程思维对比了SideCar
和组合编程形式的联系。SideCar
形式的优势不仅仅体现在无害增强主容器,更灵活的是能够在apply
时动态调整SideCar
才能。
在后面的文章中,咱们将测验结合KCL
等现代化的云原生装备言语来简化SideCar
装备的编写。经过测验探索经过KCL
动态注入和修正SideCar
来扩展根据已有装备的才能。