2021年3月6日土曜日

k8s でローカルストレージを共有する場合はサイドカーを使わなければならない

概要

ホスト間で共有 PersistentVolume などを使いたいときは S3 または nfs などのネットワークストレージを使いましょう
それ以外でホストの領域を使ってコンテナ間でストレージを共有したい場合はサイドカーを使います

環境

  • Ubuntu 18.04
  • k8s v1.20.4

ローカルストレージが共有できるパターン

  • vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  restartPolicy: Never
  volumes:
  - name: test-vol
    emptyDir: {}
  containers:
  - name: web1
    image: nginx:latest
    volumeMounts:
    - name: test-vol
      mountPath: /home
  - name: echo
    image: alpine:latest
    volumeMounts:
    - name: test-vol
      mountPath: /home
    command: ["/bin/sh"]
    args: ["-c", "echo This message from alpine container > /home/msg.txt"]

これで web Pods 内にある web1 コンテナで共有領域にアクセスするとファイルがあるのが確認できます

  • kubectl apply -f pod.yml
  • kubectl exec web -c web1 -- cat /home/msg.txt

ローカルストレージが共有できないパターン

pv から pvc を作成して別のホストにデプロイするような Pods で pvc を使おうとしても共有できません

  • vim pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local
  hostPath:
    path: "/mnt/test"
  • vim pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: local
  • vim deploy_web1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web1
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: web1
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web1
    spec:
      containers:
        - image: nginx:latest
          name: web1
          resources: {}
          volumeMounts:
            - mountPath: /home
              name: test-pvc
      nodeSelector:
        kubernetes.io/hostname: node1
      restartPolicy: Always
      volumes:
        - name: test-pvc
          persistentVolumeClaim:
            claimName: test-pvc
status: {}
  • vim deploy_web2.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web2
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: web2
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web2
    spec:
      containers:
        - image: nginx:latest
          name: web2
          resources: {}
          volumeMounts:
            - mountPath: /home
              name: test-pvc
      nodeSelector:
        kubernetes.io/hostname: node2
      restartPolicy: Always
      volumes:
        - name: test-pvc
          persistentVolumeClaim:
            claimName: test-pvc
status: {}
  • kubectl apply -f pv.yml
  • kubectl apply -f pvc.yml
  • vim deploy_web1.yml
  • vim deploy_web2.yml

これで web1 の Pods と web2 の Pods で共有している領域にアクセスしてもファイルを共有することができません

参考サイト

0 件のコメント:

コメントを投稿