k8s pod中多个容器共享volume

问题

在一个Pod中, 存在2个容器, 这两个容器呢要共享某些存储. 比如一个写日志, 另外一个收集日志.

方法

在Pod中声明一个emptyDir类型的volume.
以下引用来自 https://kubernetes.io/docs/concepts/storage/volumes/#emptydir

Containers in the Pod can all read and write the same files in the emptyDir volume, though that volume can be mounted at the same or different paths in each Container.

大致是说: 一个Pod中的多个容器都能读写emptyDir中的同样的文件, 尽管这个volume可以被各个容器挂载到自身的任何位置.

下面的yaml文件配置了一个Pod, 里边有两个容器, 一个模拟写日志, 一个模拟读日志并输出到标准输出.

apiVersion: v1
kind: Pod
metadata:
  name: shared-volume-pod
  labels:
    app: shared-volume-pod
spec:
  containers:
  - name: alpine-write # 第一个容器模拟写日志
    image: alpine
    volumeMounts:
    - name: shared-volume
      mountPath: /var/log/app-logs # 容器内任意位置都行
      readOnly: false
    command:
      - sh
      - -c
      - "while true; do date +'%Y-%m-%d %H:%M:%S' >> /var/log/app-logs/log.log; sleep 1; done"
  - name: alpine-read # 第二个容器模拟收集日志
    image: alpine
    command: ["sh", "-c", "tail -f /var/log/collect-logs/log.log"]
    volumeMounts:
    - name: shared-volume
      mountPath: /var/log/collect-logs # 容器内任意位置都行
      readOnly: true
  volumes:
  - name: shared-volume # pod中有一个volume让其中的多个容器共享
    emptyDir: {}

实验结果

在"日志收集"容器中查看收集的日志

k8s pod中多个容器共享volume_第1张图片

查看两个容器日志存储路径

# 查看日志收集容器/var/log/collect-logs/log.log的第一行
$ kubectl exec -it shared-volume-pod -c alpine-read -- head -1 /var/log/collect-logs/log.log
2019-08-03 04:07:12

# 查看写日志容器/var/log/app-logs/log.log的第一行
$ kubectl exec -it shared-volume-pod -c alpine-write -- head -1 /var/log/app-logs/log.log
2019-08-03 04:07:12

说明Pod中的volume:shared-volume被两个容器挂载到了自身的不同位置,
而且可以共享(一个读, 一个写)

欢迎补充指正!

你可能感兴趣的:(k8s)