쿠버네티스 - Volume
Volume은 쿠버네티스에서 Pod 내의 컨테이너가 파일 데이터를 공유하거나 유지할 수 있도록 지원하는 기능이다. 컨테이너는 일시적이고 재시작되면 데이터가 사라질 수 있지만, Volume을 활용하면 파드 또는 노드의 파일 시스템을 사용하여 데이터를 유지할 수 있다.
다양한 볼륨 유형이 있으며, 그 중 가장 많이 사용되는 것이 emptyDir, hostPath, 그리고 PersistentVolume(PV) / PersistentVolumeClaim (PVC) 이다.
1. emptyDir
- emptyDir은 파드가 생성될 때 빈 디렉토리를 제공하고, 파드가 삭제될 때 해당 디렉토리도 삭제되는 임시 볼륨이다.
예시 yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-1
spec:
containers:
- name: container1
image: kubetm/init
volumeMounts:
- name: empty-dir
mountPath: /mount1 # 이 컨테이너는 /mount1 디렉토리에 emptyDir 볼륨을 마운트
- name: container2
image: kubetm/init
volumeMounts:
- name: empty-dir
mountPath: /mount2 # 이 컨테이너는 /mount2 디렉토리에 동일한 emptyDir 볼륨을 마운트
volumes:
- name: empty-dir
emptyDir: {} # emptyDir 볼륨 정의
- 위 예시 Pod는 두 개의 컨테이너를 포함하며, 두 컨테이너가 같은 "emptyDir" 볼륨을 공유한다.
- container1은 /mount1, container2는 /mount2에 동일한 볼륨을 마운트한다.
- 컨테이너 간에 데이터를 공유하거나, 로그 파일 등을 저장하는데 유용하다. 하지만 파드가 삭제되면 데이터도 사라지는 점에 유의해야한다.
2. hostPath
- hostPath는 노드(호스트)의 파일 시스템을 파드 내부의 디렉토리로 마운트한다. 즉, 파드는 노드의 특정 경로에 접근할 수 있으며, 데이터를 해당 경로에 저장한다.
- 노드에 있는 디렉토리나 파일을 직접 사용할 수 있지만, 이것은 노드에 종속된다는 것을 의미하기 때문에 클러스터 간 이동성이 떨어진다.
예시 yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-3
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1 # 이 파드는 k8s-node1 노드에서만 실행됨
containers:
- name: container
image: kubetm/init
volumeMounts:
- name: host-path
mountPath: /mount1 # hostPath 볼륨을 /mount1에 마운트
volumes:
- name: host-path
hostPath:
path: /node-v # 이 경로는 노드의 실제 경로로, 없으면 아래 타입에 따라 생성
type: DirectoryOrCreate # 경로가 없으면 디렉토리를 생성
- hostPath는 노드의 /node-v 경로를 파드 내부의 /mount1 경로에 마운트한다. 이는 특정 파일이나 디렉토리를 호스트(노드) 시스템에 영구적으로 저장할 수 있는 방식이다.
- 위 예제에서는 DirectoryOrCreate 타입이 사용되어, 경로가 없을 경우 노드에서 해당 경로가 생성되게 했다.
- 이 볼륨을 사용하면 데이터가 호스트에 영구적으로 저장되지만, 클러스터 간의 이동성이 제한된다.
3. PVC /PV
- PersistentVolume (PV)와 PersistentVolumeClaim (PVC)는 Kubernetes 클러스터 내에서 영구적인 스토리지를 제공하는 방식이다.
- 이를 통해 클러스터의 여러 파드가 스토리지를 지속적으로 사용할 수 있다.
- PV는 관리자(Admin)에 의해 클러스터에서 제공되고, PVC는 사용자가 특정 스토리지를 요청하는 방식이다.
1. PV 정의 생성
- PV는 관리자(Admin)가 사전에 정의하는 스토리지 자원이다. 관리자는 로컬 스토리지나 AWS, NFS 같은 외부 스토리지를 PV로 정의할 수 있다.
- 위 이미지에서는 두 개의 PV가 정의됐다. 관리자가 여러 개의 스토리지 자원을 클러스터에 등록해 두는 경우이며, 각 PV는 다양한 스토리지 백엔드를 사용할 수 있음
2. PVC 생성
- PVC는 사용자(User)가 특정 스토리지 자원을 "요청"하는 방식이다. 사용자는 필요한 스토리지 용량과 접근 방식(읽기/ 쓰기 등)을 PVC에 명시한다.
- 사용자가 PVC를 생성하면, Kubernetes는 미리 정의된 PV중에서 사용자의 요구에 맞는 PV를 찾아 PVC와 연결해준다.
3. PV와 PVC 연결
- PVC가 생성되면, Kubernetes는 적절한 PV와 PVC를 자동으로 연결한다. 이 연결은 사용자가 요청한 스토리지 요구사항(PVC)과 일치하는 PV를 찾아서 이루어진다.
- 즉, 사용자가 특정 용량이나 접근 권한을 요청하면, 관리자가 사전에 정의한 PV 중에서 적합한 스토리지를 찾아 PVC와 연결한다.
4. Pod에서 PVC 마운트
- PVC가 PV와 연결되면 사용자는 Pod를 생성하면서 PVC를 마운트할 수 있다. Pod에서 PVC를 마운트하면, 해당 Pod는 PV에서 제공하는 스토리지에 접근할 수 있게 된다.
- Pod 내부의 컨테이너는 PVC를 통해 영구적인 스토리지에 데이터를 저장하거나, 기존 데이터를 읽을 수 있다.
PersistentVolume(PV) 예시 yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-03
spec:
capacity:
storage: 2G # 이 PV는 2GB의 스토리지를 제공
accessModes:
- ReadWriteOnce # 하나의 파드에서만 읽고 쓸 수 있음
local:
path: /node-v # 로컬 디스크 경로
nodeAffinity: # 이 PV는 k8s-node1 노드에만 연결
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
- 이 PV는 2GB의 스토리지를 제공하며, /node-v 경로에 있는 데이터를 저장한다. 이 PV는 특정 노드에서(k8s-node1)만 사용 가능하도록 제한했다.
- ReadWriteOnce로 설정되어 하나의 파드에서만 읽고 쓸 수 있다.
PersistentVolumeClaim (PVC) 예시 yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-01
spec:
accessModes:
- ReadWriteOnce # 하나의 파드에서만 접근 가능
resources:
requests:
storage: 1G # 1GB 스토리지를 요청
storageClassName: "" # 기본 스토리지 클래스를 사용하지 않음
- pvc-01은 1GB의 스토리지를 요청하며, 앞서 PV예제의 pv-03과 일치하는 PV를 찾게된다.
- PVC는 특정 파드에서 PV를 사용할 수 있게 연결하는 역할을 한다.
PVC를 사용하는 Pod 예시 yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-3
spec:
containers:
- name: container
image: kubetm/init
volumeMounts:
- name: pvc-pv
mountPath: /mount3 # PVC를 /mount3에 마운트
volumes:
- name: pvc-pv
persistentVolumeClaim:
claimName: pvc-01 # pvc-01을 사용하는 볼륨
- 이 파드는 pvc-01로 연결된 PV를 /mount3 경로에 마운트하여 사용한다. 이를 통해 파드는 1GB의 스토리지를 지속적으로 사용할 수 있다.
PV-PVC를 Label과 Selector로 연결하는 방법
- Label, Selector 참고 포스팅 글
2024.10.04 - [DevOps] - 쿠버네티스 - Label, Label Selector, Node Selector
쿠버네티스 - Label, Label Selector, Node Selector
Label, Label SelectorLabel은 쿠버네티스에서 오브젝트를 식별하고 그룹화하는 키-값 쌍이다. Label Selector는 이러한 label을 사용해 특정 리소스를 선택하는 메커니즘이다. 이를 통해 서비스나 다른 리소
pjs-world.tistory.com
- PV와 PVC를 더 구체적으로 연결할 때, label과 selector를 사용할 수 있다.
- 이를 통해 특정 레이블을 가진 PV만을 특정 PVC와 연결할 수 있다.
Label과 Selector를 사용한 PV 예시 yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-04
labels:
pv: pv-04 # 레이블 pv: pv-04 추가
spec:
capacity:
storage: 2G
accessModes:
- ReadWriteOnce
local:
path: /node-v
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
Label과 Selector를 사용한 PVC 예시 yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-04
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2G # 2GB 스토리지를 요청
storageClassName: ""
selector:
matchLabels:
pv: pv-04 # 레이블이 pv: pv-04인 PV를 선택
Volume 간 비교 정리
볼륨 유형 | 설명 | 장점 | 단점 | 사용 예시 | |
1 | emptyDir | Pod가 생성될 때 빈 디렉토를 제공하며, 파드가 삭제되면 볼륨도 함께 삭제된다. 임시 데이터 공유에 적합 | 간단하고 빠르게 설정 가능. 동일 파드 내 여러 컨테이너 간 데이터 공유에 적합 | 파드가 삭제되면 데이터도 함께 삭제됨. | 여러 컨테이너가 일시적으로 데이터를 공유해야 하는 경우 (예: 로그 파일 공유) |
2 | hostPath | 노드(호스트)의 파일 시스템을 파드 내부에 마운트. 노드에 있는 파일을 사용하거나 데이터를 저장할 수 있다. | 호스트의 파일 시스템을 활용해 영구 저장 가능. 특정 노드에 고정된 스토리지 사용에 유리 | 노드에 종속적이라 클러스터 내에서 파드 이동 시 데이터 접근이 불가능 | 특정 노드의 데이터를 사용하거나, 로컬 파일 시스템에 저장해야 할때 (예: 로그 파일 저) |
3 | PV / PVC | 클러스터 내에서 영구적인 스토리지를 제공. PV는 관리자가 정의하고, PVC는 사용자가 요청하는 방식 | 스토리지의 영구적 사용 가능. 클러스터 내 파드 간 이동성 및 스토리지 공유 가능. 다양한 스토리지 백엔드 지 | PVC 요청에 맞는 PV가 없는 경우 연결 불가. 설정이 다소 복잡할 수 있음 | 데이터베이스와 같이 영구적인 스토리지가 필요한 애플리케이션에 사용 (예: MySQL 데이터 저장소) |