스토리지 문제 해결

이 문서에서는 스토리지 문제를 해결하는 방법을 설명합니다.

추가 지원이 필요하면 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'.

가상 디스크가 잘못된 가상 머신에 연결되어 있으면 다음 단계에 따라 이를 수동으로 분리할 수 있습니다.

  1. 노드를 드레이닝합니다. kubectl drain 명령어에 --ignore-daemonsets--delete-local-data 플래그를 선택적으로 포함할 수 있습니다.

  2. VM을 끕니다.

  3. vCenter에서 VM 하드웨어 구성을 수정하여 볼륨을 삭제합니다.

  4. VM을 켭니다.

  5. 노드를 차단 해제합니다.

볼륨이 사라짐

이 문제는 가상 디스크가 영구 삭제되면 발생할 수 있습니다. 운영자가 가상 디스크를 수동으로 삭제하거나 디스크가 연결된 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 리소스를 수동으로 삭제하면 됩니다.

  1. kubectl delete pvc [PVC_NAME]을 실행하여 PV를 참조한 PVC를 삭제합니다.

  2. kubectl delete pod [POD_NAME]을 실행하여 PVC를 참조한 포드를 삭제합니다.

  3. 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

이 문제를 해결하려면 다음 단계를 완료하시기 바랍니다.

  1. 앞의 출력에서 PersistentVolumeClaim(PVC) 이름을 확인하고 PVC와 연결된 VolumeAttachments를 찾습니다.

    kubectl get volumeattachments | grep pvc-xxxxx
    

    다음 출력 예시는 VolumeAttachments의 이름을 보여줍니다.

    csi-yyyyy   csi.vsphere.vmware.com   pvc-xxxxx   node-zzzzz ...
    
  2. VolumeAttachment를 설명합니다.

    kubectl describe volumeattachments csi-yyyyy | grep "Deletion Timestamp"
    

    다음 출력 예시와 같이 삭제 타임스탬프를 기록해 둡니다.

    Deletion Timestamp:   2021-03-10T22:14:58Z
    
  3. 삭제 타임스탬프로 지정된 시간까지 기다린 후 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)

이 문제를 해결하려면 다음 단계에 따라 볼륨당 스냅샷의 최대 개수를 업데이트합니다.

  1. 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: 사용자 클러스터 이름
  2. 보안 비밀에서 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을 이전 단계의 보안 비밀 이름으로 바꿉니다.

  3. 수정할 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
    
  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
    
  5. 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>
    

다음 단계

추가 지원이 필요하면 Cloud Customer Care에 문의하세요.