본문 바로가기
MLOps/Kubernetes

[Kubernetes] Volume 기초 - emptyDir, hostPath, PVC/PV

by Toritol 2023. 12. 10.
728x90

이번 글에서는 Kubernetes의 구성 요소 중 하나인 Volume의 기초에 대해 작성하고자 합니다. 해당 글은 Inflearn의 '대세는 쿠버네티스 [초급~중급]' 강의를 학습하면서 작성한 글임을 미리 알려드립니다. Volume 기초에서는 크게 1) emptyDir, 2) hostPath, 3) PVC/PV에 대해 살펴보겠습니다.

 

우선 emptyDir입니다. emptyDir은 volume이 생성될 당시에는 해당 volume의 내용에는 아무것도 없기 때문에 붙여진 명칭으로, pod 내에서 container 간 데이터를 공유하기 위한 volume입니다. 아래 그림을 보면, container1과 container2는 같은 volume을 mount하고 있으므로, container 간 데이터를 전송하지 않아도 된다는 장점이 있습니다. 하지만 pod 내에 생성된 volume이기 때문에, 문제로 인해 pod가 재생성되면 volume 내의 데이터는 없어지게 됩니다. 따라서 emptyDir은 일시적인 목적으로만 활용하는 것이 좋습니다.

 

출처: https://inf.run/yW34

 

아래의 코드는 emptyDir에 대한 yaml 파일로, 두 container 모두 emptyDir로 volume을 mount하고 있습니다. 각 container의 mount 경로는 다르지만, 결국 경로에 접속했을 때 존재하는 파일은 동일합니다.

 

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-1
spec:
  containers:
  - name: container1
    image: kube/init
    volumneMounts:
    - name: empty-dir
      mountPath: /mount1
  - name: container2
    image: kube/init
    volumneMounts:
    - name: empty-dir
      mountPath: /mount2
  Volumes:
  - name : empty-dir
    emptyDir:{}

 

 

다음은 hostPath입니다. hostPath는 pod들이 생성된 node의 경로를 volume으로 사용하는 방법입니다. Node에 volume이 생성되기 때문에, pod가 재생성되더라도 데이터가 삭제되지 않는다는 장점이 있습니다. 하지만 node1에 생성된 pod가 특정 문제로 인해 node2에 재생성된다면, node1에서 사용하던 volume을 사용하지 못한다는 문제가 발생할 수 있습니다. 이에 대한 해결 방법이 없는 것은 아니지만 강의에선 추천하지 않는다고 언급하고 있습니다. 따라서 hostPath는 pod가 할당되는 node의 정보를 사용해야 할 때 일반적으로 활용합니다.

 

출처: https://inf.run/yW34

 

아래의 코드는 hostPath에 대한 yaml 파일입니다. Node 내의 node-v라는 경로를 volume으로 사용하고, cotainer의 mount1 경로와 node-v가 동일하게 됩니다. 다만 pod가 생성되기 이전에 node에 node-v 경로를 생성해야합니다.

 

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-2
spec:
  containers:
  - name: container
    image: kube/init
    volumneMounts:
    - name: host-path
      mountPath: /mount1
  Volumes:
  - name : host-path
    hostPath:
      path: /node-v
      type: Directory

 

 

마지막은 PVC와 PV입니다. Volume 형태는 앞서 설명한 local 형태도 있지만, AWS, Git 등 외부 원격 형태도 있을 정도로 매우 다양합니다. 따라서 형태에 맞게 Persistent Volume을 정의하게 되고 volume에 연결합니다. 이러한 PV와 volume은 admin 영역으로, 주로 kubernetes 운영자들이 관리하게 됩니다. Pod에서 PV를 사용하기 위해서는 Persistent Volume Claim, PVC를 생성하고 mount해줘야 합니다. Pod와 PVC는 User 영역으로, 사용자들이 PV를 직접 관리하기보다는 PVC를 통해 간접적으로 PV를 연결하여 사용한다고 보시면 됩니다.

 

출처: https://inf.run/yW34

 

아래의 yaml 파일들이 PV/PVC에 해당하는 내용입니다. 해당 PV는 node의 local 경로로 생성을 하고, 용량 1G와 읽기/쓰기 모드로 설정을 하였습니다. nodeAffinity 부분은 복잡해 보이지만, 결국 해당 PV에 연결되는 pod들은 node1에만 생성된다는 옵션을 의미합니다. 

 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-01
spec:
  capacity:
    storage: 1G
  accessModes:
    - ReadWriteOnce
    local:
      path: /node-v
    nodeAffinity:
      required:
        nodeSelectorTerms:
        - matchExperessions:
          - {key: node, operator: In, values: [node1]}

 

PVC를 생성할 때는 용량과 접근 모드에 맞춰서 PV가 할당되게 됩니다. 아래의 PVC는 위의 PV의 옵션과 동일한 것을 확인할 수 있습니다. 여러 개의 PV를 생성하더라도, 해당 옵션들만 잘 맞추면 원하는 PV에 설정하는 것이 가능합니다.

 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-01
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1G
    storageClassName: ""

 

마지막으로 pod를 생성할 때 volume mount 과정에서 persistentVolumeClaim으로 설정을 하고, 앞서 생성한 PVC 이름을 입력해 주면 최종적으로 PV에 연결되게 됩니다.

 

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  containers:
  - name: container
    image: kube/init
    volumneMounts:
    - name: pvc-pv
      mountPath: /volume
  Volumes:
  - name : pvc-pv
    persistentVolumeClaim:
      claimName: pvc-01

 

 

* 강의 내용을 복습하면서 정리한 것이므로, 내용적으로 유사한 부분이 많다는 점 양해부탁드립니다.

 

 

<참고>

https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B8%B0%EC%B4%88/dashboard

 

대세는 쿠버네티스 [초급~중급] - 인프런 | 강의

쿠버네티스는 앞으로 어플리케이션 배포/운영에 주류가 될 기술 입니다. 이 강좌를 통해 여러분도 대세에 쉽게 편승할 수 있게 됩니다., 현존 최고의 앱 운영 및 배포 기술, 쿠버네티스를 만나

www.inflearn.com

 

 

 

728x90

'MLOps > Kubernetes' 카테고리의 다른 글

[Kubernetes] Object 기초 - ConfigMap, Secret  (0) 2023.12.13
[Kubernetes] PostgreSQL 설치 및 실행  (4) 2023.11.29
[Kubernetes] Service 기초  (1) 2023.11.25
[Kubernetes] Helm 설치  (1) 2023.11.15
[Kubernetes] Pod 기초  (0) 2023.11.13

댓글