[번역] vSphere 7.0, Cloud Native Storage, CSI and offline volume extend

출처 : https://cormachogan.com/2020/04/23/vsphere-7-0-cloud-native-storage-csi-and-offline-volume-extend/

csi-logo.png

vSphere 7.0 릴리스에서 vSphere CSI 드라이버에 추가된 또 다른 새로운 기능은 PV(Pubertnetes Persistent Volume)를 오프라인으로 확장/증장할 수 있는 기능이다. 이를 위해서는 StorageClass에 특별한 지침이 추가되어야 하며 제목에 따라 PV가 모든 Pod에서 분리되는 동안 오프라인으로 작업을 수행해야 한다. 관련된 단계들을 자세히 살펴보자.

새 CSI 구성 요소 – CSI Resizer

크기 조정 작업을 활성화하기 위해 vSphere CSI 컨트롤러에 csi-resizer라는 새 구성 요소가 추가되었다. 우리는 CSI 드라이버와 관련된 csi-resizer 및 기타 구성요소를 다음과 같이 조사할 수 있다. 먼저, 현재 kube-system 네임스페이스에서 실행 중인 모든 파드 목록:

$ kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
coredns-7988585f4-9dvgs                   1/1     Running   0          70m
coredns-7988585f4-kfwd7                   1/1     Running   0          70m
etcd-k8s2-master7-01                      1/1     Running   0          84m
kube-apiserver-k8s2-master7-01            1/1     Running   0          84m
kube-controller-manager-k8s2-master7-01   1/1     Running   0          83m
kube-flannel-ds-amd64-44wmm               1/1     Running   0          81m
kube-flannel-ds-amd64-68frg               1/1     Running   0          73m
kube-flannel-ds-amd64-8xk27               1/1     Running   0          75m
kube-flannel-ds-amd64-k5r6s               1/1     Running   0          78m
kube-flannel-ds-amd64-wwr2m               1/1     Running   0          82m
kube-flannel-ds-amd64-xcfxw               1/1     Running   0          77m
kube-proxy-5s4gr                          1/1     Running   0          73m
kube-proxy-8qh27                          1/1     Running   0          84m
kube-proxy-8tj2c                          1/1     Running   0          75m
kube-proxy-jzqgg                          1/1     Running   0          77m
kube-proxy-r9jk9                          1/1     Running   0          78m
kube-proxy-xjvth                          1/1     Running   0          81m
kube-scheduler-k8s2-master7-01            1/1     Running   0          83m
vsphere-cloud-controller-manager-4bsx4    1/1     Running   0          72m
vsphere-csi-controller-5864fc6f8b-2qmfb   6/6     Running   0          65m
vsphere-csi-node-k6mrt                    3/3     Running   0          65m
vsphere-csi-node-kpdg4                    3/3     Running   0          65m
vsphere-csi-node-pr9f4                    3/3     Running   0          65m
vsphere-csi-node-qh967                    3/3     Running   0          65m
vsphere-csi-node-qsbc8                    3/3     Running   0          65m
vsphere-csi-node-wsnxh                    3/3     Running   0          65m

vSphere CSI 컨트롤러 파드와 연결된 컨테이너가 6개 있다는 점에 유의하자. Pod의 모든 컨테이너를 나열하는 방법이 있지만, 그것은 복잡한 명령이기 때문에, 나는 Pod의 로그를 표시하는 명령을 실행하기만 하면, 그것은 나에게 컨테이너 목록을 돌려준다.

$ kubectl logs vsphere-csi-controller-5864fc6f8b-2qmfb -n kube-system
Error from server (BadRequest): a container name must be specified for pod vsphere-csi-controller-5864fc6f8b-2qmfb, \
choose one of: [csi-attacher csi-resizer vsphere-csi-controller liveness-probe vsphere-syncer csi-provisioner]

csi-resizer에서 로그를 보려면 다음 명령을 실행한다.

$ kubectl logs vsphere-csi-controller-5864fc6f8b-2qmfb -n kube-system csi-resizer
I0421 09:51:51.378212       1 main.go:61] Version : v0.3.0-0-g150071d
I0421 09:51:51.380618       1 connection.go:151] Connecting to unix:///csi/csi.sock
I0421 09:51:58.538323       1 common.go:111] Probing CSI driver for readiness
I0421 09:51:58.543451       1 leaderelection.go:217] attempting to acquire leader lease  kube-system/external-resizer-csi-vsphere-vmware-com...
I0421 09:51:58.564086       1 leaderelection.go:227] successfully acquired lease kube-system/external-resizer-csi-vsphere-vmware-com
I0421 09:51:58.564323       1 leader_election.go:172] new leader detected, current leader: vsphere-csi-controller-5864fc6f8b-2qmfb
I0421 09:51:58.564862       1 leader_election.go:165] became leader, starting
I0421 09:51:58.564900       1 controller.go:189] Starting external resizer csi.vsphere.vmware.com
I0421 09:51:58.565075       1 reflector.go:123] Starting reflector *v1.PersistentVolumeClaim (10m0s) from k8s.io/client-go/informers/factory.go:133
I0421 09:51:58.565092       1 reflector.go:161] Listing and watching *v1.PersistentVolumeClaim from k8s.io/client-go/informers/factory.go:133
I0421 09:51:58.565359       1 reflector.go:123] Starting reflector *v1.PersistentVolume (10m0s) from k8s.io/client-go/informers/factory.go:133
I0421 09:51:58.565369       1 reflector.go:161] Listing and watching *v1.PersistentVolume from k8s.io/client-go/informers/factory.go:133
I0421 09:51:58.665054       1 shared_informer.go:123] caches populated

오프라인 볼륨 증가 테스트를 진행하여 csi-resizer 로그로 수시로 돌아가도록 합시다.

StorageClass allowVolumeExpansion

볼륨 확장/증가 촉진을 위해 StorageClass 매니페스트에 새 항목이 필요하다. 이것은 allowVolumeExpansion이며 true로 설정해야 한다. 설정되지 않은 상태에서 볼륨을 높이려고 하면 볼륨 크기가 더 큰 업데이트된 PVC 매니페스트를 적용하려고 할 때 다음과 같은 오류가 발생한다.

persistentvolumeclaims "name-of-pvc" is forbidden: only dynamically provisioned pvc can be resized \
and the storageclass that provisions the pvc must support resize

다음은 새 항목을 포함하는 StorageClass 샘플:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: vsan-block-sc
provisioner: csi.vsphere.vmware.com
allowVolumeExpansion: true
parameters:
  storagepolicyname: "RAID1"

파드에서 볼륨 분리

언급했듯이, 이것은 오프라인 성장 방법이다. 따라서 증가 작업이 성공하려면 영구 볼륨이 Pod에 부착되어서는 안 된다. 여전히 포드에 연결되어 마운트된 볼륨을 키우려고 하면 csi-resizer 로그에 다음과 같은 오류가 표시된다.

$ kubectl logs vsphere-csi-controller-5864fc6f8b-2qmfb -n kube-system csi-resizer
.
.
I0421 10:29:18.671919       1 event.go:209] Event(v1.ObjectReference{Kind:"PersistentVolumeClaim", \
Namespace:"default", Name:"block-pvc", UID:"0856ea65-6252-429c-9444-2f315fe13d3a", APIVersion:"v1", \
ResourceVersion:"10204", FieldPath:""}): type: 'Normal' reason: 'Resizing' External resizer is \
resizing volume pvc-0856ea65-6252-429c-9444-2f315fe13d3a
E0421 10:29:19.034781       1 controller.go:360] Resize volume "pvc-0856ea65-6252-429c-9444-2f315fe13d3a" \
by resizer "csi.vsphere.vmware.com" failed: rpc error: code = FailedPrecondition desc = failed \
to expand volume: "0c561180-b0da-4dc3-90c4-2227811f4080" to size: 2048. Volume is attached to node \
"42051f46-6ac5-3b3a-502b-8242b0325b9d". Only offline volume expansion is supported

불행하게도 PV가 Pod에 부착되어 있다면 (100% 신뢰할 수 있는) 검출 방법이 아직 없기 때문에, 이 버전의 드라이버에 여전히 부착되어 있는 볼륨을 키우려고 시도하는 것을 막을 수 있는 검증 후크가 없다. 만약 볼륨이 여전히 팟에 부착되어 있다면, 쿠베르네테스는 마침내 모든 포드로부터 분리되어 그 후에 확장될 수 있을 때까지 그것을 백그라운드에서 계속 증가시키려고 노력할 것이다.

예에서는 확장/증가 작업을 시도하기 전에 Pod를 삭제하기만 하면 된다. 이는 PV의 내용물에 영향을 주지 않는다는 점에 유의한다. 볼륨의 데이터는 확장/증가 작업 중에 보존된다.

확장/증가 작업 시작

성장/확장 작업을 시작하기 위한 단계는 매우 간단하다. PVC 매니페스트에서 요청한 저장소 크기를 원하는 새 크기로 조정한다. 여기 초기 설정부터 새로운 요청 크기인 1Gi에서 5Gi까지의 샘플 YAML 입니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: block-pvc
spec:
  storageClassName: vsan-block-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage:1Gi
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: block-pvc
spec:
  storageClassName: vsan-block-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage:5Gi

새 PVC를 적용하면 백엔드 스토리지에서 영구 볼륨의 크기가 변경된다.

$ kubectl apply -f block-pvc.yaml
persistentvolumeclaim/block-pvc configured


$ kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
block-pvc   Bound    pvc-0856ea65-6252-429c-9444-2f315fe13d3a   1Gi        RWO            vsan-block-sc   34m


$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS    REASON   AGE
pvc-0856ea65-6252-429c-9444-2f315fe13d3a   5Gi        RWO            Delete           Bound    default/block-pvc   vsan-block-sc            34m

포드에 볼륨 다시 연결

흥미롭게도, PVC는 여전히 1Gi를 보여주고 있다. 이 값은 PV가 다시 포드에 부착되는 즉시 업데이트된다. 다음에 하자. 우리는 심지어 그 busybox 컨테이너에 있는 껍데기를 열고 그것이 정말로 커졌는지 확인하기 위해 볼륨의 크기를 조사할 수 있다.

$ kubectl apply -f block-pod-a.yaml
pod/block-pod-a created


$ kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
block-pvc   Bound    pvc-0856ea65-6252-429c-9444-2f315fe13d3a   5Gi        RWO            vsan-block-sc   36m


$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS    REASON   AGE
pvc-0856ea65-6252-429c-9444-2f315fe13d3a   5Gi        RWO            Delete           Bound    default/block-pvc   vsan-block-sc            36m


$ kubectl exec -it block-pod-a -- /bin/sh
/ # df -h
Filesystem                Size      Used Available Use% Mounted on
overlay                  58.0G      2.8G     55.2G   5% /
tmpfs                    64.0M         0     64.0M   0% /dev
tmpfs                    15.7G         0     15.7G   0% /sys/fs/cgroup
/dev/sda1                58.0G      2.8G     55.2G   5% /dev/termination-log
/dev/sdb                  4.9G      4.0M      4.7G   0% /mnt/volume1
/dev/sda1                58.0G      2.8G     55.2G   5% /etc/resolv.conf
/dev/sda1                58.0G      2.8G     55.2G   5% /etc/hostname
/dev/sda1                58.0G      2.8G     55.2G   5% /etc/hosts
shm                      64.0M         0     64.0M   0% /dev/shm
tmpfs                    15.7G     12.0K     15.7G   0% /tmp/secrets/kubernetes.io/serviceaccount
tmpfs                    15.7G         0     15.7G   0% /proc/acpi
tmpfs                    64.0M         0     64.0M   0% /proc/kcore
tmpfs                    64.0M         0     64.0M   0% /proc/keys
tmpfs                    64.0M         0     64.0M   0% /proc/timer_list
tmpfs                    64.0M         0     64.0M   0% /proc/sched_debug
tmpfs                    15.7G         0     15.7G   0% /proc/scsi
tmpfs                    15.7G         0     15.7G   0% /sys/firmware
/ #

그리고 이제 볼륨이 커졌음을 분명히 알 수 있다. 증가 작업과 관련된 이벤트는 vSphere UI 작업에서도 명확히 볼 수 있다.

Volume-Extend-tasks.png

PV 크기는 vSphere UI의 CNS 섹션에도 반영된다.

new-PV-size.png

vSphere 7.0을 사용하는 vSphere CSI 드라이버의 또 다른 새로운 기능. 요약하자면, 다른 새로운 CSI 기능은 다음과 같다.

  1. CSI와 vSAN 파일 서비스와의 상호 운용성을 통해 파일 공유로 RWX(Read-wroted-multi) 영구 볼륨의 동적 프로비저닝을 용이하게 한다.
  2. 가상 볼륨(vVols)에 대한 CSI 지원
  3. VM 암호화(VMcrypt)를 위한 CSI 지원
  4. 이전에 Project Pacific으로 알려진 vSphere with Kubernetes에 대한 CSI 지원