VMware TKG(Tanzu Kubernetes Grid)와 관련하여 일반적으로 받는 질문은 vSAN 파일 서비스를 지원하는지 여부, 특히 컨테이너 볼륨용 RWX(Read-Write-Multi) 기능이다. 이 문제를 해결하려면 TKG가 어떻게 프로비저닝되고 있는지 구별할 필요가 있다. TKG에는 vSphere, AWS 또는 Azure에서 실행할 수 있는 멀티 클라우드 버전이 있으며, TKG 관리자로부터 배포된다. 그 후 vSphere with Tanzu / Tanzu와 VCF를 통해 네임스페이스에 ‘워크로드 클러스터’가 구축되는 내장 TKG 에디션도 있다. TKG가 vSAN 파일 서비스에서 RWX 볼륨을 동적으로 프로비저닝할 수 있는지 여부에 대한 질문에 답하기 위해 현재 TKG의 멀티 클라우드 버전만 이를 지원한다. 이 기능을 지원하기 위해 감독자 클러스터의 CSI 드라이버와 “workload/guest” 클러스터의 pvCSI 드라이버가 업데이트되어야 하므로 작성 시 TKG의 내장 버전은 이 기능을 지원하지 않는다.
다음 절에서는 멀티 클라우드 버전의 TKG와 함께 vSAN 파일 서비스의 RWX 볼륨을 사용하는 방법을 신속하게 설명한다. 이것은 TKG v1.2라는 점에 유의한다. 3개의 제어부 노드와 5개의 작업자 노드로 구성된 워크로드 클러스터뿐만 아니라 관리 클러스터를 이미 구축했다. “bigstripe”라 부르는 vSphere/vSAN 스토리지 정책을 사용해서 새로운 StorageClass를 구축하고, 이를 사용해서 읽기-쓰기-다중 볼륨 배포 이렇게 하면 읽기-쓰기-다중 볼륨으로 사용될 vSAN 파일 서비스 공유의 생성이 인스턴스화된다. 단계는 아래에 나와 있다.
cormac@cormac-tkgm:~$ tkg version Client: Version: v1.2.0 Git commit: 05b233e75d6e40659247a67750b3e998c2d990a5 cormac@cormac-tkgm:~$ tkg get clusters --include-management-cluster NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES my-cluster default running 3/3 5/5 v1.19.1+vmware.2 <none> tkg-mgmt-vsphere-20201130160352 tkg-system running 3/3 1/1 v1.19.1+vmware.2 management @cormac-tkgm:~$ tkg get credentials my-cluster Credentials of workload cluster 'my-cluster' have been saved You can now access the cluster by running 'kubectl config use-context my-cluster-admin@my-cluster' cormac@cormac-tkgm:~$ kubectl config use-context my-cluster-admin@my-cluster Switched to context "my-cluster-admin@my-cluster". cormac@cormac-tkgm:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION my-cluster-control-plane-56hjh Ready master 6d17h v1.19.1+vmware.2 my-cluster-control-plane-gdd2b Ready master 6d17h v1.19.1+vmware.2 my-cluster-control-plane-qwjf6 Ready master 6d17h v1.19.1+vmware.2 my-cluster-md-0-6946b5db64-2z8md Ready <none> 6d17h v1.19.1+vmware.2 my-cluster-md-0-6946b5db64-98gnt Ready <none> 6d17h v1.19.1+vmware.2 my-cluster-md-0-6946b5db64-f6wz9 Ready <none> 4d v1.19.1+vmware.2 my-cluster-md-0-6946b5db64-rm9sm Ready <none> 6d17h v1.19.1+vmware.2 my-cluster-md-0-6946b5db64-smdtl Ready <none> 6d1h v1.19.1+vmware.2 cormac@cormac-tkgm:~$ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE default (default) csi.vsphere.vmware.com Delete Immediate false 6d17h cormac@cormac-tkgm:~$ cat big-stripe-storage-class.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: bigstripe annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: csi.vsphere.vmware.com parameters: storagePolicyName: "Big-Stripe" cormac@cormac-tkgm:~$ kubectl apply -f big-stripe-storage-class.yaml storageclass.storage.k8s.io/bigstripe created cormac@cormac-tkgm:~$ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE bigstripe (default) csi.vsphere.vmware.com Delete Immediate false 6s default (default) csi.vsphere.vmware.com Delete Immediate false 6d17h cormac@cormac-tkgm:~$ cat file-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: file-pvc-demo-5g spec: storageClassName: bigstripe accessModes: - ReadWriteMany resources: requests: storage: 5Gi cormac@cormac-tkgm:~$ kubectl apply -f file-pvc.yaml persistentvolumeclaim/file-pvc-demo-5g created cormac@cormac-tkgm:~$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE file-pvc-demo-5g Bound pvc-b5db5000-2fe5-4aba-935a-69f7b70aae85 5Gi RWX bigstripe 6s cormac@cormac-tkgm:$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-b5db5000-2fe5-4aba-935a-69f7b70aae85 5Gi RWX Delete Bound default/file-pvc-demo-5g bigstripe <invalid>
그리고 vSphere CNS 기능 때문에 vSphere Client에서 이 볼륨과 관련된 Kubernetes 정보의 많은 부분을 볼 수 있으며, 이전에 이 블로그에서 여러 번 언급했었습니다. 다만 TKG가 사용하는 CSI 드라이버가 CNS 기능과 어떻게 통합되는지 강조하기 위해 여기에 다시 추가하고 싶었다.
vSAN File Service의 File Share에도 볼륨이 표시된다:
마지막 단계는 동일한 RWX PV에 대한 액세스를 공유할 수 있다는 것을 보여주기 위해 두 개의 Pod를 배치한다.
cormac@cormac-tkgm:~$ cat file-pod-a.yaml apiVersion: v1 kind: Pod metadata: name: file-pod-a spec: containers: - name: file-pod-a image: "cormac-tkgm.corinternal.com/library/busybox" volumeMounts: - name: file-vol mountPath: "/mnt/volume1" command: [ "sleep", "1000000" ] volumes: - name: file-vol persistentVolumeClaim: claimName: file-pvc-demo-5g cormac@cormac-tkgm:~$ cat file-pod-b.yaml apiVersion: v1 kind: Pod metadata: name: file-pod-b spec: containers: - name: file-pod-b image: "cormac-tkgm.corinternal.com/library/busybox" volumeMounts: - name: file-vol mountPath: "/mnt/volume1" command: [ "sleep", "1000000" ] volumes: - name: file-vol persistentVolumeClaim: claimName: file-pvc-demo-5g cormac@cormac-tkgm:~$ kubectl apply -f file-pod-a.yaml pod/file-pod-a created cormac@cormac-tkgm:~$ kubectl apply -f file-pod-b.yaml pod/file-pod-b created cormac@cormac-tkgm:~$ kubectl get pods NAME READY STATUS RESTARTS AGE file-pod-a 1/1 Running 0 9s file-pod-b 0/1 ContainerCreating 0 4s cormac@cormac-tkgm:~$ kubectl get pods NAME READY STATUS RESTARTS AGE file-pod-a 1/1 Running 0 36s file-pod-b 1/1 Running 0 31s
그리고 CNS로 돌아가면 Kubernetes objects에서 PV와 연결된 두 개의 포드(Pod)를 볼 수 있다.
따라서, TKG의 멀티 클라우드 버전과 함께 read-write-many의 컨테이너 볼륨에 vSAN 파일 서비스를 사용할 수 있다.