본문 바로가기
백엔드 개발

쿠버네티스 볼륨

by browoo97 2023. 3. 27.

쿠버네티스는 로컬 머신에서 실행되지 않기 때문에 다양한 볼륨 유형 및 드라이버를 지원한다. 따라서 데이터를 저장하는 방법은 매우 다양하다. 도커의 볼륨과 같이 로컬 하드 드라이브뿐만 아니라 AWS Elastic Block Store 서비스 등을 사용할 수 있다.

 

중요한 것은 이러한 다양한 유형을 사용하더라도 컨테이너 내부에서 볼륨이 작동하는 방식에 영향을 미치지 않는다는 것이다.

 

-  emptyDir 볼륨 사용하기

볼륨의 수명은 Pod에 연결되어 있기 때문에 Pod를 정의하고 구성하는 위치에 볼륨을 정의해야 한다.

emptyDir유형의 volumes 볼륨을 사용하도록 지정하였고, 값을 {}으로 지정하므로써 emptyDir은 Pod가 시작될 때마다 단순히 새로운 빈 디렉토리를 생성한다. 그리고 Pod가 살아있는 동안 이 디렉토리를 활성 상태로 유지하고 데이터를 채운다.  다음으로  컨테이너가 이 디렉토리에 접근할 수 있도록 volumeMounts를 통해 컨테이너 내부 경로를 지정하여 바인딩해준다.

 

emptyDir 볼륨은 훌륭한 기본 볼륨이지만, 한 가지 단점이 존재한다.

replicas가 여러 개일 경우, 즉 복제본 Pod가 여러 개가 실행 경우엔 어떻게 될까?

-> 기존 리다이렉트된 pod가 아닌 다른 Pod 트랙픽이 전송될 경우 기존에 저장된 데이터를 불러오지 못할 것이다.

 

이 문제를 해결하는 방법 중 1가지는 emptyDir에서 hostPath 드라이버로 변경해주는 것이다. hostPath 유형의 볼륨은 저장 위치를 Pod가 아닌 Pod를 실행하는 실제 머신에 경로를 설정하여 저장한다. 

이로써 여러 Pod들은 호스트 머신의 동일한 경로에서 데이터를 공유할 수 있게 된다.

 

- hostPath 볼륨 사용하기

경로를 처리하는 방법을 알려주는 type도 제공된다. 예를 들어, 아직 존재하지 않는 경우에 생성해야 하는지에 대한 여부가 있다. type 값을 DirectoryOrCreate로 설정하여 디렉토리가 존재하지 않는다면 생성시키도록 하였다.

(Directory로 설정 시  폴더가 생성되어 있는지 않을 경우 폴더에 저장하려 한다면 오류가 발생한다.)

이로써 볼륨이 Pod 대신 호스트 머신에 종속됨으로써 트래픽이 다른 Pod에 리다렉트되더라도 오류가 나지 않게 되었다.

 

하지만 이것에도 Pod가 실행되는 동일한 노드의 Pod만 이 데이터에 액세스되는 한계가 존재한다.

Pod와 노드에 독립적인 볼륨을 사용하고 싶다면 Persistent Volume을 사용하면 된다.

Persistent Volume은 노드 밖 Cluster안에 위치해 있으며 각 노드와 영구 볼륨 클레임(PV Claim)을 통해 연결된다.

 

영구볼륨 위치

 

- Persistent Volume 정의

capacity : 나중에 클러스터에서 실행되는 다양한 Pod에서 사용할 수 있는 capacity를 제어하기를 위한기 때문에 중요하다. 따라서 여기에서 용량을 설정할 수 있다.

 

volumeMode : 저장 유형을 지정하는 키으로 Filesystem, Block 두가지 모드가 존재한다.

 

accessModes : 엑세스 방법에 대한 모드를 지정하는 키이다. ReadWriteOnce, ReadOnlyMany, ReadWriteMany 3가지 옵션이 존재하며 주어진 Pod를 위한 볼륨을 만드는 방법을 정의하며 볼륨을 만들 때만 가능하다. 여기에서 일반적으로 허용되어야 하는 것을 정의하여 이것이 어떻게 만들어질 수 있는지 정의한다.

 

ReadWriteOnce - 볼륨이 단일 노드에 의해, 읽기/쓰기 볼륨으로 마운트될 수 있음을 의미한다.

ReadOnlyMany - 읽기 전용이지만 여러 노드에서 요청할 수 있음을 의미한다. 때문에 hostPath 유형의 경우에는 사용할 수 없다.

ReadWriteMany - 여러 노드에 의해 읽기/쓰기 볼륨으로 마운트될 수 있다. 이것도 마친가지로 hostPath 유형에서는 사용할 수 없다.

 

영구 볼륨 클레임을 사용하여 해당 노드와 영구볼륨을 연결해보자.

클레임은 영구볼륨을 사용하려는 Pod에서 만들어야 한다. 클레임을 만들기 위해선 두 가지 필요하다.

 

1. 클레임 구성

volumeName : 사용하려는 영구 볼륨 네임 지정

resources : 기본적으로 영구 볼륨 정의 시 capacity키에 대응한다.

storage : 영구 볼륨의 capacity에서 정의한 최대 용량 안에서 값을 지정할 수 있다.

 

 

2. 사용하려는 모든 Pod에 연결 작업 

생성한 클레임을 사용하려는 Pod의 spec의 volumes 키에 지정한다.

persistentVolumeClaim 키를 사용하여 연결하려는 영구볼륨이 지정된 클레임을 작성해준다. volumenMounts 키의 경우에는 이전과 같은 경로를 지정할 것이기 때문에 변결할 필요가 없다.

 

이렇게 영구볼륨의 사용으로 볼륨을 Node와 Pod에서 독립저인 볼륨을 사용할 수 있게 되었다.

 

 

- 쿠버네티스 ConfigMap을 사용하여 환경변수 지정하기

ConfigMap 파일 생성

 

 

Pod 정의 시 env 키를 사용하여 환경변수 지정하기

name : 코드에 노출되는 환경 변수의 이름을 지정

valueFrom : 환경 변수에 대한 value를 설정하는 대신 valueFrom 키로 값을 변경

configMapKeyRef -> name : 키 참조를 통해 사용할 ConfigMap의 이름 지정

configMapKeyRef -> key : 불러올 데이터의 키 지정

 

 

 

'백엔드 개발' 카테고리의 다른 글

비동기와 멀티스레딩  (0) 2025.02.23
쿠버네티스 configuration 파일  (0) 2023.02.21
쿠버네티스 구조  (0) 2023.02.21
관리형 데이터베이스 서비스  (5) 2023.01.09
Docker 다중 컨테이너 배포  (4) 2023.01.04

댓글