Kubernetes에서 Local Persistent Volume을 사용하여 local disk 사용
Local Persistent Volume 기능은 Kubernetes 1.14에서 GA 되었습니다. Local Persistent Volume은 한 Kubernetes Node에 직접적으로 장착된 local disk를 가리킵니다.
Kubernetes에서 HostPath
, LocalVolume
을 통해 local disk를 사용할 수 있습니다.
- HostPath: 스케쥴링 정보를 가지지 않은 볼륨. 각각의 pod를 한 node에 고정하려고 한다면 pod 정의에 nodeSelector같은 스케쥴링 정보를 설정해야 합니다.
- LocalVolume: 볼륨 자체적으로 스케쥴링 정보를 가지며, 이 볼륨을 사용하는 pod는 특정 node에 고정할 수 있으므로 데이터 연속성을 보장할 수 있습니다.
Local Persistent Volumes
는 표준 PVC 객체를 사용한 local disk에 엑세스를 허용합니다.
WaitForFirstConsumer Binding mode를 가지는 StorageClass를 생성
먼저 volume topology-aware scheduling 를 활성화하도록 volumeBindingMode: WaitForFirstConsumer
설정을 가지는 StorageClass를 생성해야 합니다. 이 모드는 Kubernetes에서 pod가 스케쥴링 될 때까지 PVC 바인드를 대기하도록 해줍니다.
cat << EOF | kubectl apply -f -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
호스트에서 볼륨 준비
# 이 명령어들을 POD가 생성될 worker node 상에서 실행합니다.
mkdir -p /data/volumes/pv1
chmode 777 /data/volumes/pv1
Local PersistentVolume 생성
local-storage
StorageClass 를 참조하는 PersistentVolume
을 생성합니다.
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-local-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/volumes/pv1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-worker-01
EOF
persistentvolume/test-local-pv created
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-local-pv 10Gi RWO Retain Available local-storage 17s
PersistentVolumeClaim 생성
local-storage
StorageClass 를 참조하는 PersistentVolumeClaim
를 생성합니다.
cat << EOF | kubectl apply -f -
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-storage
resources:
requests:
storage: 10Gi
EOF
persistentvolumeclaim/test-pvc created
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-pvc Pending local-storage 27s
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-local-pv 10Gi RWO Retain Available local-storage 33s
POD가 아직 생성되지 않았으므로 test-local-pv
의 상태는 Available로 표시됩니다.
local persistent volume을 가지는 POD를 생성
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: test-local-vol
labels:
name: test-local-vol
spec:
containers:
- name: app
image: busybox
command: ['sh', '-c', 'echo "The local volume is mounted!" > /mnt/test.txt && sleep 3600']
volumeMounts:
- name: local-persistent-storage
mountPath: /mnt
volumes:
- name: local-persistent-storage
persistentVolumeClaim:
claimName: test-pvc
EOF
pod/test-local-vol created
kubectl get pods
NAME READY STATUS RESTARTS AGE
test-local-vol 1/1 Running 0 8s
PersistentVolume 와 PersistentVolumeClaim 이 Bound 되었음을 확인할 수 있습니다.
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-pvc Bound test-local-pv 10Gi RWO local-storage 57s
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-local-pv 10Gi RWO Retain Bound default/test-pvc local-storage 104s
호스트의 경로에 생성된 파일의 내용을 확인할 수 있습니다.
cat /data/volumes/pv1/test.txt
The local volume is mounted!
요약
원격 persistent storage와 비교했을 때, Local Persistent Volume의 주요 장점은 성능입니다. 일반적으로 local disk는 높은 IOPS와 throughput 그리고 낮은 지연시간이 특징입니다. Kubernetes의 local volume은 다음과 같은 기능들을 제공합니다.
- PVC는 POD가 생성된 후에 Local Persistent Volume을 바운드 합니다.
- 일단 Local Persistent Volume이 PVC에 바운드되면 POD가 죽거나 삭제되더라도 바운드 상태를 유지합니다.
- 신규 POD가 동일한 PVC를 참조한다면 Local volume에 있는 기존 데이터를 가질 수 있습니다.
- NFS와 유사하게 Kubernetes의 Local Persistent Volume은 다수의 POD들이 read/write 액세스를 허용합니다.
이는 소프트웨어 정의 스토리지 시스템과 데이터베이스 리플리케이션 같은 작업에 적합합니다. 이와 같은 특수한 애플리케이션이 아니라면 고가용성, 지속성을 가지는 원격 스토리지를 사용하는 것이 좋습니다.