kubernetes volume_1

|

쿠버네티스 volume_1

볼륨이란?

컨테이너의 파일시스템

  • 볼륨을 이해하기전에 파드 내부 컨테이너의 파일시스템 특성을 이해해야한다.
  • 컨테이너 마다 고유한 파일시스템을 가지는데 파일시스템은 컨테이너 이미지에서 제공되기 때문이다.
  • 컨테이너가 재시작되면 이전에 쓰여진 파일들은 볼 수 없다. (가령 로그파일같은 것들)

쿠버네티스의 볼륨

  • 파드 내부 컨테이너들이 재시작되더라도 유지되는 데이터들을 디렉토리에 쓰고자할 때 볼륨을 사용한다.
  • 볼륨은 독립적인 쿠버네티스 오브젝트가 아니기때문에 자체적으로 생성, 삭제되지 않으며 파드의 스펙에서 정의된다. 따라서 파드와 동일한 라이프사이클을 가진다. 즉 파드가 삭제되면 볼륨 또한 삭제되는 것이다.
  • 하지만 볼륨을 정의하면 컨테이너의 라이프사이클과는 무관하게 이전에 기록된 모든 파일들을 컨테이너가 볼 수 있다.
  • 볼륨은 파드 내부의 모든 컨테이너에서 사용 가능하나 접근하기 위해선 반드시 컨테이너 각각에서 마운트 되어야한다.

볼륨의 유형

  • 쿠버네티스는 다양한 유형의 볼륨을 지원한다.
  • emtyDir: 일시적인 데이터를 저장할 때 사용되는 비어있는 디렉토리
  • hostPath: 워커 노드의 파일시스템을 파드의 디렉토리로 마운트하는데 사용
  • gitRepo: 깃 저장소의 컨텐츠를 체크아웃해 초기화한 볼륨
  • nfs: NFS 공유를 파드에 마운트
  • 그밖에 볼륨들은 gcePersistentDisk, awsElasticBlockStore, azureDisk, cinder, cephfs, iscsi ,,,
  • 특별한 유형의 볼륨: configMap, secret, downwardAPI 이들은 데이터를 저장하는 데 쓰이지 않고 쿠버네티스 메타데이터를 파드에 실행 중인 애플리케이션의 노출하는데 사용된다. (secret의 예로 private docker registry에 접근하기 위한 레지스트리 호스트, 인증정보등을 저장해둠)

emptyDir

파드와 같은 라이프사이클을 가지는 볼륨 유형 중 하나인 emptyDir은 볼륨이 빈 디렉토리로 시작된다. emptyDir은 동일 파드에서 실행 중인 컨테이너 간 파일을 공유할 때 유용하다.

emptyDir 볼륨 사용의 예

k8s emptyDir을 사용하는 볼륨 예제 링크

  • 하나의 볼륨(html)을 동일한 파드(emtpy-dir-practice) 내부 각각 컨테이너들이(checkout, web-server) 마운트하여 데이터를 공유하는 예제이다.

hostPath

대부분의 파드는 호스트 노드를 인식하지 못하므로 노드의 파일시스템에 있는 어떤 파일에도 접근하면 안된다. 하지만 특정 시스템 레벨의 파드(가령 노드의 로그를 저장하는 /var/log 디렉토리나 컨테이너 로그를 저장하는 /var/lib/docker/containers 디렉토리, 이를 fluentd가 해당 디렉토리를 마운트하여 로그를 수집함)는 노드의 파일을 읽거나 파일 시스템을 통해 노드 디바이스를 접근하기 위해 노드의 파일시스템을 사용해야한다. 이를 hostPath 볼륨을 통해 가능하게 한다. hostPath 볼륨은 노드 파일시스템의 특정 파일이나 디렉토리를 가리킨다. 동일한 노드에서 실행중인 두 개의 파드가 있다고 가정하면 hostPath 볼륨의 동일한 경로를 사용 중이면 동일한 파일을 가리킨다. 데이터가 저장되는 위치가 노드이므로 파드가 삭제되더라고 데이터는 노드에 남아있으므로 이는 퍼시스턴트 스토리지이다. 단, 동일한 노드에 스케줄링된다는 전제하에 새로운 파드는 이전 파드가 남긴 데이터를 접근할 수 있다. 이런 전제조건으로 hostPath 볼륨을 데이터베이스의 데이터 디렉토리를 저장할 위치로 사용하기엔 문제가 있다. 보통 쿠버네티스에서 실행 중인 파드를 살펴보면(주로 namespace가 kube-system) hostPath 볼륨을 자체 데이터를 저장하기 위한 목적으로 사용하기 보다 노드 데이터에 접근하기 위해 사용한다.