DevOps/Kubernetes

쿠버네티스 - Volume

재성스 2024. 10. 8. 14:56
반응형

Volume은 쿠버네티스에서 Pod 내의 컨테이너가 파일 데이터를 공유하거나 유지할 수 있도록 지원하는 기능이다. 컨테이너는 일시적이고 재시작되면 데이터가 사라질 수 있지만, Volume을 활용하면 파드 또는 노드의 파일 시스템을 사용하여 데이터를 유지할 수 있다. 

다양한 볼륨 유형이 있으며, 그 중 가장 많이 사용되는 것이 emptyDir, hostPath, 그리고 PersistentVolume(PV) / PersistentVolumeClaim (PVC) 이다. 

 

1. emptyDir

  • 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는 노드(호스트)의 파일 시스템을 파드 내부의 디렉토리로  마운트한다. 즉, 파드는 노드의 특정 경로에 접근할 수 있으며, 데이터를 해당 경로에 저장한다.
  • 노드에 있는 디렉토리나 파일을 직접 사용할 수 있지만, 이것은 노드에 종속된다는 것을 의미하기 때문에 클러스터 간 이동성이 떨어진다.

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는 사용자가 특정 스토리지를 요청하는 방식이다.

PV, 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 데이터 저장소)

 

반응형