lapee79's Tech Blog

lapee79의 기술 지식 창고.

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

PersistentVolumePersistentVolumeClaim 이 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 액세스를 허용합니다.

이는 소프트웨어 정의 스토리지 시스템과 데이터베이스 리플리케이션 같은 작업에 적합합니다. 이와 같은 특수한 애플리케이션이 아니라면 고가용성, 지속성을 가지는 원격 스토리지를 사용하는 것이 좋습니다.

comments powered by Disqus