k8s总结之边车模式sidecar

一、什么是边车模式sidecar

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

执行结果如下:
sidecar-deployment

发表评论

您的电子邮箱地址不会被公开。