메뉴

이 페이지에는 기계 번역이 사용되었습니다. 일부 콘텐츠는 완벽하지 않을 수 있습니다. 개선할 수 있는 방법을 알려주십시오.

피드백 공유

Kubernetes CSI: CSI 볼륨의 기초 및 CSI 드라이버 빌드 방법

목차

이 페이지 공유하기

Yifat Perry
Yifat Perry

Kubernetes CSI란 무엇입니까?

Kubernetes CSI는 Container Storage Interface(CSI)의 Kubernetes 전용 구현입니다. CSI 사양은 스토리지 시스템과 컨테이너 오케스트레이션(CO) 플랫폼 간의 연결을 가능하게 하는 표준을 제공합니다. 이는 Kubernetes 스토리지 관리의 기반입니다.

CSI 표준은 임의의 블록 및 파일 스토리지 시스템이 Kubernetes와 같은 컨테이너화 시스템의 워크로드에 노출되는 방식을 결정합니다. 타사 스토리지 공급업체는 CSI를 사용하여 플러그인을 구축하고 배포함으로써 Kubernetes의 핵심 코드를 편집하지 않고도 Kubernetes가 새로운 스토리지 시스템과 작동하도록 할 수 있습니다.

이 문서의 내용:

CSI의 필요성

Container Storage Interface 이전에 Kubernetes는 핵심 Kubernetes 바이너리를 사용하여 작성하고 배포해야 하는 in-tree k8s 볼륨 플러그인의 사용만 지원했습니다. 즉, 스토리지 공급업체는 새로운 스토리지 시스템에 대한 지원을 활성화하기 위해 k8s 플러그인의 핵심 코드베이스를 체크인해야 했습니다.

플러그인 기반 솔루션인 Flex-volume은 실행 파일 기반 API를 타사 플러그인에 노출하여 이 문제를 해결하려고 시도했습니다. 이 솔루션은 k8s 바이너리와의 분리 측면에서 CSI와 유사한 원리에 따라 작동했지만 이 접근 방식에는 여러 가지 문제가 있었습니다. 첫째, 드라이버 파일을 배포할 수 있도록 마스터 및 호스트 파일 시스템에 대한 루트 액세스가 필요했습니다. 둘째, 호스트에서 사용할 수 있다고 가정되는 운영 체제 종속성 및 사전 요구 사항에 대한 상당한 부담이 수반되었습니다.

CSI는 컨테이너화를 사용하고 k8s 스토리지 프리미티브를 활용하여 이러한 문제를 해결합니다. CSI는 트리 외부 스토리지 플러그인을 사용할 수 있는 유비쿼터스 솔루션이 되었습니다. 이를 통해 스토리지 공급자는 스토리지 클래스, PersistentVolumes(PV) 및 PersistentVolumeClaims(PVC)와 같은 표준 k8s 프리미티브를 통해 플러그인을 배포할 수 있습니다.

CSI의 주요 목표는 모든 컨테이너 오케스트레이터에서 모든 유형의 스토리지 시스템을 노출하기 위한 메커니즘을 표준화하는 것입니다.

관련 콘텐츠: Kubernetes Persistent Volumes에 대한 가이드 읽기

CSI 볼륨을 사용하는 방법은 무엇입니까?

CSI 볼륨은 Kubernetes 워크로드에서 사용할 수 있는 PersistentVolume 리소스를 프로비저닝하는 데 사용할 수 있습니다. PersistentVolumes은 동적으로(워크로드에서 요청할 때) 또는 수동으로 프로비저닝할 수 있습니다.

동적 프로비저닝

CSI 스토리지 플러그인을 참조하는 StorageClass를 생성할 수 있습니다. 이를 통해 Kubernetes 워크로드가 PersistentVolumes를 동적으로 생성할 수 있습니다. 이러한 PersistentVolumes에 저장된 데이터는 CSI 플러그인에 정의된 스토리지 장비에 유지됩니다.

예를 들어, 다음 StorageClass를 사용하면 "csi-driver.example.com"라는 CSI 플러그인을 사용하여 "fast-storage" 유형의 스토리지 볼륨을 프로비저닝할 수 있습니다. (이 예제와 아래의 다른 예제는 공식 Kubernetes CSI 블로그 게시물에서 공유되었습니다.)

CSI 1

Kubernetes 엔터티가 이 StorageClass를 요청하는 PersistentVolumeClaim 오브젝트를 생성하면, 해당 StorageClass에 속하는 PersistentVolume이 동적으로 프로비저닝됩니다. 아래 이미지는 fast-storage StorageClass를 참조하는 PVC의 예시를 보여줍니다.

CSI 2

위의 StorageClass 정의에는 type이라는 세 개의 매개 변수와 mysecret 및 mynamespace라는 두 개의 비밀이 있습니다. PVC가 선언되면 백그라운드에서 다음과 같은 일이 발생합니다.

  1. StorageClass는 CSI 플러그인(csi-driver.example.com)에서 CreateVolume 호출을 수행하여 스토리지 장치에 대한 액세스를 활성화하는 시크릿을 포함한 매개 변수를 전달합니다.
  2. Kubernetes는 CSI 플러그인 장치에 물리적으로 저장된 스토리지 볼륨을 나타내는 PersistentVolume 오브젝트를 자동으로 생성합니다.
  3. Kubernetes는 PersistentVolume(PV) 오브젝트를 관련 PersistentVolumeClaim(PVC)에 바인딩합니다.
  4. 이 시점부터 클레임을 제기한 Pod 또는 컨테이너는 스토리지 볼륨을 사용할 수 있습니다.

블로그 게시물 읽기: NetApp Trident 및 Cloud Volumes ONTAP을 사용한 동적 Kubernetes 영구 볼륨 프로비저닝

수동 프로비저닝

Kubernetes에서 볼륨을 수동으로 프로비저닝하고 PVC 메커니즘을 사용하지 않고 워크로드에서 사용할 수 있도록 할 수 있습니다. 아래 이미지는 워크로드에서 "existingVolumeName"이라는 스토리지 볼륨을 사용할 수 있도록 하는 PV 객체의 예를 제공합니다. 위와 같이 CSI 볼륨은 스토리지 플러그인 csi-driver.example.com을 참조합니다.

CSI 3

볼륨 연결 및 마운트

아래 이미지는 Kubernetes Pod 템플릿이 PVC를 참조하여 CSI 볼륨에 액세스하는 방법을 보여주는 예를 제공합니다.

파드 템플릿에 PersistenVolumeClaim이 나타나면 파드가 스케줄링될 때마다 Kubernetes는 ControllerPublishVolume, NodeStageVolume, NodePublishVolume을 포함하여 CSI 플러그인에서 여러 작업을 트리거합니다. 이렇게 하면 스토리지 볼륨이 생성되고 마운트되며 파드에서 실행되는 컨테이너에서 사용할 수 있게 됩니다.

CSI 4

Kubernetes를 위한 자체 CSI 드라이버 구축

CSI 드라이버 구성 요소

Kubernetes의 CSI 드라이버는 일반적으로 컨트롤러 및 노드별 구성 요소와 함께 배포됩니다.

컨트롤러 구성 요소
컨트롤러 플러그인은 Deployment 또는 StatefulSet으로 배포되며 클러스터 내의 모든 노드에 마운트될 수 있습니다. 이는 CSI Controller 서비스를 구현하는 CSI 드라이버와 사이드카 컨테이너(또는 여러 컨테이너)로 구성됩니다. 컨트롤러 사이드카 컨테이너는 일반적으로 Kubernetes 오브젝트와 상호 작용하며 CSI Controller 서비스도 호출합니다.

컨트롤러는 호스트에 직접 액세스할 필요가 없으며 외부 컨트롤 플레인 서비스 및 Kubernetes API를 통해 모든 작업을 수행할 수 있습니다. 고가용성(HA)을 위해 컨트롤러 구성 요소의 여러 복사본을 배포할 수 있지만, 리더 선택을 구현하여 특정 시간에 하나의 컨트롤러만 활성화되도록 해야 합니다.

컨트롤러 사이드카에는 external-provisioner, external-attacher, external-snapshotter 및 external-resizer가 있습니다. 배포에 특정 사이드카를 포함하는 것은 사이드카 페이지에 자세히 설명된 사양에 따라 선택 사항일 수 있습니다.

컨트롤러는 Kubernetes 이벤트 관리를 담당하는 사이드카 컨테이너와 통신합니다. 그런 다음 컨트롤러는 CSI 드라이버에 관련 호출을 보냅니다. UNIX 도메인 소켓은 emptyDir 볼륨을 통해 공유되어 사이드카와 드라이버 간의 호출을 가능하게 합니다.

컨트롤러 사이드카는 역할 기반 액세스 제어(RBAC) 규칙을 사용하여 Kubernetes 오브젝트와의 상호 작용을 제어합니다. 사이드카 리포지토리는 RBAC 정책에 통합할 수 있는 RBAC 구성의 예를 제공합니다.

노드별 구성 요소
노드 플러그인은 DaemonSet을 통해 클러스터의 모든 노드에 배포되어야 합니다. 이는 CSI 노드 서비스를 구현하는 CSI 드라이버와 노드 드라이버 레지스트라 역할을 하는 사이드카 컨테이너로 구성됩니다.

노드 컴포넌트는 kubelet과 통신하며, kubelet은 모든 노드에서 실행되며 CSI 노드 서비스에 대한 호출을 처리합니다. 호출은 스토리지 시스템에서 스토리지 볼륨을 마운트 또는 마운트 해제하여 Pod에서 사용할 수 있도록 할 수 있습니다. kubelet은 호스트의 HostPath 볼륨을 통해 공유되는 UNIX 도메인 소켓을 사용하여 CSI 드라이버를 호출합니다. 추가 UNIX 도메인 소켓은 node-driver-registrar가 kubelet에 드라이버를 등록하는 데 사용됩니다.

노드 플러그인은 드라이버 볼륨을 마운트하기 위해 호스트에 직접 액세스해야 합니다. kubelet이 파일 시스템 마운트와 블록 장치를 사용할 수 있도록 하기 위해, CSI 드라이버는 kubelet이 드라이버 컨테이너에 의해 생성된 마운트를 볼 수 있도록 하는 양방향 마운트 지점을 사용해야 합니다.

배포

container-storage-interface_diagram1

Kubernetes는 CSI 볼륨 드라이버의 패키징을 결정하지는 않지만, Kubernetes에서 컨테이너화된 CSI 드라이버의 배포를 간소화하기 위한 권장 사항을 제공합니다.

스토리지 공급업체는 컨테이너화된 CSI 볼륨 드라이버를 배포할 때 다음 단계를 수행하는 것이 좋습니다.

  • 볼륨 플러그인의 동작을 구현하고 UNIX 도메인 소켓을 통해 gRPC 인터페이스를 노출하는 컨테이너를 생성합니다. 컨테이너에는 "CSI volume driver"라는 레이블을 지정하고 CSI 사양(컨트롤러, 노드 및 ID 서비스 포함)에 따라 구성해야 합니다.
  • 볼륨 드라이버 컨테이너를 external-attacher, external-provisioner, cluster-driver-registrar, node-driver-registrar, external-resizer, external-snapshotter 및 livenessprobe와 같은 Kubernetes 팀에서 제공하는 추가 컨테이너로 그룹화합니다. 이러한 컨테이너는 드라이버 컨테이너와 Kubernetes의 상호 작용을 용이하게 합니다.
  • 클러스터 관리자에게 관련 DaemonSet 및 StatefulSet을 배포하고 Kubernetes 클러스터에서 공급업체의 스토리지 시스템에 대한 지원을 추가하도록 지시합니다.

잠재적으로 더 간단한 배포를 위한 또 다른 옵션은 external-provisioner 및 external-attacher를 포함하여 모든 구성 요소를 단일 DaemonSet에 두는 것입니다. 그러나 이 전략은 더 많은 리소스를 사용하며 external-attacher 및 external-provisioner 구성 요소에 대해 리더 선택 프로토콜(예: https://git.k8s.io/contrib/election)을 사용해야 합니다.

권한 있는 Pod 활성화

Kubernetes 클러스터는 CSI 드라이버 사용을 허용하기 위해 권한 있는 Pod를 활성화해야 합니다. 예를 들어, kubeadm, GCE 및 GKE와 같은 특정 환경에서는 kubelet 및 API 서버에 대해 --allow-privileged 플래그를 true로 설정해야 하며, 이는 기본값입니다.

API 서버는 다음과 같은 권한 있는 플래그를 사용하여 시작해야 합니다.

$ ./kube-apiserver ... --allow-privileged=true ... $ ./kubelet ... --allow-privileged=true ...

 

마운트 전파 활성화

Container Storage Interface에는 동일한 노드 또는 Pod 내의 컨테이너 간에 마운트된 볼륨을 공유할 수 있는 마운트 전파 기능이 필요합니다. 클러스터의 Docker 데몬은 마운트 전파를 활성화하기 위해 마운트 공유를 허용해야 합니다.

NetApp Cloud Volumes ONTAP을 사용하는 Kubernetes CSI

NetApp Cloud Volumes ONTAP은 업계 최고의 엔터프라이즈급 스토리지 관리 솔루션으로, AWS, Azure, Google Cloud에서 안전하고 검증된 스토리지 관리 서비스를 제공합니다. Cloud Volumes ONTAP 용량은 페타바이트 단위로 확장할 수 있으며 파일 서비스, 데이터베이스, DevOps 또는 기타 엔터프라이즈 워크로드와 같은 다양한 사용 사례를 지원하고 고가용성, 데이터 보호, 스토리지 효율성, Kubernetes 통합 등을 비롯한 강력한 기능 세트를 제공합니다.

특히 Cloud Volumes ONTAP은 컨테이너화된 워크로드의 Kubernetes 영구 볼륨 프로비저닝 및 관리 요구사항을 지원합니다.

Kubernetes NFS Provisioning File Services with Cloud Volumes ONTAP and Trident에 대해 자세히 알아보십시오.

이러한 Kubernetes 워크로드와 Cloud Volumes ONTAP 사례 연구에서 Cloud Volumes ONTAP이 컨테이너화된 애플리케이션의 과제를 해결하는 데 어떻게 도움이 되는지 자세히 알아보십시오.

Drift chat loading