一、什么是边车模式sidecar

边车模式sidecar是在不改变原有container功能的情况下,在同一个pod下增加其他container来增加对应的功能,因为在同一个Pod下的容是共享一个namespace空间的,所以对应的网络、存储等资源也是同一个空间下的,这就可以很方便的进行两个containers之间交互。当然这个比较理解,举个通俗的例子:在近代战争电影里,我们经常看到一群日本兵开着三轮摩托,插着膏药旗进城,通常这个三轮摩托上还架着机关枪。这个就可以理解成sidecar模式,因为三轮摩托的主要作用肯定是一个交通载具,但是旁边坐的老日在那驾个枪就多了警戒防护的功能。

sidecar
sidecar

这下有个形象感觉了吧(题外话:虽然我不推崇暴力,但不介意你对上面这帮军国主义的小胡子来上一梭子:stuck_out_tongue_winking_eye:)

二、nignx演示sidecar功能

这个通过了一个busybox image进行内容生成,生成的内容通过nginx进行展示出来,这里nginx container就是主容器,生成日志首页内容的container就是sidecar container,先看yaml文件内容:

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: sidecar-container-demo
 5spec:
 6  containers:
 7  - image: busybox
 8    command: ["/bin/sh"]
 9    args: ["-c", "while true; do echo echo $(date -u) 'Hi I am from Sidecar container' >> /var/log/index.html; sleep 5;done"]
10    name: sidecar-container
11    resources: {}
12    volumeMounts:
13    - name: var-logs
14      mountPath: /var/log
15  - image: nginx
16    name: main-container
17    resources: {}
18    ports:
19      - containerPort: 80
20    volumeMounts:
21    - name: var-logs
22      mountPath: /usr/share/nginx/html
23  dnsPolicy: Default
24  volumes:
25  - name: var-logs
26    emptyDir: {}

这里注意下里面有个Volumes卷的功能,两者之间都使用了var-logs卷,只不过挂载的目录是有区别的,但里面的内容在两个container里是共用的,对应的数据也是一致的。

注:英文不好的同学可以看volumes的中文翻译,这里在官方文档里说明了有两个功能:
一是当容器崩溃时文件丢失。 kubelet 会重新启动容器,但容器会以干净的状态重启(数据的持久化存储)
二个问题会在同一 Pod 中运行多个容器并共享文件时出现(同一个pod下的容器之间共享数据)

查看运行结果:

1// create the pod
2kubectl create -f pod.yaml
3// list the pods
4kubectl get po
5// exec into pod
6kubectl exec -it sidecar-container-demo -c main-container -- /bin/sh
7curl localhost

上面列的是进入容器内部运行的,当然也可以选择不进入容器内部,直接使用容器IP运行,如下:

sidecar-createpod
sidecar-createpod

这里可以看到sidecar-container-demo这个pod里是有两个containers的,而且访问的页面内容就是busybox里生成的内容。

三、增加点难度Deployment

挑战下难度,换用一个5个副本集,两个sidecar容器,通过Deployment以NodePort模式发布

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  creationTimestamp: null
 5  labels:
 6    app: nginx-webapp
 7  name: nginx-webapp
 8spec:
 9  replicas: 5
10  selector:
11    matchLabels:
12      app: nginx-webapp
13  strategy: {}
14  template:
15    metadata:
16      creationTimestamp: null
17      labels:
18        app: nginx-webapp
19    spec:
20      containers:
21      - image: busybox
22        command: ["/bin/sh"]
23        args: ["-c", "while true; do echo echo $(date -u) 'Hi I am from Sidecar container 1' >> /var/log/index.html; sleep 5;done"]
24        name: sidecar-container1
25        resources: {}
26        volumeMounts:
27          - name: var-logs
28            mountPath: /var/log
29      - image: busybox
30        command: ["/bin/sh"]
31        args: ["-c", "while true; do echo echo $(date -u) 'Hi I am from Sidecar container 2' >> /var/log/index.html; sleep 5;done"]
32        name: sidecar-container2
33        resources: {}
34        volumeMounts:
35          - name: var-logs
36            mountPath: /var/log
37      - image: nginx
38        name: main-container
39        resources: {}
40        ports:
41          - containerPort: 80
42        volumeMounts:
43          - name: var-logs
44            mountPath: /usr/share/nginx/html
45      dnsPolicy: Default
46      volumes:
47      - name: var-logs
48        emptyDir: {}
49status: {}
50
51---
52
53apiVersion: v1
54kind: Service
55metadata:
56  name: nginx-webapp
57  labels:
58    run: nginx-webapp
59spec:
60  ports:
61  - port: 80
62    protocol: TCP
63  selector:
64    app: nginx-webapp
65  type: NodePort

执行结果如下:

sidecar-deployment
sidecar-deployment