介绍​

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-appPod现已正常发动并运行,其中包括Nginx服务。为了便于外部访问装备端口转发,将宿主的 3999 端口对应到主容器的 80 端口:

$ kubectl port-forward web-app 3999:80
Forwarding from 127.0.0.1:3999 ->80
Forwarding from [::1]:3999 -> 80

端口转发是一个阻塞程序,保持命令行窗口翻开。然后在浏览器翻开测试页面:

聊聊 K8s 中的 Sidecar 设计模式  第 1 篇

经过 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

从头翻开浏览器后将看到以下页面:

聊聊 K8s 中的 Sidecar 设计模式  第 1 篇

SideCar 形式的作业原理​

简略来说,BusyboxSideCar容器人物,负责生产主页数据;而Nginx是主容器,负责消费Busybox生产的主页数据;两个容器经过var-logs磁盘卷同享空间。假如以 Go 言语的术语类比,Nginx是主GoroutineBusybox是后台干脏活的Goroutine,而同享的磁盘卷相似Channel的作用。

聊聊 K8s 中的 Sidecar 设计模式  第 1 篇

在这个比方中Nginx依然是主容器,SideCar容器是BusyBox。咱们还能够挂更多SideCar容器,比方网络、监控、日志等等。

聊聊 K8s 中的 Sidecar 设计模式  第 1 篇

这样就经过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来扩展根据已有装备的才能。