Kubernetes 볼륨은 데이터를 포함하는 디렉터리로, Kubernetes 포드 내의 컨테이너가 액세스할 수 있습니다. 디렉터리의 위치, 이를 지원하는 저장 매체 및 그 내용은 사용 중인 볼륨의 특정 유형에 따라 달라집니다.
포드 내 컨테이너에서 실행 중인 프로세스는 다음과 같이 구성된 파일 시스템 뷰를 인식합니다.
볼륨은 포드 템플릿의 .spec.containers[*].volumeMounts 필드에 정의됩니다. 각 포드 및 포드 내 각 컨테이너 이미지에 대해, 해당 컨테이너가 마운트할 볼륨과 마운트 경로를 지정해야 합니다(경로는 컨테이너마다 다를 수 있음).
Kubernetes에는 몇 가지 유형의 볼륨이 있습니다. 가장 중요한 것은 Kubernetes 노드에 로컬로 저장되며 포드가 재시작될 때 삭제되는 임시 볼륨과, 포드가 종료된 후에도 데이터를 유지하는 Kubernetes 영구 볼륨(PV)입니다.
이 문서의 내용:
Kubernetes는 다양한 볼륨을 지원하여 각 포드가 여러 볼륨 유형을 동시에 사용할 수 있도록 합니다. 임시 볼륨은 포드의 수명 주기에 종속되는 반면, 영구 볼륨은 포드의 수명 주기를 넘어 지속될 수 있습니다. 이는 Kubernetes가 포드가 더 이상 존재하지 않을 때 임시 볼륨을 삭제하는 반면, 영구 볼륨의 데이터는 유지한다는 의미입니다.
Kubernetes는 스토리지 프로비저닝과 소비를 추상화하는 API를 갖춘 PersistentVolume 하위 시스템을 제공합니다. 두 가지 API 리소스인 PersistentVolume(PV)과 PersistentVolumeClaim(PVC)과 함께 작동합니다.
PersistentVolume (PV)
PV는 클러스터 내에 위치한 스토리지 리소스입니다. 관리자는 PV를 수동으로 프로비저닝할 수 있으며, Kubernetes는 스토리지 클래스를 사용하여 PV를 동적으로 프로비저닝할 수 있습니다. 볼륨과 마찬가지로 PV도 플러그인이지만, 그 수명 주기는 PV를 사용하는 어떤 포드와도 독립적입니다.
PV는 iSCSI, NFS 및 클라우드 공급자 스토리지 시스템을 포함한 스토리지 구현의 세부 사항을 캡처하는 API 오브젝트로 작동합니다. 노드와 유사하게 작동하지만, 컴퓨팅 대신 스토리지 리소스를 제공합니다.
PersistentVolumeClaim(PVC)
PVC는 사용자가 생성한 스토리지 요청입니다. 포드와 유사하게 작동하지만, 노드 리소스 대신 PV 리소스를 소비합니다. PVC는 ReadWriteOnce, ReadWriteMany, ReadOnlyMany와 같은 크기 액세스 모드를 지정하여 특정 스토리지 리소스를 요청할 수 있습니다.
PVC는 사용자가 추상화된 스토리지 리소스를 소비할 수 있게 하지만, 사용자는 일반적으로 다양한 문제에 대해 서로 다른 속성을 가진 PV가 필요합니다. 이것이 바로 클러스터 관리자가 크기나 액세스 모드 이상의 차이점을 지닌 다양한 PV를 제공해야 하는 이유입니다. StorageClass 리소스를 통해 사용자에게 구현 세부 사항을 노출시키지 않고도 이를 수행할 수 있습니다.
관련 콘텐츠: Kubernetes PVC에 대한 가이드를 참조하십시오
임시 볼륨은 볼륨은 재시작 후에도 데이터를 영구적으로 저장하지 않습니다. 이들 볼륨은 포드의 수명 주기에 바인딩되어 있으므로, 포드와 함께 생성 및 삭제됩니다. 영구 볼륨의 가용성에 제한받지 않고 포드를 중지하고 재시작할 수 있게 합니다.
임시 볼륨은 배포 및 관리가 간단합니다. 포드 사양에서 인라인으로 지정할 수 있습니다. 임시 볼륨은 캐싱 서비스처럼 영구 스토리지가 필요하지 않은 애플리케이션에 이상적입니다.
Kubernetes가 노드에 포드를 할당할 때 emptyDir 볼륨이 생성됩니다. 이 볼륨의 수명은 해당 특정 노드에 존재하는 포드의 수명 주기와 연결되어 있습니다. emptyDir 볼륨은 컨테이너가 재시작되거나 중단될 때 재생성됩니다. 그러나 이 볼륨의 데이터는 노드에서 포드가 제거되거나, 충돌하거나, 종료될 때 삭제되고 손실됩니다.
emptyDir 볼륨을 생성한 후, 해당 볼륨 유형 이름을 포드 매니페스트 파일의 필드로 선언할 수 있습니다. 볼륨 속성 섹션 아래에 해당 값으로 빈 중괄호{}가 표시됩니다. EmptyDir 볼륨은주로 임시 데이터 스토리지에 적합합니다. 예를 들어, 디스크 기반 병합과 같은 임시 공간으로 사용할 수 있습니다.
emptyDir 볼륨을 해당 노드를 지원하는 매체에 저장할 수 있습니다. 예를 들어, 네트워크 스토리지나 SSD를 사용할 수 있습니다. 또는 emptyDir.medium 필드에 'memory'를 설정하면 Kubernetes가 RAM 기반 파일 시스템(tmpfs)을 마운트합니다. Kubernetes는 노드 재부팅 시 tmpfs를 지운다는 점에 유의하십시오.
hostPath 볼륨은 호스트 노드의 파일 시스템에서 디렉터리나 파일을 포드에 마운트합니다.
hostPath 볼륨의 주요 사용 사례는 다음과 같습니다.
HostPath 볼륨 보안
HostPath 볼륨은 많은 보안 위험을 초래합니다. 가능하면 이러한 볼륨을 사용하지 마십시오. HostPath 볼륨을 반드시 사용해야 하는 경우, 필요한 디렉터리나 파일로만 범위를 제한하고 ReadOnly로 마운트해야 합니다.
주요 보안 위험은 다음과 같습니다.
AdmissionPolicy를 사용하여 HostPath 액세스를 을 특정 디렉터리로 제한할 수 있습니다. 하지만 이 정책은 volumeMounts가 readOnly 마운트를 사용하도록 요구하는 경우에만 유효합니다.
ConfigMap은 포드에 구성 데이터를 주입할 수 있게 합니다. ConfigMap 내에 저장된 데이터는 configMap 볼륨 유형에서 참조될 수 있으며, 이후 포드 내에서 실행되는 컨테이너화된 애플리케이션에서 사용될 수 있습니다. ConfigMap을 참조할 때 볼륨 내에서 ConfigMap의 이름을 제공해야 합니다. Kubernetes를 사용하면 ConfigMap의 특정 항목에 대한 경로를 사용자 정의할 수 있습니다.
Kubernetes는 Kubernetes 클러스터에 배포된 스토리지 장치에 대한 액세스를 제공하는 여러 스토리지 플러그인을 제공합니다. 이는 StorageClass 오브젝트를 사용하여 구현됩니다.
현재 Kubernetes에서 지원하는 주요 플러그인으로는 GCEPersistentDisk, AWSElasticBlockStore, AzureDisk, Glusterfs, NFS 및 iSCSI가 있습니다. 이러한 플러그인에 대한 자세한 내용은 StorageClass 설명서를 참조하십시오.
두 가지 주목할 만한 스토리지 플러그인을 더 자세히 살펴보겠습니다.
NFS(Network File System)는 스토리지 장치를 로컬 드라이브로 마운트하기 위한 표준 프로토콜입니다. Kubernetes를 사용하면 NFS 볼륨을 컨테이너의 로컬 드라이브로 마운트할 수 있습니다. 레거시 코드는 종종 NFS를 통해 데이터에 액세스하기 때문에, 이 플러그인은 레거시 워크로드를 Kubernetes로 마이그레이션하는 데 매우 유용합니다.
NFS와 Kubernetes를 통해 데이터에 액세스하는 방법에는 두 가지가 있습니다.
CSI(Container Storage Interface)는 컨테이너 오케스트레이터가 관리하는 컨테이너에 스토리지 시스템을 노출할 수 있도록 하는 표준 인터페이스입니다. CSI는 스토리지 공급업체가 '트리 외부(out of tree)' 플러그인을 생성할 수 있도록 합니다. 이는 해당 플러그인이 Kubernetes 코드 저장소에 체크인될 필요가 없으며 Kubernetes와 함께 배포되지 않음을 의미합니다.
스토리지 공급업체에서 직접 제공하는 CSI 기반의 트리 외부 플러그인이 다수 존재합니다. CSI의 등장으로 스토리지 기술이 Kubernetes를 지원하는 것이 훨씬 쉬워졌습니다.
관련 컨텐츠: Container Storage Interface 가이드 읽기
볼륨을 생성하고 포드가 이를 사용할 수 있도록 하는 데는 두 단계가 포함됩니다.
이 단계들은 서로 밀접하게 연관되어 있습니다. 볼륨을 생성할 때는 반드시 컨테이너에 마운트해야 하며, 포드 템플릿에 선언하지 않은 볼륨은 마운트할 수 없습니다.
다음은 포드 템플릿 YAML 구성에서 볼륨 생성 및 마운팅을 모두 보여주는 예시입니다.
spec: containers: —name: my-app image: nginx volumeMounts: —name: my-volume mountPath: /app/config volumes: —name: my-volume
이 코드에서:
Kubernetes 볼륨을 생성하려면, 해당 볼륨을 선언하는 하나 이상의 포드를 배포합니다. 이를 수행하는 일반적인 방법은 Deployment 오브젝트를 통해 이루어집니다. 다음을 수행하는 Deployment 매니페스트의 예는 다음과 같습니다.
apiVersion: apps/v1 kind: Deployment metadata: name: pods-with-volumes spec: replicas: 3 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: —name: my-container image: nginx:1.14.2 volumeMounts: —mountPath: / name: my-volume volumes: —name: my-volume emptyDir: {}
이 Deployment의 이름은 pods-with-volumes에 정의되어 있으며, 이는 Kubernetes 환경에서 참조하는 방식입니다.
이전 섹션에서 살펴본 것처럼, 이 Deployment 오브젝트는 볼륨을 생성하는 데 필요한 두 가지 작업을 수행합니다.
이 YAML 파일이 my-deployment.yaml이라는 이름으로 저장되어 있다고 가정해 보겠습니다. 다음 명령어를 사용하여 Kubernetes 클러스터에 Deployment를 생성할 수 있습니다:
kubectl apply -f my-deployment.yaml
Deployment가 예상된 볼륨으로 정상적으로 실행 중인지 확인하려면 다음 명령을 실행합니다.
kubectl describe pods pods-with-volumes
모든 것이 정상적으로 작동했다면, 출력 결과에는 각 포드에 요청된 마운트 포인트를 을 가진 my-container라는 컨테이너가 있음을 확인할 수 있습니다.
Mounts: / from my-volume (rw)
출력에는 각 포드에서 실행 중인 볼륨도 표시됩니다:
Volumes: my-volume: Type: EmptyDir(포드의 수명 주기를 공유하는 임시 디렉터리)
NetApp Cloud Volumes ONTAP은 업계 최고의 엔터프라이즈급 스토리지 관리 솔루션으로, AWS, Azure, Google Cloud에서 안전하고 검증된 스토리지 관리 서비스를 제공합니다. Cloud Volumes ONTAP의 용량은 페타바이트 단위로 확장 가능하며, 파일 서비스, 데이터베이스, DevOps 또는 기타 기업 워크로드 등 다양한 사용 사례를 지원합니다. 고가용성, 데이터 보호, 스토리지 효율성, Kubernetes 통합 등 강력한 기능 세트를 포함합니다.
특히 Cloud Volumes ONTAP은 컨테이너화된 워크로드의 Kubernetes 영구 볼륨 프로비저닝 및 관리 요구사항을 지원합니다.
Cloud Volumes ONTAP 사례 연구를 통해 Cloud Volumes ONTAP이 Kubernetes 워크로드에서 컨테이너화된 애플리케이션의 문제를 해결하는 데 어떻게 도움이 되는지 자세히 알아보십시오.