[Kubernetes] Volume 관리

쿠버네티스의 파드도 컨테이너와 마찬가지로 삭제/생성을 반복하므로 데이터를 별도 볼륨에 저장할 필요가 있다.

1. Volumes & Mounts

  • 가장 간단하게 호스트 디렉터리를 마운트하는 방법
spec:
  containers: 
  - image: alpine
    name: alpine
    volumeMounts: 
    - mountPath: /opt
      name: data-volume

  volumes: 
  - name: data-volume
    hostPath:
      path: /data
      type: Directory

위와 같은 방법으로는 여러 노드의 클러스터 구성에서 사용이 불가능하다. 각 호스트마다 데이터가 공유되지 않기 떄문이다. 실제 클러스터 환경에서 운영하려면 스토리지 솔루션을 사용해야 한다.

  • NFS
  • GlusterFS
  • AWS EBS
volumes:
- name: data-volume
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

2. Persistent Volumes

볼륨을 파드 정의 문서로 매번 관리하다 보면 스토리지 솔루션이 변경될 때마다 모든 문서를 변경해야 하는 문제가 발생한다. Persistent Volume은 Volume을 중앙에서 클러스터 풀 형태로 관리할 수 있게 해준다.

apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv-vol1
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 1Gi
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

3. Persistent Volume Claims

관리자가 PV를 생성하면 사용자는 PVC를 생성하여 사용할 볼륨을 요청한다. 각 PVC는 하나의 PV에 바인딩 될 수 있다. 쿠버네티스는 PVC의 볼륨 사이즈와 옵션값에 맞는 PV를 찾아 바인딩 해준다. 만약 PVC에 비해 큰 PV만 남아있다면 매칭될 수 있다. PV와 PVC는 1대1 관계이므로 PV 사이즈가 커서 PVC에 할당하고 남더라도 다른 PVC가 추가 할당 될 수 없다. 할당할 수 있는 PV가 없으면 PVC는 pending 상태가 된다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:  
      storage: 500Mi

생성된 pvc를 확인하거나 삭제할 수 있고 삭제 시 옵션은 몇 가지가 있다. 기본값은 Retain이며 PVC는 삭제해도 PV는 남아서 관리자가 직접 삭제해야 한다.

  • persistentVolumeReclaimPolicy
    • Retain : PVC만 삭제
    • Delete : PVC를 삭제하면 PV도 같이 자동 삭제
    • Recycle : PV 내 데이터만 삭제 후 다시 PVC에 할당 가능한 상태로 변환
  • PVC를 파드에 사용하는 방법
apiVersion: v1
kind: Pod
metadata: 
  name: mypod
spec:
  containers:
  - name: myfrontend
    image: nginx
    volumeMounts:
    - mountPath: "/var/www/html"
      name: mypd
  volumes:
  - name: mypd
    persistentVolumeClaim:
      claimName: myclaim

4. Storage Class

PV 정의문서를 보면 알 수 있듯이 PV를 생성하기 전에 먼저 볼륨을 사용할 수 있게 생성해야 한다. PV 생성 시에 필요한 볼륨을 자동으로 생성하게 한다면 편리할 것이다. 이것이 Storage Class이다. 일반적으로 클라우드 벤더들이 제공하는 스토리지 서비스가 스토리지 타입, 복제 지원 여부 등으로 등급을 나눠서 제공하는데 이 등급별로 미리 정의 해놓은 다음 PVC를 생성할 때 사용하는 것이다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata: 
  name: silver

provisioner: kubernetes.io/gce-pd

parameters:
  type: pd-standard
  replication-type: none

'Kubernetes' 카테고리의 다른 글

[Kubernetes] Namespace  (0) 2021.02.21
[Kubernetes] Authentication  (0) 2021.02.01
[Kubernetes] Network Policy  (0) 2021.01.19
[Kubernetes] 권한 관리(RBAC)  (0) 2020.12.30
[Kubernetes] 백업, 복구  (0) 2020.12.23