[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
디렉토리를 마운트하여 여러 노드가 동시에 읽고 쓸 수 있는 공유 스토리지를 제공합니다.
Comments powered by Disqus.