개요

쿠버네티스에서 Persistent 볼륨을 마운트하는 방법을 예제를 통해 알아보자.
이 예제에서는 postgres pod에 PV(Persistent Volume)을 추가하는 것으로 구성하였다. 이유는 docker로 DB를 구성하더라도 데이터는 Persistent하게 구성하는게 일반적이기 때문에 실용적인 유즈케이스라고 판단하였다.

예제 postgres-pvc.yaml

예를 들어 postgres에서 사용할 Persistent Volume을 생성한다고 가정해보자.
YAML은 아래와 같다.

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi

아래 명령어로 적용해준다.

$ kubectl apply -f postgres-pvc.yaml

이후 제대로 볼륨이 생성되었는지 확인해보자.

$ kubectl get pvc
NAME           STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
postgres-pvc   Bound     pvc-d0cfa5cf-e31a-11e8-88a2-fa163e51bc6a   100Gi      RWO            standard       9s

deployment에 mount하기

postgres deployment에 /data로 마운트 시키는 예제이다.
volumeMounts, volumes 부분을 추가해주었다.
volumeMounts와 volumes의 indentation이 다른것에 주의하자.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    io.kompose.service: postgres-deploy
  name: postgres-deploy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        io.kompose.service: postgres-deploy
    spec:
      containers:
      - image: postgres:10.5-alpine
        name: postgres-deploy
        volumeMounts:
        - mountPath: "/data"
          name: postgres-vol
      volumes:
      - name: postgres-vol
        persistentVolumeClaim:
          claimName: postgres-pvc
      restartPolicy: Always

재기동

아래와 같은 형태로 deployment를 재기동 해준다.
예제에서는 deployment이름이 postgres-deploy이다.

$ kubectl delete deployment postgres-deploy
$ kubectl apply -f postgres-deploy.yaml

검증하기

실제로 마운트가 정상적으로 되었는지 확인해보자.
우선 pod이름을 알아낸다.

$ kubectl get pod

이후 pod안쪽으로 접속해보자.

$ kubectl exec -it pod이름 -- /bin/bash

이후 마운트 정보를 보면 /data가 약 100GB로 정상적으로 마운트 된것을 볼 수 있다.

bash-4.4# df -h
Filesystem                Size      Used Available Use% Mounted on
overlay                  48.4G      8.6G     39.8G  18% /
tmpfs                     3.9G         0      3.9G   0% /dev
tmpfs                     3.9G         0      3.9G   0% /sys/fs/cgroup
/dev/vdb                 98.3G     59.6M     93.2G   0% /data
/dev/vda1                48.4G      8.6G     39.8G  18% /dev/termination-log
/dev/vda1                48.4G      8.6G     39.8G  18% /etc/resolv.conf
/dev/vda1                48.4G      8.6G     39.8G  18% /etc/hostname
/dev/vda1                48.4G      8.6G     39.8G  18% /etc/hosts
shm                      64.0M      8.0K     64.0M   0% /dev/shm
/dev/vda1                48.4G      8.6G     39.8G  18% /var/lib/postgresql/data
tmpfs                     3.9G     12.0K      3.9G   0% /run/secrets/kubernetes.io/serviceaccount
tmpfs                     3.9G         0      3.9G   0% /proc/kcore
tmpfs                     3.9G         0      3.9G   0% /proc/timer_list
tmpfs                     3.9G         0      3.9G   0% /proc/timer_stats
tmpfs                     3.9G         0      3.9G   0% /proc/sched_debug
tmpfs                     3.9G         0      3.9G   0% /sys/firmware