이 문서에서는 스토리지 문제를 해결하는 방법을 설명합니다.
볼륨이 연결되지 않음
이 문제는 가상 디스크가 잘못된 가상 머신에 연결되면 발생할 수 있으며 원인은 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
하나 이상의 Pod가 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 하드웨어 구성을 수정하여 볼륨을 삭제합니다.
볼륨이 사라짐
이 문제는 가상 디스크가 영구 삭제되면 발생할 수 있습니다. 이 문제는 작업자가 가상 디스크 또는 가상 디스크가 연결된 가상 머신을 수동으로 삭제하면 발생할 수 있습니다. 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
하나 이상의 Pod가 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를 참조한 Pod를 삭제합니다.2단계를 반복합니다. 자세한 내용은 Kubernetes 문제 74374를 참조하세요.
vSphere CSI 볼륨이 분리되지 않음
이 문제는 vSphere 사용자에게 CNS > Searchable
권한이 부여되지 않으면 발생합니다.
FailedAttachVolume
경고와 함께 Pod가 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-164d56e3286e954befdf0f5a82d59031dbfd50709c927a0e6ccf21d1fa60192dcsi-8d9c3d0439f413fa9e176c63f5cc92bd67a33a1b76919d42c20347d52c57435c csi-e40d65005bc64c45735e91d7f7e54b2481a2bd41f5df7cc219a2c03608e8e7a8
이 문제를 해결하려면 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: 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 드라이버에서 이 알려진 문제는 노드가 종료되거나, 삭제되거나, 실패할 때 발생합니다.
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 ADMIN_CLUSTER_KUBECONFIG get deployment vsphere-csi-controller \ --namespace USER_CLUSTER_NAME \ --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 ADMIN_CLUSTER_KUBECONFIG get secret SECRET_NAME \ --namespace USER_CLUSTER_NAME \ --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 ADMIN_CLUSTER_KUBECONFIG delete secret SECRET_NAME \ --namespace USER_CLUSTER_NAME kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG create secret generic SECRET_NAME \ --namespace USER_CLUSTER_NAME \ --from-file=config
vsphere-csi-controller
배포를 다시 시작합니다.kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG rollout restart deployment vsphere-csi-controller \ --namespace USER_CLUSTER_NAME