핸즈온 3.2 Persistent Volume
Persistent Volume 구성 및 Pod에 생성한 볼륨을 마운트 해보는 실습
로컬 쿠버네티스 환경에서 EmptyDir과 Persistent Volume을 각각 구성하고 Pod에 해당 볼륨을 마운트 해보는 실습
사전 준비 사항
Kind Kubernetes Cluster 구성: 실습 링크
Kubernetes Volume 이해: 관련 링크
Architecture
Ephemeral과 Persistent Volume을 각각 구성하고 Pod에 해당 볼륨을 마운트
1 Ephemeral Volume
임시로 데이터를 적재해야 하는 볼륨을 만들기 위해 볼륨 속성을 emptyDir로 선언한다
1.1 EmptyDir 설정
파드 생성시 emptydir을 볼륨으로 마운트 하도록 설정
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep-1000
spec:
containers:
- name: busybox
image: busybox:1.28
args:
- sleep
- "1000"
volumeMounts:
- mountPath: /data
name: empty-data
volumes:
- name: empty-data
emptyDir: {}
kubectl apply -f busybox-emptydir.yaml
1.2 Volume 확인
# Pod의 Data 디렉토리에 임시 파일 생성
kubectl exec -it busybox-sleep-1000 -- /bin/sh -c "echo abcd > /data/test.txt"
# Pod의 UID 확인
kubectl get pods/busybox-sleep-1000 -o jsonpath='{.metadata.uid}'
# Pod가 기동중인 Node 확인
kubectl get pods/busybox-sleep-1000 -o jsonpath='{.spec.nodeName}'
Pod가 기동중인 Node에서 실제 emptyDir이 만들어져 컨테이너에서 임의로 생성한 파일이 보이는지 확인
# 워커노드 접근을 위한 docker 명령어
docker exec -it $(kubectl get pods/busybox-sleep-1000 -o jsonpath='{.spec.nodeName}') /bin/bash
root@kind-worker3:/# ls -al /var/lib/kubelet/pods/fd0b963c-3ef0-4ebb-be52-258f935f161b/volumes/kubernetes.io~empty-dir/empty-data/
total 12
drwxrwxrwx 2 root root 4096 Aug 3 20:31 .
drwxr-xr-x 3 root root 4096 Aug 3 20:29 ..
-rw-r--r-- 1 root root 5 Aug 3 20:31 test.txt
root@kind-worker3:/# cat /var/lib/kubelet/pods/fd0b963c-3ef0-4ebb-be52-258f935f161b/volumes/kubernetes.io~empty-dir/empty-data/test.txt
abcd
Pod 삭제, 재생성시 빈 볼륨으로 붙는지 확인
kubectl delete pod/busybox-sleep-1000
kubectl apply -f busybox-emptydir.yaml
2 Persistent Volume
데이터를 영구적으로 보관을 위해서는 Persistent Volume을 사용해야 하며 직접 Static 하게 PVC와 PV를 바인딩시켜주는 방법도 있지만 CSI Provider를 통해서 Dynamic 하게 매핑을 시킬 수도 있다. Kind 클러스터 환경에서는 기본으로 local-path-provisioner가 Dynamic Provisioner로 구성이 되어 있어 별도의 CSI Provisioner를 구성할 필요가 없다. 해당 리소스는 local-path-storage
네임스페이스에 구성 되어 있다.
2.1 Persistent Volume Claim 구성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pv-claim
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
kubectl apply -f busybox-data-pvc.yaml
Info
StorageClass에 VOLUMEBINDINGMODE가 WaitForFirstConsumer라면 PV가 실제로 생성되는 시점은 PVC가 생성된 시점이 아닌 실제 파드 리소스가 PVC를 마운트 하는 시점에 생성이 된다
kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
standard (default) rancher.io/local-path Delete WaitForFirstConsumer false 25h
kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/data-pv-claim Pending standard 24s
2.2 Pod 배포 및 Volume 마운트
위에서 요청한 PVC를 BusyBox 파드에 마운트
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep-1000
spec:
containers:
- name: busybox
image: busybox:1.28
args:
- sleep
- "1000"
volumeMounts:
- mountPath: /data
name: data-volume
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: data-pv-claim
kubectl apply -f busybox-pv.yaml
Pod 배포시 Dynamic하게 PV까지 생성되어 PVC에 Bound 된 것을 확인
kubectl get pod,pvc,pv
NAME READY STATUS RESTARTS AGE
pod/busybox-sleep-1000 1/1 Running 0 28s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/data-pv-claim Bound pvc-c2e346e2-c9df-410a-835d-9b1a06eda595 1Gi RWO standard 2m27s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-c2e346e2-c9df-410a-835d-9b1a06eda595 1Gi RWO Delete Bound demo/data-pv-claim standard 24s
Pod의 Data 디렉토리에 임시 파일 생성
kubectl exec -it busybox-sleep-1000 -- /bin/sh -c "echo abcd > /data/test.txt"
2.3 Volume 확인
파드가 생성된 워커 노드에 접근하여 local-path-provisioner 디렉토리에 PV 폴더가 생성되어 생성한 임시 파일이 있는지 확인
# Pod가 기동중인 Node 확인
kubectl get pods/busybox-sleep-1000 -o jsonpath='{.spec.nodeName}'
# 워커노드 접근을 위한 docker 명령어
docker exec -it $(kubectl get pods/busybox-sleep-1000 -o jsonpath='{.spec.nodeName}') /bin/bash
root@kind-worker:/# ls -al /var/local-path-provisioner/pvc-c2e346e2-c9df-410a-835d-9b1a06eda595_demo_data-pv-claim/
total 12
drwxrwxrwx 2 root root 4096 Aug 3 23:03 .
drwxr-xr-x 3 root root 4096 Aug 3 22:57 ..
-rw-r--r-- 1 root root 6 Aug 3 23:03 test.txt
Pod 삭제 및 동일한 PVC를 마운트 하며 재생성
kubectl delete pod/busybox-sleep-1000
kubectl apply -f busybox-pv.yaml
Pod를 삭제하더라도 기존에 작성한 임시 파일이 영구적으로 남아서 읽고 쓰기가 가능한지 확인: Pod는 삭제 되었더라도 Volume은 삭제 하지 않았기 때문에 데이터를 영구적으로 관리 가능
kubectl exec -it busybox-sleep-1000 -- /bin/sh
/ # cd /data/
/data # ls
test.txt
/data # ls -al
total 12
drwxrwxrwx 2 root root 4096 Aug 3 22:07 .
drwxr-xr-x 1 root root 4096 Aug 3 22:38 ..
-rw-r--r-- 1 root root 6 Aug 3 22:07 test.txt
Clean Up
실습 완료 후 kind cluster 삭제
kind delete cluster