一、什么是边车模式sidecar
边车模式sidecar是在不改变原有container功能的情况下,在同一个pod下增加其他container来增加对应的功能,因为在同一个Pod下的容是共享一个namespace空间的,所以对应的网络、存储等资源也是同一个空间下的,这就可以很方便的进行两个containers之间交互。当然这个比较理解,举个通俗的例子:在近代战争电影里,我们经常看到一群日本兵开着三轮摩托,插着膏药旗进城,通常这个三轮摩托上还架着机关枪。这个就可以理解成sidecar模式,因为三轮摩托的主要作用肯定是一个交通载具,但是旁边坐的老日在那驾个枪就多了警戒防护的功能。
这下有个形象感觉了吧(题外话:虽然我不推崇暴力,但不介意你对上面这帮军国主义的小胡子来上一梭子:stuck_out_tongue_winking_eye:)
二、nignx演示sidecar功能
这个通过了一个busybox image进行内容生成,生成的内容通过nginx进行展示出来,这里nginx container就是主容器,生成日志首页内容的container就是sidecar container,先看yaml文件内容:
apiVersion: v1
kind: Pod
metadata:
name: sidecar-container-demo
spec:
containers:
- image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do echo echo $(date -u) 'Hi I am from Sidecar container' >> /var/log/index.html; sleep 5;done"]
name: sidecar-container
resources: {}
volumeMounts:
- name: var-logs
mountPath: /var/log
- image: nginx
name: main-container
resources: {}
ports:
- containerPort: 80
volumeMounts:
- name: var-logs
mountPath: /usr/share/nginx/html
dnsPolicy: Default
volumes:
- name: var-logs
emptyDir: {}
这里注意下里面有个Volumes卷的功能,两者之间都使用了var-logs卷,只不过挂载的目录是有区别的,但里面的内容在两个container里是共用的,对应的数据也是一致的。
注:英文不好的同学可以看volumes的中文翻译,这里在官方文档里说明了有两个功能:
一是当容器崩溃时文件丢失。 kubelet 会重新启动容器,但容器会以干净的状态重启(数据的持久化存储)
二个问题会在同一 Pod 中运行多个容器并共享文件时出现(同一个pod下的容器之间共享数据)
查看运行结果:
// create the pod
kubectl create -f pod.yaml
// list the pods
kubectl get po
// exec into pod
kubectl exec -it sidecar-container-demo -c main-container -- /bin/sh
curl localhost
上面列的是进入容器内部运行的,当然也可以选择不进入容器内部,直接使用容器IP运行,如下:
这里可以看到sidecar-container-demo这个pod里是有两个containers的,而且访问的页面内容就是busybox里生成的内容。
三、增加点难度Deployment
挑战下难度,换用一个5个副本集,两个sidecar容器,通过Deployment以NodePort模式发布
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx-webapp
name: nginx-webapp
spec:
replicas: 5
selector:
matchLabels:
app: nginx-webapp
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx-webapp
spec:
containers:
- image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do echo echo $(date -u) 'Hi I am from Sidecar container 1' >> /var/log/index.html; sleep 5;done"]
name: sidecar-container1
resources: {}
volumeMounts:
- name: var-logs
mountPath: /var/log
- image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do echo echo $(date -u) 'Hi I am from Sidecar container 2' >> /var/log/index.html; sleep 5;done"]
name: sidecar-container2
resources: {}
volumeMounts:
- name: var-logs
mountPath: /var/log
- image: nginx
name: main-container
resources: {}
ports:
- containerPort: 80
volumeMounts:
- name: var-logs
mountPath: /usr/share/nginx/html
dnsPolicy: Default
volumes:
- name: var-logs
emptyDir: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
name: nginx-webapp
labels:
run: nginx-webapp
spec:
ports:
- port: 80
protocol: TCP
selector:
app: nginx-webapp
type: NodePort