Kubernetes/Rook Ceph

rook-ceph pvc할당 이슈

김 정출 2024. 10. 26. 12:01

rook-ceph pvc할당 이슈

[Issue]

PVC에 rook-cephfs로 지정한 경우로 PVC 생성을 하였으나 bound가 안되는 상황

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cephfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: rook-cephfs

[solution]

Rook-Ceph를 통해 PVC를 할당받지 못하는 이슈는 여러 가지 원인으로 발생할 수 있습니다. 주요 원인과 해결 방안을 단계별로 살펴보겠습니다.

  1. Ceph 클러스터 상태 확인
  • PVC를 할당받지 못할 때 먼저 Ceph 클러스터의 상태를 확인하는 것이 중요합니다. 다음 명령어로 클러스터가 정상적으로 작동하는지 확인해보세요:
kubectl -n rook-ceph exec -it <toolbox-pod-name> -- ceph status
  • 클러스터 상태가 HEALTH_OK가 아니라면 OSD나 모니터, MDS 등에서 문제가 있을 수 있습니다. 필요한 경우 OSD 상태(ceph osd status)를 추가로 확인하세요.
  1. StorageClass 및 CephCluster 설정 확인
  • Rook-Ceph에서 PVC 할당을 위해 사용하는 StorageClass와 CephCluster 리소스가 제대로 설정되어 있는지 확인합니다. 예를 들어, kubectl get storageclass로 StorageClass가 올바르게 존재하는지 확인하고, kubectl get cephcluster -n rook-ceph로 CephCluster 상태를 점검하세요.
  1. RBD Pool 확인
  • PVC를 할당받기 위해 필요한 RBD Pool이 Ceph에 올바르게 생성되었는지 확인합니다. 다음 명령어로 RBD Pool의 상태를 체크하세요:
kubectl -n rook-ceph exec -it <toolbox-pod-name> -- ceph osd pool ls
  • 필요하다면, pool을 수동으로 생성하고 CephCluster 설정에서 pool 이름을 확인해 PVC 생성 시 사용되는 StorageClass와 일치하도록 설정하세요.
  1. CSI (Container Storage Interface) 드라이버 문제
  • Rook-Ceph는 CSI 드라이버를 통해 Kubernetes와 Ceph 간의 PVC 연결을 설정합니다. 이 드라이버가 제대로 작동하지 않을 경우 PVC 할당이 실패할 수 있습니다. CSI 관련 로그를 확인하기 위해 다음 명령어를 사용할 수 있습니다:
kubectl logs -n rook-ceph -l app=rook-ceph-csi-rbd
  • CSI 드라이버에서 오류가 발생한 경우, 로그를 분석하여 재시작하거나 버그가 발생한 경우 버전을 업그레이드하는 방법을 고려해야 합니다.
  1. Ceph Monitor와 OSD의 리소스 문제
  • PVC 할당을 위해 Ceph Monitor 및 OSD가 충분한 리소스를 확보하고 있는지 확인하세요. 특히 리소스가 부족하여 OSD가 제대로 작동하지 않으면 PVC 할당이 실패할 수 있습니다. kubectl describe pod -n rook-ceph로 관련 Pod의 상태를 확인하고, 필요한 경우 리소스를 늘리거나 불필요한 Pod을 조정해보세요.
  1. Namespace 및 권한 문제
  • PVC가 요청된 네임스페이스와 Ceph 리소스가 존재하는 네임스페이스가 일치해야 합니다. 특정 네임스페이스에서 PVC를 생성할 때 권한 문제나 RBAC 설정이 잘못되었을 수도 있습니다. kubectl describe pvc <pvc-name> -n <namespace> 명령어를 통해 PVC 이벤트와 에러 메시지를 확인하세요.
  1. 스토리지 부족
  • Ceph 클러스터 내에 스토리지가 부족할 경우 PVC를 할당받지 못할 수 있습니다. ceph df 명령어로 사용 가능한 스토리지 용량을 확인하고, 필요하다면 디스크를 추가하여 용량을 확장합니다.

이러한 절차를 통해 원인을 파악하고 문제를 해결할 수 있습니다.

Ceph FS provisioner

여기서는 Ceph FS provisioner에서 이슈가 있었습니다.

Ceph FS Provisioner와 관련된 문제라면, CephFS의 특정 프로비저닝 설정이나 파일 시스템 관련 구성에서 문제가 발생할 가능성이 있습니다. 아래와 같은 요소들을 확인해 보세요:

  1. CephFS Provisioner 로그 확인
    • 먼저, Ceph FS Provisioner와 관련된 Pod에서 로그를 확인하는 것이 중요합니다. rook-ceph-operator 또는 CephFS CSI 드라이버 관련 로그를 점검해 보세요.
kubectl logs -n rook-ceph -l app=rook-ceph-operator
kubectl logs -n rook-ceph -l app=rook-ceph-csi-cephfs
  1. Provisioner 권한 및 설정 확인
    • CephFS Provisioner가 PVC를 생성하려면 특정 권한이 필요합니다. 특히, CSI 드라이버가 Ceph 파일 시스템에 접근할 수 있도록 구성되어 있는지 확인해보세요. ceph auth 명령어로 필요한 권한이 생성되었는지 검토하고, 필요한 경우 권한을 추가해야 합니다.
  2. CephFS Pool 및 MDS 상태 확인
    • CephFS Provisioner가 작동하려면 필요한 pool이 Ceph에 올바르게 생성되어 있어야 하고, MDS(Metadata Server)도 정상 작동해야 합니다. 다음 명령어로 CephFS와 관련된 pool과 MDS 상태를 확인해보세요
kubectl -n rook-ceph exec -it <toolbox-pod-name> -- ceph fs ls
kubectl -n rook-ceph exec -it <toolbox-pod-name> -- ceph mds stat

MDS가 정상적으로 작동하지 않는다면, 재시작이나 복구 작업을 고려해야 합니다.

Ceph Metadata Server(MDS)

Ceph에서 MDS(Metadata Server)는 CephFS 파일 시스템의 메타데이터를 관리하는 핵심 컴포넌트입니다. MDS가 다운되거나 문제가 발생한 경우, CephFS 파일 시스템 접근에 장애가 생길 수 있으므로 이를 신속하게 복구하는 것이 중요합니다. 복구 절차는 다음과 같습니다.

1. MDS 상태 확인

먼저, 현재 MDS 상태를 확인하여 어떤 문제가 발생했는지 파악합니다.

kubectl -n rook-ceph exec -it <toolbox-pod-name> -- ceph mds stat

출력 예시는 다음과 같습니다.

fs_name: 1/1 active, 0 up:standby

여기서 active가 아닌 failed, stale와 같은 상태가 보인다면 MDS에 문제가 있음을 의미합니다.

2. MDS Pod 상태 확인 및 재시작

MDS Pod가 Kubernetes 내에서 비정상적인 상태일 경우 해당 Pod를 재시작해보세요.

kubectl -n rook-ceph get pods -l app=rook-ceph-mds

이후 문제를 겪고 있는 MDS Pod를 삭제하여 재시작을 유도할 수 있습니다.

kubectl -n rook-ceph delete pod <mds-pod-name>

이 작업으로 Kubernetes가 자동으로 새 MDS Pod를 생성하고 재배치하도록 유도합니다.

3. 다중 MDS 구성 확인 (필요 시 추가 설정)

파일 시스템 사용량이 많거나 고가용성이 필요할 경우, MDS를 여러 개로 확장하여 장애 발생 시에도 운영에 영향을 최소화할 수 있습니다. 다음 명령어로 MDS 인스턴스 수를 확인하고, 필요 시 설정을 조정합니다.

kubectl -n rook-ceph exec -it <toolbox-pod-name> -- ceph fs set <fs-name> max_mds 2

위 명령어로 MDS 복수 인스턴스를 설정하여 장애 발생 시에도 대체 MDS가 활성화되도록 구성할 수 있습니다.

4. 활성 MDS로 전환

기존의 활성 MDS가 실패하고 standby 상태의 MDS가 있을 경우, standby MDS를 활성화하는 명령어를 실행할 수 있습니다.

kubectl -n rook-ceph exec -it <toolbox-pod-name> -- ceph mds fail <fs_name>

이 명령어는 현재 활성화된 MDS를 포기하고 standby MDS로 전환하여 운영을 재개하도록 합니다.

5. Ceph 로그 확인

MDS가 지속적으로 실패하는 경우 ceph mds log를 확인하여 심각한 오류를 파악합니다.

kubectl -n rook-ceph exec -it <toolbox-pod-name> -- ceph mds perf dump

로그에서 MDS에 관련된 오류 메시지를 확인한 후, 오류의 원인이 리소스 부족인지 네트워크 연결 문제인지 판단할 수 있습니다.

6. 재배포 (심각한 문제 발생 시)

여러 가지 방법으로도 해결되지 않는 경우, MDS Daemon을 삭제하고 Rook-Ceph Operator가 새로운 MDS Daemon을 자동으로 생성하도록 하는 방법도 있습니다.

kubectl -n rook-ceph delete pod <mds-pod-name>

위와 같은 단계로 MDS 복구를 시도하면 CephFS 메타데이터 서버의 가용성을 빠르게 회복할 수 있습니다.