Post

[Kubernetes] 저장 볼륨(Storage Volume)

Kubernetes Storage Volume 이해

Kubernetes에서 스토리지 볼륨(Volume)은 Pod에 데이터를 저장하고 관리하는 방법을 제공합니다. Pod는 컨테이너로 구성되어 있으며, 컨테이너는 일시적인 환경을 제공하기 때문에 컨테이너가 재시작되면 데이터가 손실될 수 있습니다. 이를 방지하기 위해 Volume을 사용하여 데이터를 지속적으로 저장하고 여러 컨테이너 간에 데이터를 공유할 수 있습니다. 이번 포스팅에서는 Kubernetes의 다양한 볼륨 타입과 그 활용법을 알아보겠습니다.

1. Kubernetes Volume 개념

Kubernetes에서 제공하는 다양한 Volume 유형은 다음과 같습니다:

  • emptyDir: Pod가 생성될 때 빈 디렉터리를 제공하며, Pod가 삭제되면 함께 삭제됩니다.
  • hostPath: 호스트 노드의 파일 시스템을 마운트하여 사용할 수 있는 볼륨.
  • Persistent Volumes (PV): 클러스터 관리자가 사전 설정한 저장소를 사용자가 PVC로 요청하는 방식으로 제공되는 볼륨.
  • Persistent Volume Claims (PVC): 사용자가 PV에 요청하여 저장소를 사용할 수 있도록 하는 객체.
  • Storage Class: 동적으로 스토리지를 할당할 때 사용하는 클래스를 정의.

이 외에도 Ceph, NFS, AWS EBS 등 다양한 스토리지 제공자를 지원합니다.

2. emptyDir 볼륨

emptyDir는 가장 기본적인 볼륨 유형으로, Pod가 생성되면 빈 디렉터리가 생성되고 Pod가 삭제되면 그 데이터도 사라집니다. 이는 여러 컨테이너가 데이터를 공유하는 데 유용합니다.

예시: Multi-container Pod에서 emptyDir 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
yaml
apiVersion: v1
kind: Pod
metadata:
  name: temp-pod1
spec:
  volumes:
  - name: temp-vol
    emptyDir: {}
  containers:
  - name: container1
    image: ubuntu:14.04
    volumeMounts:
    - name: temp-vol
      mountPath: /mount1
  - name: container2
    image: ubuntu:14.04
    volumeMounts:
    - name: temp-vol
      mountPath: /mount2

이 Pod는 두 개의 컨테이너가 같은 emptyDir 볼륨을 공유하여 /mount1/mount2 경로에 데이터를 저장하고, 컨테이너 간에 데이터를 공유할 수 있게 설정됩니다.

3. hostPath 볼륨

hostPath는 호스트 노드의 파일 시스템 경로를 Pod에 마운트하는 방법입니다. 이를 사용하면 호스트 시스템에 저장된 데이터를 Pod에서 접근할 수 있습니다.

예시: hostPath를 사용한 Pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
yaml
apiVersion: v1
kind: Pod
metadata:
  name: host-pod1
spec:
  containers:
  - name: container
    image: ubuntu:20.04
    volumeMounts:
    - name: host-path
      mountPath: /mnt/host
  volumes:
  - name: host-path
    hostPath:
      path: /data
      type: DirectoryOrCreate

이 설정에서는 노드의 /data 경로를 Pod의 /mnt/host로 마운트하여 Pod가 노드의 파일 시스템에 직접 접근할 수 있도록 합니다.

4. Persistent Volume(PV)Persistent Volume Claim(PVC)

Kubernetes에서 PV는 클러스터의 저장소를 관리자가 설정하여 제공하는 객체입니다. PVC는 사용자가 해당 저장소를 요청할 수 있도록 하는 객체입니다. 사용자는 PVC를 통해 필요한 저장소를 요청하고, Kubernetes는 적절한 PV를 할당합니다.

예시: PV와 PVC 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
yaml
# Persistent Volume 설정
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ""
  local:
    path: /mnt/data

# Persistent Volume Claim 설정
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: ""

위 예시는 1Gi의 저장소를 제공하는 PV와 그 PV를 요청하는 PVC 설정을 나타냅니다. PVC를 통해 Pod는 이 저장소를 사용하게 됩니다.

PVC를 사용하는 Pod 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - name: mypvc
      mountPath: /usr/share/nginx/html
  volumes:
  - name: mypvc
    persistentVolumeClaim:
      claimName: pvc1

Pod는 pvc1으로 요청된 볼륨을 /usr/share/nginx/html에 마운트하여 사용할 수 있습니다.

5. 동적 볼륨 할당(StorageClass)

StorageClass는 동적으로 PV를 생성할 때 사용됩니다. 관리자는 StorageClass를 정의하여 PV를 자동으로 생성할 수 있으며, 이를 통해 사용자는 PVC를 통해 필요한 스토리지를 요청할 수 있습니다.

예시: StorageClass 설정

1
2
3
4
5
6
7
8
9
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: none

StorageClass는 Google Cloud Platform의 표준 영구 디스크를 자동으로 프로비저닝하는 역할을 합니다.

6. 실습: NFS를 활용한 스토리지 구성

NFS(Network File System)를 사용하여 여러 노드 간에 데이터를 공유할 수 있습니다. NFS를 사용하면 각 노드에서 동일한 데이터를 공유할 수 있습니다.

NFS 볼륨 설정 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data
    server: nfs-server.example.com

이 설정은 NFS 서버의 /data 디렉토리를 마운트하여 여러 노드가 동시에 읽고 쓸 수 있는 공유 스토리지를 제공합니다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.