이 문서에서는 스토리지 문제를 해결하는 방법을 설명합니다.
추가 지원이 필요하면 Cloud Customer Care에 문의하세요.볼륨이 연결되지 않음
이 문제는 가상 디스크가 잘못된 가상 머신에 연결되면 발생할 수 있으며 원인은 Kubernetes 1.12의 문제 #32727일 수 있습니다.
gkectl diagnose cluster
의 출력은 다음 예시와 같습니다.
Checking cluster object...PASS
Checking machine objects...PASS
Checking control plane pods...PASS
Checking gke-connect pods...PASS
Checking kube-system pods...PASS
Checking gke-system pods...PASS
Checking storage...FAIL
PersistentVolume pvc-776459c3-d350-11e9-9db8-e297f465bc84: virtual disk "[datastore_nfs] kubevols/kubernetes-dynamic-pvc-776459c3-d350-11e9-9db8-e297f465bc84.vmdk" IS attached to machine "gsl-test-user-9b46dbf9b-9wdj7" but IS NOT listed in the Node.Status
1 storage errors
이 예시에서는 하나 이상의 포드가 ContainerCreating
상태로 멈춰 있고 다음 예시 출력과 같은 경고가 표시됩니다.
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedAttachVolume 6s (x6 over 31s) attachdetach-controller AttachVolume.Attach failed for volume "pvc-776459c3-d350-11e9-9db8-e297f465bc84" : Failed to add disk 'scsi0:6'.
가상 디스크가 잘못된 가상 머신에 연결되어 있으면 다음 단계에 따라 이를 수동으로 분리할 수 있습니다.
노드를 드레이닝합니다. kubectl drain 명령어에
--ignore-daemonsets
및--delete-local-data
플래그를 선택적으로 포함할 수 있습니다.vCenter에서 VM 하드웨어 구성을 수정하여 볼륨을 삭제합니다.
볼륨이 사라짐
이 문제는 가상 디스크가 영구 삭제되면 발생할 수 있습니다. 운영자가 가상 디스크를 수동으로 삭제하거나 디스크가 연결된 VM을 삭제하는 경우에 이런 상황이 생길 수 있습니다.
VMDK 파일과 관련해서 '찾을 수 없음' 오류가 표시되면 가상 디스크가 영구적으로 삭제되었기 때문일 수 있습니다.
gkectl diagnose cluster
의 출력은 다음과 같습니다.
Checking cluster object...PASS
Checking machine objects...PASS
Checking control plane pods...PASS
Checking gke-connect pods...PASS
Checking kube-system pods...PASS
Checking gke-system pods...PASS
Checking storage...FAIL
PersistentVolume pvc-52161704-d350-11e9-9db8-e297f465bc84: virtual disk "[datastore_nfs] kubevols/kubernetes-dynamic-pvc-52161704-d350-11e9-9db8-e297f465bc84.vmdk" IS NOT found
1 storage errors
다음 출력 예시와 같이 하나 이상의 포드가 ContainerCreating
상태로 멈춰 있습니다.
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedAttachVolume 71s (x28 over 42m) attachdetach-controller AttachVolume.Attach failed for volume "pvc-52161704-d350-11e9-9db8-e297f465bc84" : File []/vmfs/volumes/43416d29-03095e58/kubevols/
kubernetes-dynamic-pvc-52161704-d350-11e9-9db8-e297f465bc84.vmdk was not found
이 문제가 발생하지 않도록 하려면 사용자 클러스터 크기 조절 및 클러스터 업그레이드의 설명대로 가상 머신을 관리합니다.
이 문제를 해결하려면 관련 Kubernetes 리소스를 수동으로 삭제하면 됩니다.
kubectl delete pvc [PVC_NAME]
을 실행하여 PV를 참조한 PVC를 삭제합니다.kubectl delete pod [POD_NAME]
을 실행하여 PVC를 참조한 포드를 삭제합니다.Kubernetes 문제 #74374로 인해 2단계를 반복합니다.
vSphere CSI 볼륨이 분리되지 않음
이 문제는 vSphere 사용자에게 CNS > Searchable
권한이 부여되지 않으면 발생합니다.
FailedAttachVolume
경고와 함께 포드가 ContainerCreating
단계에 멈춰 있는 경우 이는 다른 노드에서의 분리 실패가 원인일 수 있습니다.
CSI 분리 오류를 확인하려면 다음 명령어를 실행합니다.
kubectl get volumeattachments -o=custom-columns=NAME:metadata.name,DETACH_ERROR:status.detachError.message
출력은 다음 예시와 비슷합니다.
NAME DETACH_ERROR
csi-0e80d9be14dc09a49e1997cc17fc69dd8ce58254bd48d0d8e26a554d930a91e5 rpc error: code = Internal desc = QueryVolume failed for volumeID: "57549b5d-0ad3-48a9-aeca-42e64a773469". ServerFaultCode: NoPermission
csi-164d56e3286e954befdf0f5a82d59031dbfd50709c927a0e6ccf21d1fa60192d <none>
csi-8d9c3d0439f413fa9e176c63f5cc92bd67a33a1b76919d42c20347d52c57435c <none>
csi-e40d65005bc64c45735e91d7f7e54b2481a2bd41f5df7cc219a2c03608e8e7a8 <none>
이 문제를 해결하려면 vCenter 사용자 계정에 CNS > Searchable
권한을 추가합니다.
분리 작업은 성공할 때까지 자동으로 재시도됩니다.
ESXi 호스트에서 vSphere CSI 드라이버가 지원되지 않음
이 문제는 vSphere 클러스터의 ESXi 호스트가 ESXi 6.7U3보다 낮은 버전을 실행할 때 발생합니다.
gkectl check-config
의 출력에 다음 경고가 포함됩니다.
The vSphere CSI driver is not supported on current ESXi host versions.
CSI requires ESXi 6.7U3 or above. See logs for ESXi version details.
이 문제를 해결하려면 ESXi 호스트를 6.7U3 이상 버전으로 업그레이드하세요.
CSI 볼륨 만들기가 NotSupported
오류로 인해 실패함
이 문제는 vSphere 클러스터의 ESXi 호스트가 ESXi 6.7U3보다 낮은 버전을 실행할 때 발생합니다.
kubectl describe pvc
의 출력에 다음 오류가 포함됩니다.
Failed to provision volume with StorageClass <standard-rwo>: rpc error:
code = Internal desc = Failed to create volume. Error: CnsFault error:
CNS: Failed to create disk.:Fault cause: vmodl.fault.NotSupported
이 문제를 해결하려면 ESXi 호스트를 6.7U3 이상 버전으로 업그레이드하세요.
vSphere CSI 볼륨 연결 실패
오픈소스 vSphere CSI 드라이버에서 이 Kubernete 알려진 문제는 노드가 종료되거나, 삭제되거나, 실패할 때 발생합니다.
kubectl describe pod
의 결과는 다음과 같습니다.
Events:
Type Reason From Message
---- ------ ... ---- -------
Warning FailedAttachVolume ... attachdetach-controller Multi-Attach error for volume
"pvc-xxxxx"
Volume is already exclusively attached to one
node and can't be attached to another
이 문제를 해결하려면 다음 단계를 완료하시기 바랍니다.
앞의 출력에서 PersistentVolumeClaim(PVC) 이름을 확인하고 PVC와 연결된 VolumeAttachments를 찾습니다.
kubectl get volumeattachments | grep pvc-xxxxx
다음 출력 예시는 VolumeAttachments의 이름을 보여줍니다.
csi-yyyyy csi.vsphere.vmware.com pvc-xxxxx node-zzzzz ...
VolumeAttachment를 설명합니다.
kubectl describe volumeattachments csi-yyyyy | grep "Deletion Timestamp"
다음 출력 예시와 같이 삭제 타임스탬프를 기록해 둡니다.
Deletion Timestamp: 2021-03-10T22:14:58Z
삭제 타임스탬프로 지정된 시간까지 기다린 후 VolumeAttachment를 강제로 삭제합니다. 이렇게 하려면 VolumeAttachment 객체를 수정하고 파이널라이저를 삭제합니다.
kubectl edit volumeattachment csi-yyyyy
파이널라이저를 삭제합니다.
[...] Finalizers: external-attacher/csi-vsphere-vmware-com
버전으로 인해 vSphere CSI VolumeSnapshot이 준비되지 않음
이 문제는 vCenter Server 또는 ESXi 호스트 버전이 7.0 업데이트 3보다 낮을 때 발생합니다.
kubectl describe volumesnapshot
출력에는 다음 예시와 같은 오류가 포함됩니다.
rpc error: code = Unimplemented desc = VC version does not support snapshot operations.
이 문제를 해결하려면 vCenter Server 및 ESXi 호스트를 버전 7.0 업데이트 3 이상으로 업그레이드합니다.
vSphere CSI VolumeSnapshot이 준비되지 않음, 볼륨당 최대 스냅샷
이 문제는 볼륨당 스냅샷 수가 vSphere Container Storage 드라이버의 최댓값에 도달할 때 발생합니다. 기본값은 3입니다.
kubectl describe volumesnapshot
출력에는 다음 예시와 같은 오류가 포함됩니다.
rpc error: code = FailedPrecondition desc = the number of snapshots on the source volume 5394aac1-bc0a-44e2-a519-1a46b187af7b reaches the configured maximum (3)
이 문제를 해결하려면 다음 단계에 따라 볼륨당 스냅샷의 최대 개수를 업데이트합니다.
vSphere CSI 컨트롤러에 vSphere 구성을 제공하는 보안 비밀의 이름을 가져옵니다.
kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> get deployment vsphere-csi-controller \ --namespace <var class="edit">USER_CLUSTER_NAME</var> \ --output json \ | jq -r '.spec.template.spec.volumes[] \ | select(.name=="vsphere-secret") .secret.secretName'
다음을 바꿉니다.
- ADMIN_KUBECONFIG: 관리자 클러스터 kubeconfig 파일의 경로
- USER_CLUSTER_NAME: 사용자 클러스터 이름
보안 비밀에서
data.config
값을 가져오고 base64로 디코딩하고,config.txt
파일에 저장합니다.kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> get secret <var class="edit">SECRET_NAME</var> \ --namespace <var class="edit">USER_CLUSTER_NAME </var> \ --output json | jq -r '.data["config"]' | base64 -d > config.txt
SECRET_NAME을 이전 단계의 보안 비밀 이름으로 바꿉니다.
수정할
config.txt
를 엽니다.다음 예시와 같이
[Snapshot]
섹션에global-max-snapshots-per-block-volume
필드를 수정하거나 추가합니다.[Global] cluster-id = "my-user-cluster" insecure-flag = "0" user = "my-account.local" password = "fxqSD@SZTUIsG" [VirtualCenter "my-vCenter"] port = "443" datacenters = "my-datacenter1" [Snapshot] global-max-snapshots-per-block-volume = 4
보안 비밀을 삭제하고 다시 만듭니다.
kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> delete secret <var class="edit">SECRET_NAME</var> \ --namespace <var class="edit">USER_CLUSTER_NAME</var> kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> create secret generic <var class="edit">SECRET_NAME</var> \ --namespace <var class="edit">USER_CLUSTER_NAME</var> \ --from-file=config
vsphere-csi-controller
배포를 다시 시작합니다.kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> rollout restart deployment vsphere-csi-controller \ --namespace <var class="edit">USER_CLUSTER_NAME</var>