[번역] A Deep Dive into the Kubernetes vSphere CSI Driver with TKGI and TKG

출처 : https://tanzu.vmware.com/content/blog/a-deep-dive-into-the-kubernetes-vsphere-csi-driver-with-tkgi-and-tkg

Kubernetes vSphere CSI 드라이버는 점차적으로 Kubernetes용 vSphere 스토리지의 원래 구현인 vSphere Cloud Provider(일명 "Hatchway"라고도 함)를 대체함에 따라 더욱 부각되고 있다.

이 게시물에서는 스토리지 드라이버의 구현(in-tree에서 out-of-tree로)의 진화를 검토하고 vSphere CSI 드라이버의 아키텍처 및 구성 요소에 대한 세부 정보를 살펴본 다음, TKGI 및 TKG에 스토리지 드라이버의 설치 및 사용을 살펴보기로 한다. TKG 클러스터에서 vSphere CSI 드라이버에 대한 지원 세부 정보(vSphere 6.7U3과 7.0 모두)을 통해 모든 VMware 제품에서 구현되는 방법에 대한 전반적인 이해를 제공한다.

In-tree에서 out-of-tree로 쿠버네티스 구현

VMware는 vSphere를 Kubernetes를 실행하는 데 가장 적합한 플랫폼으로 만드는 데 앞장서 왔다. Kubernetes 내에서 vSphere의 원래 구현은 이미 고객과 우리 스스로 수천 번 이상 사용되어 왔다. 그러나 in-tree 드라이버는 쿠버네티스(CSI 드라이버의 경우, 예를 들어, 쿠버네티스 v1.21의 경우 in-tree 구현을 전적으로 부정하는 것이 목표)로부터 더 이상 사용되지 않고 있으므로, 이제 다음 사항을 살펴봐야 할 시점이다. 

VMware는 Kubernetes에 가장 많이 기여하는 기업 중 하나이므로, Kubernetes 커뮤니티 내에서 VMware의 지속적인 참여와 리더십은 vSphere가 계속해서 Kubernetes를 위한 최고의 플랫폼이 될 것임을 보여주는 한 가지 증거에 지나지 않는다. 우리의 목표는 고객들이 쿠버네티스를 빠르고 원활하게 채택할 수 있도록 하는 것이다. 커뮤니티가 CSI(Container Storage Interface)와 CCM(Cloud Controller Manager) 드라이버를 주류로 채택함에 따라 VMware는 in-tree 드라이버의 기능을 능가했으며 이제 CSI에 대한 완벽한 지원을 제공하고 있다.

쿠버네티스 프로젝트는 오픈 소스 소프트웨어의 핵심 원칙 중 하나인, 즉 관련된 모든 사람들에게 가장 이익이 되는 일을 해야 한다는 것에 의해 매우 많이 안내되고 있다. VMware는 당사의 드라이버에 변경, 기능 또는 기능이 노출되도록 보장하고 있다. 컴퓨팅에서 스토리지, 네트워킹에 이르기까지 스택의 모든 구성 요소에 대해 vSphere 호환성을 지원함으로써 커뮤니티의 요구에 부응하고 있다. VMware는 오픈 소스 커뮤니티를 매우 중요하게 여긴다. 우리는 공동체의 결정에 충실할 뿐만 아니라, 이 프로젝트를 진전시켜 의미 있는 방법으로 기여하고 있다. 

VMware는 또한 오픈 소스 구성요소를 더 많이 채택하고 있다. vSphere CSI 및 vSphere CCM 드라이버는 GitHub에서 설치 및 구성에 대한 설명서(CSI 및 CCM)와 함께 제공되며, 이러한 드라이버는 공개용으로만 사용할 수 있을 뿐만 아니라, 이제 당사의 상용 제품 내에서 지원되는 구성 요소가 되었다. 이는 누구에게나 어떤 코드가 병합되고 있고 기능이 어떻게 구현되고 있는지 정확하게 알 수 있는 능력을 제공하며, 새로운 요청에 대한 추가적인 감독 수단을 제공한다.

itemeditorimage_5ee2343b61b1c.jpg

In-tree 볼륨 플러그인의 전체적인 맥락과 트리 외 CSI 구현을 추진하기로 커뮤니티가 결정한 사항을 이해하기 위해 SIG 스토리지 팀의 이 게시물은 필요한 모든 정보를 제공한다.

vSphere CNS CSI 아키텍처 및 구성 요소

Kubernetes vSphere CSI 드라이버는 vSphere CNS CSI라는 아키텍처로 구현되며, 다음과 같은 두 가지 핵심 구성 요소로 구성된다.

  • vCenter Server의 CNS
  • Kubernetes 클러스터의 vSphere 볼륨 드라이버

CNS 제어면은 컨테이너 볼륨과 영구 볼륨과 같은 볼륨 개념을 vSphere에 도입한다. 생성, 읽기, 업데이트, 삭제 등의 작업을 포함하여 컨테이너 볼륨의 라이프사이클 관리를 담당하는 컨테이너 볼륨의 저장 제어부다. 또한 볼륨 메타데이터 관리, 스냅샷 및 복원, 볼륨 복사본 및 클론 관리, 볼륨 상태 및 규정 준수 모니터링을 담당한다. 이러한 볼륨은 가상 시스템 라이프사이클과 독립적이며 vSphere에서 고유한 ID를 가진다.

쿠버네티스 클러스터에서 CNS는 두 개의 하위 구성 요소인 CSI 드라이버와 동기화기를 포함하는 볼륨 드라이버를 제공한다. CSI 드라이버는 볼륨 프로비저닝, VM에 볼륨 연결 및 분리, 노드 VM 내의 포드로부터 볼륨 마운트, 포맷 및 마운트 해제 등을 담당한다. CSI 드라이버는 쿠베르네테스용 out-of-tree CSI 플러그인으로 제작되었다. 싱커(syncer)는 PV, PVC, 포드 메타데이터를 CNS에 푸시하는 일을 담당한다.

itemeditorimage_5ee2326477ee6.jpg

쿠버네티스 클러스터에 다음과 같은 포드가 배치된다.

vsphere-csi-controller pod(K8s statefulset으로 배포됨)는 다음과 같이 구성된다.

  • vCenter에서 K8s api-server와 CNS 구성 요소 간의 중간 역할 수행
  • PVC/PV 개체와 관련된 k8s 이벤트 감시(생성, 삭제)
  • 볼륨 작업을 위해 CNS 호출 호출(생성/삭제/업데이트/첨부/디테일)
  • PVC/PV 개체의 메타데이터를 CNS 내부 데이터베이스와 동기화

다음과 같은 vsphere-csi-node 포드(K8s DaemonSet로 배포됨)

  • 워커 노드의 로컬 큐브릿과 상호 작용
  • 포드 액세스 볼륨 관련 작업 수행(포맷/마운트/해제)

내장된 CNS 구성 요소와 통신하려면 vsphere-csi-controller 포드만 vCenter와 상호 작용하면 된다.

이제 한 층 더 깊이 들어가 위의 두 개의 포드가 살고 있는 모든 용기를 해부해 봅시다.

아래에 표시된 많은 정보는 VMware Tanzu 블로그 포털의 블로그 게시물 "Supercharging Kubernetes Storage with CSI"에서 얻어진 것이다.

itemeditorimage_5ee232f4ca094.jpg

다음은 vsphere-csi-controller 포드 내부의 컨테이너(출력은 kubectl describe pod 명령에서 가져온 다음 필터링됨)다.

# kubectl describe pod vsphere-csi-controller -n kube-system
  csi-attacher: 
    Container ID:  docker://ada8e66ef776adc8884e3a26af3381668766ce31a3e320305643445525019e04 
    Image: quay.io/k8scsi/csi-attacher:v1.1.1 
  vsphere-csi-controller:   
    Container ID:  docker://15a16675a58f6ee6beabdc5324851cdf059820c554bf98e5b76416e0f26744d6 
    Image: gcr.io/cloud-provider-vsphere/csi/release/driver:v1.0.2 
 liveness-probe: 
    Container ID:  docker://57c9498613fcb30b67963797a28a125bae2bb3d21e6ff9d18b521236be54a576 
    Image: quay.io/k8scsi/livenessprobe:v1.1.0 
  vsphere-syncer: 
    Container ID:  docker://4196c2be0f21cc34b15677715b9edd529fd031c8fc667380847635180fbfe553 
    Image: gcr.io/cloud-provider-vsphere/csi/release/syncer:v1.0.2 
  csi-provisioner: 
    Container ID:  docker://9eab0125e0486500301c6c799631cd776b34ca7eb4aa2f2e54624f90bed2fd76 
    Image: quay.io/k8scsi/csi-provisioner:v1.2.2 

각 컨테이너의 상세 내역은 다음과 같다.

  • csi-attacher:

지정된 노드에 새 볼륨을 연결하기 위해 vsphere-csi-controller(CSI 드라이버) 컨테이너로 gRPC 호출을 시작하라는 표시인 VolumeAttachment 오브젝트의 API 서버를 감시한다. 오브젝트가 제거되면 CSI 드라이버에 대한 호출을 시작하여 볼륨을 분리한다.

  • vsphere-csi-csi-controller(CSI 드라이버):

vCenter의 CNS 구성 요소와 상호 작용하여 볼륨 작업에 대한 API 호출: Create/Delete/Update/Attach/Detach를 호출하다.

  • liveness-probe:

전체 포드가 제대로 작동하는지 보장한다.

  • vsphere-syncer:

PV 및 PVC와 관련된 K8s 메타데이터 정보를 CNS에 다시 보고하여 디스플레이 한다.

  • csi-provisioner:

CSI에 대해 주석을 달은 새로운 PVC(PersistentVolumeClaims) 오브젝트에 대한 API 서버를 검사하여 볼륨 생성 및 삭제 요청을 처리한다. 발견 즉시 PVC의 정보를 사용하여 gRPC 호출을 사용하여 볼륨 작업을 공동으로 배치된 CSI 드라이버(vsphere-sci-csi-controller) 컨테이너에 위임함으로써 새 볼륨 생성을 개시한다. 반대로 PVC가 제거되면 이 구성 요소는 자동으로 운전자에게 볼륨 작동 호출을 전송하여 볼륨을 삭제한다.

다음 컨테이너는 vsphere-csi-node 포드 내부에서 발견된다(출력은 kubectl describe pod 명령에서 가져온 다음 필터링).

# kubectl describe pod vsphere-csi-node -n kube-system
  node-driver-registrar: 
    Container ID:  docker://8f8c7893ebf4282faf33e0eafe7580a0db7ef4ce19a722d6ea32b2f929f4a4a8 
    Image: quay.io/k8scsi/csi-node-driver-registrar:v1.1.0 
  vsphere-csi-node: 
    Container ID:  docker://d0e2c5bf08d507a4dd077659fcc331a4f9a09ae6cb4f7ee9622f502cefeebc3b 
    Image: gcr.io/cloud-provider-vsphere/csi/release/driver:v1.0.2 
liveness-probe: 
    Container ID:  docker://09f24ce44e926b505ca3843fa42ca27a7a88299e2a1fe47c482fb28429345b4e 
    Image: quay.io/k8scsi/livenessprobe:v1.1.0 

각 컨테이너의 상세 내역은 다음과 같다.

  • node-driver-registrar:

내부 플러그인 등록 메커니즘을 사용하여 vsphere-csi-node(CSI 드라이버)의 ID 서비스 끝점을 Kubelet에 등록하고 노출하는 역할 일단 등록되면, Kubellet은 마운트 같은 노드별 볼륨 작업을 처리하기 위해 Unix 도메인 소켓 위에 gRPC를 사용하여 드라이버를 호출할 수 있다.

  • vsphere-csi-node(CSI 드라이버):

볼륨 포드 액세스 관련 작업 수행(포맷/마운트/언마운트)

  • 내부 Kubelet 플러그인:

kubelet의 일부로 내부적으로 실행되며 driver author와 CSI 사용자에게는 불투명하다. 노드의 파일 시스템에 대한 액세스가 필요한 볼륨 작업을 조정한다. 예를 들어 CSI Kubelet 플러그인은 워크로드 포드에 사용할 수 있는 볼륨을 마운트하기 위한 요청을 수신한다. 마운트 지점을 준비한 후 작업을 vsphere-csi-node(CSI 드라이버) 컨테이너에 위임하여 작업을 완료한다.

  • lativity-reason:

전체 포드가 제대로 작동하는지 보장한다.

TKGI 기반 K8s 클러스터에 vSphere CSI 드라이버 배포

TKGI 기반 K8s 클러스터에 vSphere CSI 드라이버를 배포하려면 다음과 같은 몇 가지 사전 요구 사항을 따른다.

  • vSphere 6.7U3 이상이 설치되어 있다.
  • TKGI 1.7.0 이상이 설치되어 있다.
  • K8s 클러스터를 만드는 데 사용되는 TKGI 플랜에는 "allow privileged" 옵션이 활성화되어 있다.
  • vsphere-csi-controller 포드가 vCenter에 액세스할 수 있다. Flannel의 경우 K8s worker 노드가 vCenter에 액세스할 수 있다는 의미다. NSX-T의 경우 T0(또는 공유 T1 모델이 사용되는 경우 T1)의 네임스페이스 kube-system의 SNAT에 할당된 부동 IP가 vCenter에 도달할 수 있다.

TKGI 버전 1.7.0의 경우, 설치는 수동이며(향후 릴리스에서 프로세스가 완전히 자동화되도록 하는 계획) 다음 5단계를 수반한다.

  • 1단계: 적절한 TKGI 플랜을 사용하여 K8s 클러스터 구축
  • 2단계: CSI 암호 생성
  • 3단계: ServiceAccount 및 ClusterRoleBinding 역할 생성
  • 4단계: vSphere CSI 컨트롤러 상태 저장 세트 및 CSI 드라이버 설치
  • 5단계: vSphere CSI 노드 데몬셋 설치

모든 YAML 매니페스트 파일은 여기에 있으며 vSphere CSI 드라이버의 지원되는 버전은 1.0.2입니다. 자세한 내용을 보려면 이 GitHub 페이지에는 모든 세부 단계가 포함되어 있다.

각 단계에 대해 자세히 살펴봅시다.

1단계: 적절한 TKGI 계획을 사용하여 K8s 클러스터 구축

다음 명령을 사용하여 새 K8s 클러스터를 인스턴스화하십시오.

$ pks create-cluster pks-cluster-cns-csi --external-hostname pks-cluster-cns-csi --plan large --num-nodes 3 

TKGI 플랜 'large'에 'allow privileged' 속성이 활성화되어 있어야 한다.

2단계: CSI 암호 생성

다음과 같이 csi-vsphere.conf 파일을 생성한다.

[Global] 
cluster-id = "pks-cluster-cns-csi"

[VirtualCenter "10.1.1.1"] 
insecure-flag = "true" 
user = "administrator@vsphere.local" 
password = "password" 
port = "443" 
datacenters = "vSAN_Datacenter" 

사용자 환경에 따라 파일 내용을 사용자 정의하십시오. 개별 필드는 다음과 같이 정의된다.

  • cluster-id ID: K8s 클러스터의 클러스터 ID(CNS CSI가 설치된 모든 K8s 클러스터에 대해 고유해야 함)
  • VirtualCenter: vCenter 인스턴스의 IP 또는 FQDN
  • user/password: vCenter에 액세스하기 위한 자격 증명
  • datacenters: vSphere 데이터 센터 이름

이 자료에는 모든 vSphere CSI 드라이버 관련 작업에 대해 평균 vCenter 사용자 최소 권한을 부여하는 CNS 및 CSI에 필요한 vCenter 역할 및 권한이 나열되어 있으다.

위의 파일을 사용하여 K8s 암호를 만들려면 다음 명령을 적용한다:

$ kubectl create secret generic vsphere-config-secret --from-file=csi-vsphere.conf --namespace=kube-system
secret/vsphere-config-secret created 

3단계: ServiceAccount 및 ClusterRoleBinding 역할 생성

다음 YAML 파일을 적용하여 세 개의 K8s 개체를 생성한다.

$ kubectl apply -f vsphere-csi-controller-rbac.yaml
serviceaccount/vsphere-csi-controller created 
clusterrole.rbac.authorization.k8s.io/vsphere-csi-controller-role created 
clusterrolebinding.rbac.authorization.k8s.io/vsphere-csi-controller-binding created 

4단계: vSphere CSI 컨트롤러 상태 저장 세트 및 CSI 드라이버 설치

$ kubectl apply -f vsphere-csi-controller-ss-data-1.yaml
statefulset.apps/vsphere-csi-controller created 
csidriver.storage.k8s.io/csi.vsphere.vmware.com created 

이 명령에서 가장 주목해야하는 결과는 vSphere CSI 컨트롤러 포드(상태 저장 세트로 배포됨)가 생성되는 것이다:

$ kubectl get pod -n kube-system 
NAME                              READY   STATUS    RESTARTS   AGE 
<SNIP> 
vsphere-csi-controller-0          5/5     Running   0          2m53s 

이 시점에서 vSphere CSI 드라이버는 etcd 키/값 저장소 내에 생성되고 표준 K8s 객체 csidriver는 이제 인스턴스화된다.

$ kubectl get csidriver 
NAME                     CREATED AT 
csi.vsphere.vmware.com   2020-04-01T17:56:59Z 

5단계: vSphere CSI 노드 데몬셋 설치

마지막 단계는 vSphere CSI 노드 포드(K8s worker 노드당 하나씩)를 생성하는 것이다. 이 작업은 다음 YAML 파일을 적용하여 수행된다.

$ kubectl apply -f vsphere-csi-node-ds-data.yaml 
daemonset.apps/vsphere-csi-node created

작업자 노드당 하나의 vSphere CSI 노드 포드가 있는지 빠르게 확인한다.

$ kubectl get pod -n kube-system 
NAME                              READY   STATUS    RESTARTS   AGE 
vsphere-csi-controller-0          5/5     Running   0          6m37s 
vsphere-csi-node-22wbz            3/3     Running   0          35s 
vsphere-csi-node-4cs9k            3/3     Running   0          35s 
vsphere-csi-node-6asxw            3/3     Running   0          35s 

TKGI 기반 K8s 클러스터에서 vSphere CSI 드라이버 사용

TKGI 기반 K8s 클러스터에서 vSphere CSI 드라이버를 사용하려면 K8s 스토리지 클래스 정의를 생성한다.

apiVersion: storage.k8s.io/v1 
kind: StorageClass 
metadata: 
  name: cassandra-sc-csi 
  annotations: 
     storageclass.kubernetes.io/is-default-class: "true" 
provisioner: csi.vsphere.vmware.com 
parameters: 
  datastoreurl: "ds:///vmfs/volumes/vsan:52d8eb4842dbf493-41523be9cd4ff7b7/" 

프로바이더는 csi.vsphere.vmware.com으로 설정해야 한다는 점에 유의하십시오. 특정 데이터스토어에 대해 vCenter에서 제공하는 URL이 datastoreurl이다.

pngbase64f875c6182a397de3.png

이게 전부다!

스토리지 클래스를 참조하는 PVC를 생성하여 vSphere CSI 드라이버를 즉시 활용한다. 모든 PV는 FCD(First Class Disk)로 생성되며 지정된 데이터스토어 내의 'fcd'라는 디렉토리에 저장된다.

pngbase64311ab9543d3ca19.png

마지막으로, CNS의 기능 덕분에 vSphere Web의 모든 컨테이너 볼륨을 볼 수 있는 방법은 다음과 같다.

vSphere 클러스터 → Monitor → Cloud Native Storage → Container Volumes

pngbase64a9f6cca82afda6d6.png

TKG 클러스터에서 vSphere CSI 드라이버 지원

전체 프로세스를 자동화하는 클러스터 API 덕분에 TKG에 vSphere CSI 드라이버가 자동으로 설치된다. 지금까지 본 모든 개념, 아키텍처, 구현은 TKG의 경우 그대로 유지된다. 각 K8s 클러스터에는 worker 노드당 하나의 vsphere-csi-controller pod(StatefulSet로 배포됨)와 하나의 vsphere-csi-node pod(DaemonSet으로 배포됨)가 있다. 위의 각 포드는 이전에 열거한 것과 동일한 내장형 컨테이너 목록을 가지고 있다.

예를 들어 vSphere 6.7U3(TKG 워크로드 클러스터)에서 TKG 버전 1.0의 경우에 포드와 컨테이너를 살펴보자. vsphere-scsi-controller 포드의 컨테이너부터 시작할 것이다.

  csi-attacher: 
    Container ID:  containerd://5315a8525d85e14120122f351892e39822c0c344b854b78bbce28fb257e410c3 
    Image: registry.tkg.vmware.run/csi/csi-attacher:v1.1.1_vmware.7 
  vsphere-csi-controller:   
    Container ID:  containerd://78e68240a46c28985b7cac3cfc3b12855e92961a7d15009f4ffcb29decc1f385 
    Image: registry.tkg.vmware.run/csi/vsphere-block-csi-driver:v1.0.2_vmware.1 
  liveness-probe: 
    Container ID:  containerd://54023d3443e6fc0a2cbd8c5aeaf1bec788c902e8c4c7aef11413df36a5f207aa 
    Image: registry.tkg.vmware.run/csi/csi-livenessprobe:v1.1.0_vmware.7 
  vsphere-syncer: 
    Container ID:  containerd://67cc0abb8fb511c3cdc1e89e5a7753f6c73b6de6f6f92b7aa348658911df5069 
    Image: registry.tkg.vmware.run/csi/volume-metadata-syncer:v1.0.2_vmware.1 
  csi-provisioner: 
    Container ID:  containerd://73fdf6f38e8c5e27d0283bd92c1726e4aeb3633605ef25332015b92acfbd8d2e 
    Image: registry.tkg.vmware.run/csi/csi-provisioner:v1.4.0_vmware.2

그리고 여기 vsphere-csi-node 포드용 컨테이너가 있다.

  node-driver-registrar: 
    Container ID:  containerd://421246337e64f4230f73e69fb68ef5e0f6c7fbf8931845da27f269f6a4f67b6e 
    Image: registry.tkg.vmware.run/csi/csi-node-driver-registrar:v1.1.0_vmware.7 
  vsphere-csi-node: 
    Container ID:  containerd://46a9031e2b7a3f6f62740ba398ec02e190fbe5526d3f7aaf652e9ac0ee5613c2 
    Image: registry.tkg.vmware.run/csi/vsphere-block-csi-driver:v1.0.2_vmware.1 
liveness-probe: 
    Container ID:  containerd://ee64af5d681b62462b1383f8e9a722c5950a2df05f370fb5bb0f47dc28df105e 
    Image: registry.tkg.vmware.run/csi/csi-livenessprobe:v1.1.0_vmware.7 

vSphere CSI 드라이버 지원 기능

vSphere CSI 드라이버에서 제공하는 최신 지원 기능 목록은 지원 기능 매트릭스를 참조하십시오. 여기 샘플이 있다.

pngbase6457da7da35f6f940a.png