이번 글에서는 Kubernetes의 기본 오브젝트 중 하나인 Volume에 대해 정리하려고 한다.
목차는 다음과 같다.
1. What is Volume?
2. Volume - emptyDir
3. Volume - hostPath
4. Volume - PVC/PV
5. 정리
1. What is Volume?
Volume은 정의 하면 다음과 같다.
Pod 또는 Pod내 컨테이너들이 데이터를 저장하고 공유할 수 있도록 제공하는 스토리지 영역
그렇다면 이러한 `Volume`은 왜 쓰는 것일까?
일반적으로 컨테이너는 내부 파일시스템을 사용하지만 컨테이너가 재시작되거나 `Pod`가 삭제되면 데이터도 함께 사라진다.
이미지 내부에 들어가 있는 데이터들은 삭제되더라도 상관없을 수 있지만, 만약 로그 파일을 보관해야 한다거나 DB를 사용할 경우 실시간으로 생성되던 데이터가 사라지면 큰 장애가 발생하게 된다.
이러한 이유로 컨테이너를 사용할 때 중요한 데이터가 있다면 `Volume`을 사용하여 데이터를 보관해주어야 한다.
`Volume` 역시 사용 목적에 따라 여러가지 유형이 있다.
- emptyDir
- hostPath
- PVC(Persistent Volume Claim)/PV(Persistent Volume)
이제 각각에 대해 알아보자
2. Volume - emptyDir
`emptyDir`은 Pod내 컨테이너들끼리 데이터를 임시로 공유하기 위해서 Volume을 사용하는 것이다.
이름이 emptyDir인 이유는 최초 이 Volume이 생성될 때 Volume의 내용이 비어있기 때문이라고한다.
위 그림과 같이 서로 다른 서버 역할을 하는 컨테이너들이 있다고 했을 때, 이러한 Volume을 이용하여 두 서버가 파일을 주고받을 필요없이 편하게 사용 가능하다.
하지만, 이러한 Volume은 Pod안에 생성되기 때문에 Pod에 문제가 생겨 재생성되면 데이터가 없어지는 단점이 있다.
따라서 emptyDir Volume은 Pod 내 컨테이너들이 데이터나 파일을 공유해서 쓰되 언제 삭제되도 상관 없을 때 사용된다.
emptyDir Volume의 활용사례로는 컨테이너 간 데이터 공유, 임시 캐시 저장소, 로그 파일 공유등이 있다.
위 그림처럼 Pod내 emptyDir Volume을 함께 구성하는 yaml 파일은 다음과 같다.
apiVersion: v1
kind: Pod
metadata:
name: <pod_name>
spec:
containers:
- name: container1
image: <image_name>
volumeMounts:
- name: empty-dir
mountPath: /mount1
- name: container2
image: <image_name>
volumeMounts:
- name: empty-dir
mountPath: /mount2
volumes:
- name : empty-dir
emptyDir: {}
이 yaml 파일에 대해 설명해보자면, 먼저 하나의 Pod를 생성한다.
Pod 내에는 두 개의 컨테이너(container1, container2)가 존재한다.
각 컨테이너는 동일한 emptyDir Volume을 마운트하지만 마운트 위치가 다르다.(각각 /mount1, /mount2)
즉, container1은 /mount1 디렉터리에 emptyDir Volume을 마운트, container2는 /mount2 디렉터리에 emptyDir Volume을 마운트한다.
이는 만약 container1이 /mount1에 데이터를 저장해도, container2는 /mount2를 통해 접근이 가능하다.
그리고 마지막에 emptyDir Volume을 정의해 Pod가 실행될 때 빈 디렉터리를 생성한다. 이는 모든 컨테이너가 공유 가능하다.
3. Volume - hostPath
hostPath Volume은 Pod들이 올라가진 노드의 파일 시스템을 Volume으로써 사용하는 것이다.
이를 통해, emptyDir과 다르게 Pod가 올라간 노드들의 로컬 파일시스템을 Pod들이 공유하기 떄문에 Pod가 죽어도 노드의 Volume은 계속 살아있다.
하지만 이는 다음과 같은 문제가 있다.
위 그림과 같이, 만약 Pod가 죽어서 노드1이 아닌 노드2에 재생성되면 노드1의 Volume을 사용할 수 없다는 것이다.
임시적인 해결방법은 위 그림과 같이, 노드마다 똑같은 경로를 만들어서 노드에 있는 path끼리 마운트 시켜주면 해결 가능하다. 하지만, 이는 Kubernetes가 자체적으로 해주는 것은 아니다.
즉, 관리자가 리눅스 시스템의 마운트 기술을 사용하는 것인데 결국 자동화가 아니니 안정적이지 않다.
따라서, 단일 노드 환경에서는 유용할 수 있지만, 다중 노드 환경에서는 유용하지 못할 수 있다.
이러한 hostPath의 활용사례로는 노드의 특정 파일/디렉토리 활용, 하드웨어 장치 접근, 로컬 캐싱 또는 영구 데이터 저장, 로깅 모니터링 등이 있다.
emptyDir과 hostPath를 비교해보면 다음과 같다.
hostPath | emptyDir | |
데이터 저장 위치 | 노드의 특정 디렉토리 | Pod가 실행되는 노드의 임시 공간 |
데이터 유지 여부 | Pod 삭제 후에도 유지 | Pod 삭제 시 데이터 삭제 |
사용 목적 | 노드의 특정 파일/디렉토리 활용 | Pod 내 컨테이너 간 임시 데이터 공유 |
hostPath Volume과 Pod를 연결하여 구성하는 yaml 파일은 다음과 같다.
apiVersion: v1
kind: Pod
metadata:
name: <pod-name>
spec:
containers:
- name: <containter-name>
image: <image-name>
volumeMounts:
- name: host-path
mountPath: /mount1
volumes:
- name : host-path
hostPath:
path: /node-path
type: DirectoryOrCreate # path가 없으면 생성
이 yaml 파일에 대해 설명해보자면, 먼저 하나의 Pod를 생성한다.
Pod가 생성되는 노드의 /node-path라는 디렉토리를 컨테이너의 마운트한다.
DirectoryOrCreate는 /node-path가 존재하지 않으면 자동으로 생성하고, 이미 존재하면 그대로 사용하게 한다.
Pod내 컨테이너 내부에는 /mount1 경로를 생성하고, hostPath에서 마운트한 데이터를 연결한다.
이를 통해, 노드의 /node-path에 저장한 파일을 컨테이너 내부에서 /mount1을 통해 확인할 수 있다.
4. Volume - PVC(Persistent Volume Claime)/PV(Persistent Volume)
앞서의 emptyDir과 hostPath와 달리 데이터를 Pod의 라이프사이클과 독립적으로 관리하려면 PV와 PVC를 사용해야한다.
이러한 PV와 PVC는 Pod에 영속성 있는 Volume을 제공한다.
먼저, 각각에 대해 알아보자
Persistent Volume(PV)
- PV는 클러스터에서 관리하는 저장소 리소스
- 관리자가 사전에 정의해서 클러스터 내에서 여러 Pod들이 사용할 수 있도록 제공
- Pod가 직접 생성하는 것은 아님
- 물리적인 스토리지(NFS, Ceph, AWS EBS 등)을 사용할 수 있음
Persistent Volume Claim(PVC)
- Pod가 PV에게 요청하는 방식
- Pod가 직접 PV를 사용하지 않고, PVC를 통해 원하는 스토리지를 요청
- PVC가 PV와 연결되면 Pod는 PVC를 통해 데이터를 저장하고 읽을 수 있음
즉, PV는 스토리지를 클러스터에서 사전에 할당한 Volume이고, PVC는 Pod가 PV를 사용하기 위해 요청하는 객체이다.
PVC가 PV와 바인딩되면, PVC를 참조하는 Pod는 해당 PV를 사용할 수 있다.
이를 이용하기 위해서는 다음과 같은 단계를 따라야한다.
- 관리자가 Persistent Volume(PV)를 생성 (클러스터에서 사용할 물리적인 저장소 할당)
- 사용자가 Persistent Volume Claim(PVC)를 생성
- PVC가 PV를 요청하고 바인딩 (PVC에 요청한 조건에 맞는 PV가 있으면 자동으로 바인딩)
- Pod가 PVC를 사용하여 PV의 데이터를 읽고 쓸 수 있음
Pod가 바로 PV에 연결하지 않는 이유는 Kubernetes는 User와 Admin으로 영역을 나눠서 관리하기 때문이다.
Admin은 Kubernetes 관리자, User는 Pod에 서비스를 만들고 배포를 담당하는자이다.
즉, PV는 관리자(Admin)가 관리하여 개발자가 직접 스토리지에 접근하지 못하도록하고, PVC만 요청할 수 있도록 역할을 분리한다.
hostPath와 PVC/PV를 비교해보면 다음과 같다.
hostPath | Persistent Volume | |
노드 종속성 | 특정 노드에 종속 | 클러스터 전체 노드에서 사용 가능 |
데이터 유지 | Pod가 다른 노드로 이동하면 데이터 손실 | PVC를 통해 지속적인 스토리지 제공 |
다중 Pod 지원 | 같은 노드에 있는 Pod들만 사용 가능 | 노드 전체의 여러 Pod에서 PVC로 공유가능 |
스토리지 타입 | 노드의 로컬 디렉토리 사용 | 로컬 및 외부의 다양한 스토리지 제공 |
PV를 정의하는 yaml 파일은 다음과 같다. 아래 yaml 파일은 aws ebs를 사용하는 PV이다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: <PV-name>
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: <storageClass-name>
awsElasticBlockStore:
volumeID: vol-xxxxxxxx
fsType: ext4
PVC를 생성하고 PV와 바인딩하는 yaml 파일은 다음과 같다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: <PVC-name>
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: <storageClass-name>
PVC와 연결하는 Pod를 구성하는 yaml 파일은 다음과 같다.
apiVersion: v1
kind: Pod
metadata:
name: <pod-name>
spec:
containers:
- name: container
image: <image-name>
volumeMounts:
- name: pvc-pv
mountPath: /mount1
volumes:
- name : pvc-pv
persistentVolumeClaim:
claimName: <pvc-name>
이는 PVC를 사용하여 Pod의 스토리지를 연결하는 설정이다.
5. 정리
Volume - emptyDir
- emptyDir은 컨테이너 간 데이터를 공유하는 임시 스토리지
- Pod가 삭제되면 데이터도 함께 삭제됨
- Pod내 여러 컨테이너에서 동일한 Volume을 서로 다른 경로에 마운트 가능
- 임시 저장소, 캐시, 로그 공유 등의 용도로 활용 가능
emptyDir Volume을 통해 Pod 내 컨테이너들이 데이터를 효과적으로 공유할 수 있으며, 임시 스토리지를 쉽게 사용할 수 있다.
하지만, Pod가 삭제되면 데이터도 함께 삭제되니 주의가 필요하다.
Volume - hostPath
- 노드의 파일 시스템을 Pod에 마운트하는 Volume
- Pod가 삭제되더라도 노드에 데이터가 남아 있음
- 노드의 특정 디렉토리, 파일 장치 접근이 필요할 때 유용
- 노드1의 Pod가 삭제되고 노드 2에 재생성 되면 노드1의 hostPath를 사용할 수 없음 즉, 다중 노드 환경에서는 유용하지 못 할 수 있음
이러한 hostPath Volume은 단일 노드 환경에서는 적합하지만, 다중 노드 환경에서는 Persistent Volume 같은 대안을 고려하는게 좋다.
Volume - PVC/PV
- PV(Persistent Volume): 클러스터에서 관리하는 고정된 저장소 리소스
- PVC(Persistent Volume Claim): Pod가 PV를 요청하는 객체
- PVC와 PV가 바인딩되면, Pod는 PVC를 이용하여 데이터를 읽기 및 쓰기가 가능
- PVC/PV를 이용하면 다중 노드 환경에서 안정적인 데이터 읽기 및 쓰기를 제공
이러한 PVC/PV를 이용하면 여러 노드에서도 데이터를 유지할 수 있다. 따라서, Kubernetes에서 안정적인 데이터 저장을 위해 PVC/PV를 활용하면 좋을 것 같다.
'Docker 및 Kubernetes > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubernetes 기본 오브젝트 - Service (0) | 2025.02.06 |
---|---|
[Kubernetes] Kubernetes 기본 오브젝트 - Pod (0) | 2025.02.04 |
[Kubernetes] Kubernetes Dashboard 설정 (0) | 2025.01.23 |
[Kubernetes] Kubernetes 설치 (0) | 2025.01.23 |
[Kubernetes] Kubernetes란? (0) | 2025.01.22 |