Kubernetes 환경에서 MinIO 오류?

Kubernetes에서 MinIO를 PersistentVolumeClaim 사용하는 경우, hostPath를 사용할 경우에는 정상 작동되는데 “Rename across devices” 오류가 나와서요.

Persistent Volume 설정

volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /minio
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - minikube
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-pv
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage

MinIO 설정

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: minio
spec:
  template:
    spec:
      containers:
        - name: minio
          image: quay.io/minio/minio:latest
          command: ["/bin/bash", "-c"]
          args: ["minio server /data --console-address :9090"]
          volumeMounts:
            - mountPath: /data
              name: minio-data
              subPath: minio
      volumes:
        - name: minio-data
          persistentVolumeClaim:
            claimName: minio-pv

발생한 오류:

Error: unable to rename (/data/.minio.sys/tmp -> /data/.minio.sys/tmp-old/...) Rename across devices not allowed
FATAL Unable to initialize backend: Rename across devices not allowed
1 Like

저희는 개발환경에서 S3 대용으로 MinIO를 사용하고 있어 위와 같은 상황을 접하지는 못했지만, Gemini의 설명이 가능성이 있어 보여 첨부해 드립니다. 해결 되시길 바랍니다.
————-

:warning: 문제의 원인

yaml 파일들을 봤을 때, Error: unable to rename (...) Rename across devices not allowedFATAL Unable to initialize backend: Rename across devices not allowed 오류의 원인은 MinIO 컨테이너가 마운트한 subPath 설정 때문일 가능성이 매우 높습니다.

minio-pv라는 PVC를 사용하면서 MinIO 컨테이너는 subPath: minio를 지정해 /data 디렉터리를 마운트했습니다.

이 경우, Kubernetes는 /minio 경로를 /minio/minio재정의하지 않고, PVC가 제공하는 볼륨의 하위 경로인 /minio 내부의 /minio 디렉토리를 /data로 마운트하게 됩니다.

이러한 subPath 구성은 MinIO가 data 디렉터리와 임시 파일(tmp) 디렉터리를 같은 디스크 파티션 내에서 생성하지 못하게 할 수 있습니다. MinIO는 내부적으로 rename 시스템 호출을 사용하여 파일을 이동하는데, 이 호출은 서로 다른 디바이스(device) 간에는 작동하지 않습니다.


:white_check_mark: 해결 방안

  1. subPath 사용 제거:

    가장 간단하고 확실한 해결책입니다. volumeMounts에서 subPath: minio를 제거하여 MinIO가 PVC 전체를 /data로 사용할 수 있도록 합니다.

    YAML

    # MinIO ReplicaSet 설정
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: minio
    spec:
      template:
        spec:
          containers:
            - name: minio
              image: quay.io/minio/minio:latest
              command: ["/bin/bash", "-c"]
              args: ["minio server /data --console-address :9090"]
              volumeMounts:
                - mountPath: /data
                  name: minio-data
              # subPath 설정 제거
          volumes:
            - name: minio-data
              persistentVolumeClaim:
                claimName: minio-pv
    
    
  2. PV 경로 수정:

    만약 subPath를 꼭 사용해야 한다면, PV의 local 경로를 /minio/minio로 변경하여 subPath의 경로와 일치시키는 방법도 있습니다. 하지만 이 방법은 복잡하며, 첫 번째 해결 방안을 더 권장합니다.

    YAML

    # Persistent Volume 설정
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: minio-pv
    spec:
      capacity:
        storage: 1Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      storageClassName: local-storage
      local:
        # 경로를 subPath와 동일하게 변경
        path: /minio/minio 
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                    - minikube
     
    
2 Likes

ChatGPT로도 한번 확인하면서, 나름 이것 저것 찾아봤는데요. 제미나이가 답변이 한번 더 보게 만드네요. Grok 도 한번 같이 찾아볼께요. 나름 동의하는 부분이 많아서… 한번 더 테스트해보겠습니다. @joyhelp 님! 감사요. ^^

2 Likes

기다리고 기다리던 답변이 드디어 :hugs:

1 Like

저도 지인 소개 받고 들어왔는데… 생각보다 전문가분들이 좀 있는 듯하네요. 저도 답변할 능력이 되면 해볼께요.

1 Like