IT/Kubernetes

[Kubernetes] Kubernetes Study: "기본 오브젝트 - Volume"

wookiist 2021. 6. 28. 00:10

Prologue

본 포스트는 인프런 쿠버네티스 스터디 그룹에서 진행하는 스터디 자료의 일환으로 작성하였습니다. 기본적으론 [대세는 쿠버네티스] 강의를 보고 내용을 정리합니다. 그리고 제 경험이나 이해를 곁들여 포스트를 작성했습니다. 그동안 공식 문서나 블로그 포스트, CKA 강의 등 다양한 경로로 쿠버네티스를 익혀왔지만, 한국어로 잘 정리된 강좌를 한번 듣고 깔끔하게 다듬어보는 시간을 가지면 좋겠다는 생각이 들었습니다.

강의와는 조금 다를 수 있지만, 쿠버네티스 공식 문서를 보고 내용을 정리해보겠습니다.

이번 포스트에선 "기본 오브젝트 - Volume"을 다뤄봅니다.

Volume

컨테이너 내의 디스크에 쓰인 파일은 임시적이며, 컨테이너가 망가지면 파일도 손실된다는 문제가 있습니다. 컨테이너가 망가지면 kubelet이 이를 재시작하겠지만, 데이터는 유실된 상태일 것입니다. 또 파드 간 파일 공유를 수행할 때도 어려움이 있습니다. 쿠버네티스 볼륨은 이러한 문제를 모두 해결합니다.

강의 내용

emptyDir

emptyDir은 컨테이너끼리 데이터를 공유하기 위해서 사용하는 볼륨입니다. 최초에 볼륨이 생성될 때 언제나 이 볼륨은 비어있는 상태가 되기 때문에 그 이름이 emptyDir이 되었습니다. 프론트에서 파일을 수신하여 백엔드로 공유해줘야 하는 상황이라면, 파일 업로드를 통해 프론트가 수신한 파일을 이 emptyDir로 생성한 볼륨에 저정하고, 백엔드가 이 볼륨에서 해당 파일을 읽어가는 구조로 만들 수 있습니다. 즉, 파일 공유가 로컬에 있는 파일을 읽고 쓰듯이 자연스럽게 이루어지게 됩니다.

단, emptyDir로 생성한 볼륨은 파드 내부에 생성됩니다. 따라서, 마치 컨테이너에 생성한 데이터는 컨테이너가 삭제되면 더불어 삭제되듯이, emptyDir에 보관한 데이터는 해당 파드가 삭제되면 함께 삭제됩니다. 따라서 영구적으로 보존하는 것에는 무리가 있습니다. 그러니 일시적이고 임시적인 데이터만 보관하도록 해야 합니다. 물론, 컨테이너가 삭제되는 것으로는 노드에서 파드가 삭제되지 않기 때문에, emptyDir 볼륨에 속한 데이터는 컨테이너 삭제나 충돌 등으로부터 안전합니다. 다음의 매니페스트 내용을 참고해주세요.

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container1
    **volumeMounts:
    - mountPath: /cache1
      name: cache-volume**
  - image: k8s.gcr.io/test-webserver
    name: test-container2
        **volumeMounts:
        - mountPath: /cache2
            name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}**

hostPath

hostPath로 생성한 볼륨은 어떤 노드의 Path를 사용하게 됩니다. 이 볼륨은 노드에 생성된 어떤 디렉터리에 해당하기 때문에, 파드가 죽는다고 해서 삭제되지 않습니다. 또한 파드 내부에 위치한 볼륨이 아니기 때문에, 파드 간의 파일 공유도 가능해집니다.

그러나 큰 문제가 있습니다. 예를 들어, 노드 A에서 운용되던 파드가 죽어서 노드 B에서 재생성되었다고 가정해보겠습니다. 노드 A에서 운용될 때는 그 데이터가 노드 A의 볼륨에 적재되고 있었을텐데요. 노드 B로 옮겨간 이후로는 그 데이터를 참조할 수 없습니다.

또 주의해야 하는 점은 기본 호스트에 생성된 파일이나 디렉터리는 root 만 쓸 수 있다는 점입니다. 따라서 프로세스를 privileged 컨테이너에서 루트로 실행하거나 hostPath 볼륨에 쓸 수 있도록 hostPath 디렉터리의 권한을 수정해줘야 합니다.

hostPath는 파드 자신이 할당된 호스트에 관한 데이터를 읽거나 써야 할 때 사용합니다. 노드에 있는 데이터를 파드에서 쓸 때 사용하기 위함을 유의해주세요.

다음은 hostPath 볼륨을 생성하는 매니페스트입니다.

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    **volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # 호스트의 디렉터리 위치
      path: /data
      # 이 필드는 선택 사항이다
      type: Directory**

PVC & PV

실제 볼륨의 형태는 굉장히 다양합니다. 로컬 볼륨 뿐만 아니라, 외부에 연결되는 NFS, AWS Elastic Block Store, CephFS, iSCSI 등 입니다. 이런 볼륨을 하나 하나 각각 관리해야 한다면 비효율적입니다. 쿠버네티스 퍼시스턴트 볼륨은 다양한 종류의 볼륨을 하나의 추상화된 형태로 관리할 수 있게 해줍니다.

파드에 퍼시스턴트 볼륨을 연결하는 방법은 이전에 소개드린 방법과는 조금 다릅니다. 파드에 퍼시스턴트 볼륨을 연결하려면 퍼시스턴트 볼륨 클레임이라는 것을 먼저 만들어야 합니다. 퍼시스턴트 볼륨 클레임을 두는 이유는 사용자 영역과 운용자 영역을 분리하기 위함입니다.

이전에 말씀드린 것처럼, 볼륨의 형태는 매우 다양합니다. 따라서 퍼시스턴트 볼륨을 생성하는 방법도 조금씩 다 다릅니다. 이러한 작업을 사용자가 직접하는 것보다 운용자가 이를 생성해두고, 사용자는 퍼시스턴트 볼륨 클레임이라는 공통된 인터페이스를 통해서 퍼시스턴트 볼륨에 연결하는 방식을 제공하는 것입니다. [참고]

마무리

이렇게 해서 인프런 강의의 "기본 오브젝트 - Volume"을 다뤄봤습니다. 내용이 많이 부실하고, 설명이 어렵게 되어 있는 등의 문제가 있을 것으로 보입니다. 추후 수정을 통해 다듬어보겠습니다.

여기까지 따라오시느라 고생이 많으셨습니다. 만약 이 글이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.

혹시라도 글에 이상이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊

반응형