목차
- 볼륨이란
- 볼륨 유형
볼륨이란
쿠버네티스 볼륨은 파드의 구성 요소로 컨테이너와 동일하게 파드 스펙에서 정의됩니다. 볼륨은 독립적인 쿠버네티스 오브젝트가 아니므로 자체적으로 생성, 삭제될 수 없습니다. 볼륨은 파드의 모든 컨테이너에서 사용 가능하지만 접근하려는 컨테이너에서 각각 마운트돼야 합니다. 각 컨테이너에서 파일시스템의 어느 경로에나 볼륨을 마운트 할 수 있습니다.
먼저 다음 그림 A를 통해 설명해 보겠습니다. 컨테이너 세 개가 있는 파드를 가정해 봅시다. 첫 번째 컨테이너는 /var/htdocs 디렉터리에서 HTML 페이지를 서비스하고 /var/logs에 액세스 로그를 저장하는 웹 서버를 실행합니다. 두 번째 컨테이너는 /var/html에 HTML 파일을 생성하는 에이전트를 실행하고, 세 번째 컨테이너는 /var/logs 디렉터리의 로그를 처리합니다.
각 컨테이너는 잘 정의된 단일 책임을 갖고 있지만 각각 컨테이너 자체만으로는 큰 쓸모가 없습니다. 콘텐츠 생성기는 생성한 HTML 파일을 자체 컨테이너 내에 저장하고, 웹 서버는 별도의 분리된 컨테이너에서 실행되므로 이 파일에 접근할 수 없기 때문에 세 컨테이너간에 디스크 스토리지를 공유하지 않는 파드를 생성하는 것은 의미가 없습니다.
파일을 공유하는 대신 웹 서버는 컨테이너 이미지안의 빈 디렉터리나 여러분이 /var/htdocs 디렉터리에 넣은 파일을 서비스할 수 있습니다. 비슷하게 로그 순환기도 /var/logs 디렉터리가 항상 비어있고 아무것도 로그를 쓰지 않기 때문에 아무런 일을 하지 않게됩니다. 이런 세 개의 컨테이너 구성에 볼륨이 없다면 파드는 아무런 동작을 하지 않습니다.
그러나 볼륨 두 개를 파드에 추가하고 세 개의 컨테이너 내부의 적절한 경로에 마운트 한다면 다음 그림와 같이 부분의 합보다 더 나은 시스템이 생성됩니다.
리눅스에서는 파일시스템을 파일 트리의 임의 경로에 마운트할 수 있습니다. 이렇게 하면 마운트된 파일 시스템의 내용은 마운트된 디렉터리에서 접근이 가능합니다. 같은 볼륨을 두 개의 컨테이너에 마운트하면 컨테이너는 동일한 파일로 동작할 수 있습니다. 이 경우 볼륨 두 개를 컨테이너 세 개에 마운트합니다. 이렇게 함으로써 컨테이너 세 개는 함께 동작할 수 있고 유용한 작업을 수행합니다.
이제 동작하는 방법을 알아보겠습니다. 먼저 파드에는 publicHTML이라는 볼륨이 있습니다. 이 볼륨은 WebServer 컨테이너의 /var/htdocs에 마운트됐고 웹 서버는 이 디렉터리의 파일을 서비스합니다. 동일 볼륨이 ContentAgent 컨테이너에 /var/html에 다른 경로로 마운트돼 있고, 콘텐츠 에이전트는 생성된 파일을 해당 경로에 쓰게 됩니다. 이 단일 볼륨을 이런 방식으로 마운트하면 콘텐츠 생성기가 작성한 내용을 웹 서버가 서비스할 수 있게 됩니다.
비슷하게 파드는 로그를 저장하는 logVol 볼륨이 가져갑니다. 이 볼륨은 WebServer와 LogRotator 컨테이너의 /var/logs에 마운트 됩니다. 이 볼륨은 ContentAgent 컨테이너에는 마운트되지 않습니다. 컨테이너와 볼륨이 같은 파드에서 구성됐더라도 컨테이너는 그 파일에 접근할 수 없습니다. 컨테이너에서 접근하려면 파드에서 볼륨을 정의하는 것만으로는 충분하지 않고 VolumeMount를 컨테이너 스펙에 정의해야 합니다.
이 예제의 두 볼륨은 빈 상태로 초기화되므로 emptyDir 유형의 볼륨을 사용할 수 있습니다. 쿠버네티스는 볼륨을 초기화하며 외부 소스의 내용을 채우거나, 볼륨 내부에 기존에 존재하는 디렉터리를 마운트하는 것과 같은 다른 유형의 볼륨도 지원합니다. 볼륨을 채우거나 마운트하는 프로세스는 파드의 컨테이너가 시작되 전에 수행됩니다.
볼륨이 파드의 라이프사이클에 바인딩되면 파드가 존재하는 동안 유지될 수 있지만 볼륨 유형에 따라 파드와 볼륨이 사라진 후에도 볼륨의 파일이 유지돼 새로운 볼륨으로 마운트될 수 있습니다.
볼륨 유형
다양한 유형의 볼륨이 사용이 가능한데 일반적인 것도 있지만, 실제 스토리지 기술에 특화된 것들도 있습니다. 이런 기술을 들어보지 못했다고 하더라도 이상하다고 느낄필요 없는 것이 보통은 이렇게 다양하게 알기보다는 이미 알고 사용했던 기술의 볼륨 유형에 대해서만 알고 사용한다고 합니다. 이제 몇가지 유형을 알아보겠습니다.
- emptyDir
일시적인 데이터를 저장하는 데 사용되는 간단한 빈 디렉터리 - hostPath
워커 노드의 파일시스템을 파드의 디렉터리로 마운트하는 데 사용 - gitRepo
깃 리포지터리의 콘덴츠를 체크아웃해 초기화한 볼륨 - nfs
NFS 공유를 파드에 마운트합니다. - gcePersistentDisk(Google), awsElasticBlockStore(Amazon), azureDisk(Microsoft)
클라우드 제공자의 전용 스토리지를 마운트하는데 사용 - cinder, cephfs, iscsi, flocker, glusterfs, quobyte, rbd, flexVolume, vsphere, Volume, photonPersistentDisk, scaleIO
다른 유형의 네트워크 스토리지를 마운트하는 데 사용 - configMap, secret, downwardAPI
쿠버네티스 리소스나 클러스터 정보를 파등 노출하는 데 사용되는 특별한 유형의 볼륨 - persistentVolumeClaim
사전에 혹은 동적으로 프로비저닝된 퍼시스텀트 스토리지를 사용하는 방법
볼륨 유형은 다양한 목적을 위해 사용됩니다. 다음 포스팅에서 이 중 몇 가지를 다뤄보도록 하겠습니다. 특수한 유형의 볼륨은 데이터를 저장하는 데 사용되지 않고 쿠버네티스 메타데이터를 파드에 실행 중인 애플리케이션에 노출하는 데 사용되는데 이 내용은 볼륨 유형을 다룬 후에 자세히 알아보도록 하겠습니다.
원래는 바로 다음 내용까지 진행하려 했으나 분량 조절이 쉽지 않아 이번 포스팅은 쉬어가는 느낌으로 볼륨에 대해 소개하고 다음 포스팅부터 제대로 들어가도록 하겠습니다.
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes Volume] 3. 워커노드 파일 시스템로 파일 접근(hostPath) (0) | 2023.04.13 |
---|---|
[Kubernetes Volume] 2. 파드 내부 컨테이너간 데이터 공유(emptyDir, gitRepo) (0) | 2023.04.12 |
[Kubernetes Service] 7. 헤드리스 서비스란? (0) | 2023.04.11 |
[Kubernetes Service] 6. 레디니스 프로브(readyness probe)로 수신 요청 (0) | 2023.04.11 |
[Kubernetes Service] 5. 인그레스로 통신 및 TLS로 보안 (0) | 2023.04.11 |