상세 컨텐츠

본문 제목

MinIO 풀 확장 및 리밸런싱

> Tech

by Ryusstory 2025. 9. 19.

본문

개요 및 기본 구성

이번 글에서는 Vagrant에서 DirectPV와 MinIO를 구성해서 직접 파일을 올려보고, 물리 디스크를 추가해서 추가 풀을 생성하고 리밸런싱까지 진행해보도록 하겠습니다.

Cloudnet@ MinIO 스터디를 진행하면서 정리한 글입니다. 스터디에서 제공받은 실습과는 다를 수 있습니다.

Vagrantfile

  • 10.5GiB 가상 디스크 4개(minio_disk_*)는 초기 풀에 사용합니다.
  • minio_newdisk_* 디스크는 나중에 VirtualBox에서 수동으로 VM에 장착해 풀 확장에 사용합니다.
Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-24.04"
  config.vm.provider "virtualbox" do |vb|
    (1..4).each do |i|
      unless File.exist?("minio_disk_#{i}.vdi")
        vb.customize ["createmedium", "--filename", "minio_disk_#{i}.vdi", "--sizebyte", 1024 * 1024 * 10500, "--variant", "Standard"]
      end
      vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", i + 4, "--device", 0, "--type", "hdd", "--nonrotational", "on", "--medium", "minio_disk_#{i}.vdi"]
      unless File.exist?("minio_newdisk_#{i}.vdi")
        vb.customize ["createmedium", "--filename", "minio_newdisk_#{i}.vdi", "--sizebyte", 1024 * 1024 * 10500, "--variant", "Standard"]
      end

    end
    vb.cpus = 8
    vb.memory = 8192
  end
  config.vm.network "public_network", type: "dhcp", bridge: ""
  config.vm.provision "shell", inline: <<-SHELL
    echo ">>>>>> install k3s"
    curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.33.4+k3s1 INSTALL_K3S_EXEC=" --disable=traefik" K3S_KUBECONFIG_MODE="644" sh -s - server --token miniotoken
    mkdir -p ~/.kube
    cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
    echo ">>>>>> install kubectl, k9s, krew, yq"
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
    rm kubectl
    wget https://github.com/derailed/k9s/releases/download/v0.50.9/k9s_linux_amd64.deb
    sudo dpkg -i k9s_linux_amd64.deb
    rm k9s_linux_amd64.deb
    set -x; cd "$(mktemp -d)" &&
    OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
    ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
    KREW="krew-${OS}_${ARCH}" &&
    wget "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
    tar zxvf "${KREW}.tar.gz" &&
    ./"${KREW}" install krew
    wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq &&\
    chmod +x /usr/local/bin/yq
    echo ">>>>>> install mc"
    curl https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc
    chmod +x /usr/local/bin/mc
    echo ">>>>>> install helm"
    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    echo ">>>>>> finalizing setup"
    echo 'alias k="kubectl"' >> ~/.bashrc
    echo "export PATH=\"$(echo "${KREW_ROOT:-$HOME/.krew}/bin"):\$PATH\"" >> ~/.bashrc
    echo 'sudo su - && exit' > /home/vagrant/.bash_login
  SHELL
  config.vm.post_up_message = <<-EOT
  vagrant is up and running! You can access the VM using:
    vagrant ssh default
  EOT
end

네트워크

MinIO 콘솔 접근을 위해 public_network를 추가했습니다. vagrant up 시 브리지할 NIC를 선택해야 합니다.

디스크 사이즈 관련

초기에 10GB PVC를 요청했을 때 다음 오류가 발생했습니다. 에러 메시지가 뜨면서 tenant 관련 pod가 제대로 뜨지 않았습니다.

failed to provision volume with StorageClass "directpv-min-io": rpc error: code = ResourceExhausted desc = no drive found for requested topology; requested node(s): vagrant; requested size: 10737418240 bytes

VirtualBox에서 GB 단위(10GB)로 만든 디스크는 10GiB(10 × 1024^3 = 10,737,418,240 bytes)보다 작고, XFS 메타데이터/오버헤드까지 때문인지 요청 크기를 만족시킬 수 없었습니다.
그래서 디스크를 10.5GiB(예: 1024 × 1024 × 10500 bytes) 정도로 넉넉히 생성하거나 PVC 요청을 9Gi로 낮추면 정상 바인딩됩니다. 여기서는 디스크를 10.5GiB로 생성하는 방식을 사용했습니다.

추가 디스크 관련

추가 풀 테스트를 위해 “추가 디스크 파일”만 먼저 만들어 두고, 나중에 VirtualBox GUI에서 VM에 장착합니다. 수동으로 진행해줘야 합니다.

      additional_disk = "diska#{i}"
      unless File.exist?(disk)
        vb.customize ['createhd', '--filename', disk, '--sizebyte', 1024 * 1024 * 10500]
      end
  • VM이 디스크를 “연결한 상태”에서 vagrant destroy를 수행하면 함께 정리됩니다.
  • 연결되지 않은 디스크 파일은 VirtualBox 가상 미디어 관리자에 메타데이터가 남아 삭제가 되지 않아 다음 실행할 때 에러를 유발할 수 있습니다. 이 경우 VirtualBox를 재시작한 뒤 가상 미디어 관리자에서 제거하면 됩니다. (파일-도구-가상 미디어 관리자)

설치된 패키지 및 툴들

  • k3s
  • kubectl
  • k9s
  • yq
  • krew
  • mc
  • helm

minio 기본 설치 및 스토리지 테스트

초기화

DirectPV 플러그인을 설치하고, 드라이버 배포 후 디스크를 탐색/초기화합니다. init은 대상 디스크의 데이터를 모두 삭제합니다.

kubectl krew install directpv
kubectl directpv install
kubectl directpv discover
kubectl directpv init drives.yaml --dangerous

minio 오퍼레이터 배포

오퍼레이터 배포 후 오퍼레이터가 준비될 때까지 기다립니다.

helm repo add minio-operator https://operator.min.io
cat << EOF > minio-operator-values.yaml
operator:  
  env:
  - name: MINIO_OPERATOR_RUNTIME
    value: "Rancher"
  replicaCount: 1
EOF
helm install --namespace minio-operator --create-namespace minio-operator minio-operator/operator --values minio-operator-values.yaml

kubectl wait --for=condition=ready pod -l v1.min.io/tenant=tenant1 -n tenant1 --timeout=90s

 

테넌트 배포

테넌트 배포 후 테넌트가 준비될 때까지 기다립니다.

cat << EOF > tenant1.yaml
tenant:
  name: tenant1
  configSecret:
    name: tenant1-env-configuration
    accessKey: minio
    secretKey: minio123
  pools:
    - servers: 1
      name: pool-0
      volumesPerServer: 4
      size: 10Gi
      storageClassName: directpv-min-io
  env:
    - name: MINIO_STORAGE_CLASS_STANDARD
      value: "EC:1"
  metrics:
    enabled: true
    port: 9000
    protocol: http
EOF
helm install --namespace tenant1 --create-namespace --values tenant1.yaml tenant1 minio-operator/tenant

kubectl wait --for=condition=ready pod -l v1.min.io/tenant=tenant1 -n tenant1 --timeout=90s

minio 포트 서비스 생성

노드포트로 mc와 웹콘솔에 사용할 서비스를 노드포트로 생성해줍니다.
서비스를 패치해서 썼으나 minio-operator에서 서비스 관련 로그가 뜨고 있어서 신규 추가 방식으로 진행했습니다.

cat << EOF > minio-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: minio-nodeport
  namespace: tenant1
spec:
  ports:
  - name: https-minio
    protocol: TCP
    port: 443
    targetPort: 9000
    nodePort: 30002
  selector:
    v1.min.io/tenant: tenant1
  type: NodePort
---
apiVersion: v1
kind: Service
metadata:
  name: minio-console-nodeport
  namespace: tenant1
spec:
  ports:
  - name: https-console
    protocol: TCP
    port: 9443
    targetPort: 9443
    nodePort: 30001
  selector:
    v1.min.io/tenant: tenant1
  type: NodePort
EOF
kubectl apply -f minio-svc.yaml

MinIO CLI alias 설정 및 버킷 생성

VM 내부에서 접근 시 127.0.0.1:30002(NodePort)로 접속합니다. 오퍼레이터 기본 TLS는 사설 인증서이므로 --insecure 옵션을 사용했습니다.

mc alias set k8s-tenant1 https://127.0.0.1:30002 minio minio123 --insecure
mc mb k8s-tenant1/mybucket --insecure
mc ls k8s-tenant1/mybucket --insecure

용량 확인

root@vagrant:~# df -h --type xfs
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         11G  106M   11G   2% /var/lib/directpv/mnt/66ec1f2a-410c-441f-9f2e-dcbac5b70331
/dev/sdd         11G  106M   11G   2% /var/lib/directpv/mnt/77a73b1f-111e-420b-8558-a6b2d2740a82
/dev/sde         11G  106M   11G   2% /var/lib/directpv/mnt/8f9920e4-bab9-47e7-a1ef-74f20b8d7d6d
/dev/sdc         11G  106M   11G   2% /var/lib/directpv/mnt/59af0acd-cd43-4187-b9e1-cdefce538266

minio 스토리지 채우기

디스크를 일단 최대한 한번 채워봤습니다.

dd if=/dev/zero of=2g bs=1M count=2048
for i in {1..20}; do
  echo "copying $i"
  mc cp 2g k8s-tenant1/mybucket/2g_a$i --insecure || break
done
copying 1
/root/2g:                   2.00 GiB / 2.00 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 190.11 MiB/s 10scopying 2
/root/2g:                   2.00 GiB / 2.00 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 196.96 MiB/s 10scopying 3
...

파일 및 용량 확인

root@vagrant:~# mc ls k8s-tenant1/mybucket --insecure
df -h --type xfs
[2025-09-19 06:26:20 UTC] 2.0GiB STANDARD 2g_a1
[2025-09-19 06:28:49 UTC] 2.0GiB STANDARD 2g_a10
[2025-09-19 06:29:05 UTC] 2.0GiB STANDARD 2g_a11
[2025-09-19 06:29:21 UTC] 2.0GiB STANDARD 2g_a12
[2025-09-19 06:29:37 UTC] 2.0GiB STANDARD 2g_a13
[2025-09-19 06:29:52 UTC] 2.0GiB STANDARD 2g_a14
[2025-09-19 06:26:35 UTC] 2.0GiB STANDARD 2g_a2
[2025-09-19 06:26:51 UTC] 2.0GiB STANDARD 2g_a3
[2025-09-19 06:27:09 UTC] 2.0GiB STANDARD 2g_a4
[2025-09-19 06:27:27 UTC] 2.0GiB STANDARD 2g_a5
[2025-09-19 06:27:43 UTC] 2.0GiB STANDARD 2g_a6
[2025-09-19 06:28:00 UTC] 2.0GiB STANDARD 2g_a7
[2025-09-19 06:28:16 UTC] 2.0GiB STANDARD 2g_a8
[2025-09-19 06:28:32 UTC] 2.0GiB STANDARD 2g_a9

root@vagrant:~# df -h --type xfs
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         11G  9.5G  815M  93% /var/lib/directpv/mnt/66ec1f2a-410c-441f-9f2e-dcbac5b70331
/dev/sdd         11G  9.5G  820M  93% /var/lib/directpv/mnt/77a73b1f-111e-420b-8558-a6b2d2740a82
/dev/sde         11G  9.5G  820M  93% /var/lib/directpv/mnt/8f9920e4-bab9-47e7-a1ef-74f20b8d7d6d
/dev/sdc         11G  9.5G  820M  93% /var/lib/directpv/mnt/59af0acd-cd43-4187-b9e1-cdefce538266

새로운 pool 추가 후 리밸런싱

virtualbox를 통한 디스크 추가

VirtualBox GUI에서 minio_newdisk_* 파일을 VM에 하나씩 추가해서 넣어주고, 저장을 해줍니다.

새로운 디스크 초기화

앞에서 한것과 동일하게 진행합니다.

root@vagrant:~# kubectl directpv discover

 Discovered node 'vagrant' ✔

┌─────────────────────┬─────────┬───────┬────────┬────────────┬───────────────────┬───────────┬─────────────┐
│ ID                  │ NODE    │ DRIVE │ SIZE   │ FILESYSTEM │ MAKE              │ AVAILABLE │ DESCRIPTION │
├─────────────────────┼─────────┼───────┼────────┼────────────┼───────────────────┼───────────┼─────────────┤
│ 8:80$OMlRnnRpa5V... │ vagrant │ sdf   │ 10 GiB │ -          │ ATA VBOX_HARDDISK │ YES       │ -           │
│ 8:96$CpK3tSN84pN... │ vagrant │ sdg   │ 10 GiB │ -          │ ATA VBOX_HARDDISK │ YES       │ -           │
│ 8:112$EB+WGH8mqt... │ vagrant │ sdh   │ 10 GiB │ -          │ ATA VBOX_HARDDISK │ YES       │ -           │
│ 8:128$KMvqa/XhpS... │ vagrant │ sdi   │ 10 GiB │ -          │ ATA VBOX_HARDDISK │ YES       │ -           │
└─────────────────────┴─────────┴───────┴────────┴────────────┴───────────────────┴───────────┴─────────────┘

Generated 'drives.yaml' successfully.
root@vagrant:~# kubectl directpv init drives.yaml --dangerous
...

신규 풀 추가

tenant1.yaml 값에 pool-1을 추가하고 업그레이드합니다.

root@vagrant:~# yq eval '.tenant.pools += [{"servers": 1, "name": "pool-1", "volumesPerServer": 4, "size": "10Gi", "storageClassName": "directpv-min-io"}]' tenant1.yaml > tenant1-ex.yaml

root@vagrant:~# yq ".tenant.pools" tenant1-ex.yaml 
- servers: 1
  name: pool-0
  volumesPerServer: 4
  size: 10Gi
  storageClassName: directpv-min-io
- servers: 1
  name: pool-1
  volumesPerServer: 4
  size: 10Gi
  storageClassName: directpv-min-io

helm upgrade --namespace tenant1 --values tenant1-ex.yaml tenant1 minio-operator/tenant

신규 풀 비정상 동작 원인 파악

pool은 정상으로 동작하지만 정상적으로 동작하지 않습니다.

root@vagrant:~# mc ls k8s-tenant1/mybucket --insecure
mc: <ERROR> Unable to list folder. Server not initialized yet, please try again.

기존 tenant pool의 로그를 보면 아래처럼 엔드포인트의 인증서 검증 실패(x509) 메시지가 보입니다.

root@vagrant:~# k logs -ntenant1 tenant1-pool-0-0

API: SYSTEM.grid
Time: 18:47:59 UTC 09/18/2025
DeploymentID: 7c223e13-f388-4129-8eb1-80a3954ff544
Error: grid: https://tenant1-pool-1-0.tenant1-hl.tenant1.svc.cluster.local:9000 re-connecting to https://tenant1-pool-2-0.tenant1-hl.tenant1.svc.cluster.local:9000: tls: failed to verify certificate: x509: certificate is valid for tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local, tenant1-pool-1-0.tenant1-hl.tenant1.svc.cluster.local, minio.tenant1.svc.cluster.local, minio.tenant1, minio.tenant1.svc, *., *.tenant1.svc.cluster.local, not tenant1-pool-2-0.tenant1-hl.tenant1.svc.cluster.local (*tls.CertificateVerificationError) Sleeping 1.758s (3) (*fmt.wrapError)
       6: internal/logger/logonce.go:118:logger.(*logOnceType).logOnceIf()
       5: internal/logger/logonce.go:149:logger.LogOnceIf()
       4: internal/grid/connection.go:59:grid.gridLogOnceIf()
       3: internal/grid/connection.go:672:grid.(*Connection).connect.func1()
       2: internal/grid/connection.go:678:grid.(*Connection).connect()
       1: internal/grid/connection.go:275:grid.newConnection.func3()
INFO: Unable to connect to https://tenant1-pool-2-0.tenant1-hl.tenant1.svc.cluster.local:9000/export1/data: Get "https://tenant1-pool-2-0.tenant1-hl.tenant1.svc.cluster.local:9000/minio/health/live": tls: failed to verify certificate: x509: certificate is valid for tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local, tenant1-pool-1-0.tenant1-hl.tenant1.svc.cluster.local, minio.tenant1.svc.cluster.local, minio.tenant1, minio.tenant1.svc, *., *.tenant1.svc.cluster.local, not tenant1-pool-2-0.tenant1-hl.tenant1.svc.cluster.local, will be retried
INFO: Waiting for a minimum of 2 drives to come online (elapsed 6m52s)

tenant에서 사용하는 tls인증서를 살펴보면 SAN(Subject Alternative Name)에 추가된 pool이 빠진 것을 볼 수 있습니다.

root@vagrant:~# kubectl get secret -n tenant1 tenant1-tls -o jsonpath='{.data.public\.crt}' | base64 -d | openssl x509 -noout -text
Certificate:
    Data:
...생략
        X509v3 extensions:
...생략
            X509v3 Subject Alternative Name: 
                DNS:tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local, DNS:minio.tenant1.svc.cluster.local, DNS:minio.tenant1, DNS:minio.tenant1.svc, DNS:*., DNS:*.tenant1.svc.cluster.local
...생략

신규 풀 문제 해결

해당 인증서를 삭제해줍니다.

kubectl delete secret -n tenant1 tenant1-tls

오퍼레이터의 로그를 보면 secret이 없는걸 확인하고 secret을 생성하는 로그도 볼 수 있습니다.

root@vagrant:~# k logs deployment/minio-operator -nminio-operator
W0918 18:49:34.718464       1 minio.go:127] Cannot check secret / for renewal (will be renewing): missing 'public.crt' in / secret
I0918 18:49:40.717854       1 minio.go:186] Generating private key
I0918 18:49:40.717918       1 minio.go:199] Generating CSR with CN=*.tenant1-hl.tenant1.svc.cluster.local
I0918 18:49:40.726869       1 csr.go:183] Start polling for certificate of csr/tenant1-tenant1-csr, every 5s, timeout after 20m0s
I0918 18:49:40.726912       1 event.go:377] Event(v1.ObjectReference{Kind:"Tenant", Namespace:"tenant1", Name:"tenant1", UID:"5c24763b-77bb-4007-b251-4eb50918462f", APIVersion:"minio.min.io/v2", ResourceVersion:"3867", FieldPath:""}): type: 'Normal' reason: 'CSRCreated' MinIO CSR Created
I0918 18:49:41.698399       1 status.go:89] Hit conflict issue, getting latest version of tenant
I0918 18:49:46.707009       1 csr.go:209] Certificate successfully fetched, creating secret with Private key and Certificate
I0918 18:49:52.770119       1 status.go:55] Hit conflict issue, getting latest version of tenant
I0918 18:49:52.776463       1 event.go:377] Event(v1.ObjectReference{Kind:"Tenant", Namespace:"tenant1", Name:"tenant1", UID:"5c24763b-77bb-4007-b251-4eb50918462f", APIVersion:"minio.min.io/v2", ResourceVersion:"3886", FieldPath:""}): type: 'Warning' reason: 'WaitingMinIOIsHealthy' Waiting for MinIO to be ready

이후 테넌트 파드 로그를 통해 아래 출력을 기다립니다.
k logs sts/tenant1-pool-0 -n tenant1 -f

---------------------------
MinIO Object Storage Server
Copyright: 2015-2025 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2025-04-08T15-41-24Z (go1.24.2 linux/amd64)

API: https://minio.tenant1.svc.cluster.local 
WebUI: https://10.42.0.19:9443 https://127.0.0.1:9443   

Docs: https://docs.min.io
---------------------------

정상 동작 재확인

root@vagrant:~# mc ls k8s-tenant1/mybucket --insecure
[2025-09-19 04:06:42 UTC] 1.0GiB STANDARD 1g_a1
[2025-09-19 03:57:58 UTC] 4.0GiB STANDARD 4g_a1
[2025-09-19 03:58:29 UTC] 4.0GiB STANDARD 4g_a2
[2025-09-19 03:59:01 UTC] 4.0GiB STANDARD 4g_a3
[2025-09-19 03:59:36 UTC] 4.0GiB STANDARD 4g_a4
[2025-09-19 04:00:09 UTC] 4.0GiB STANDARD 4g_a5
[2025-09-19 04:00:44 UTC] 4.0GiB STANDARD 4g_a6
[2025-09-19 04:01:12 UTC] 4.0GiB STANDARD 4g_a7
root@vagrant:~#

리밸런스

리밸런스 필요성

기본적으로 MinIO는 새 풀 추가 시 기존 객체를 자동 재배치하지 않습니다. 상대적으로 용량이 여유로운 풀에 객체를 넣는 형태로 동작합니다. 해당 설명을 보면 리밸런싱이 따로 필요한 것 같지는 않습니다. 

https://docs.min.io/community/minio-object-store/reference/minio-mc-admin/mc-admin-rebalance.html

현재 디스크 사용량을 보면 기존 풀은 가득찬 상태이지만 신규 풀은 거의 비어있습니다.

root@vagrant:~# df -h --type xfs
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         11G  9.5G  821M  93% /var/lib/directpv/mnt/66ec1f2a-410c-441f-9f2e-dcbac5b70331
/dev/sdd         11G  9.5G  821M  93% /var/lib/directpv/mnt/77a73b1f-111e-420b-8558-a6b2d2740a82
/dev/sde         11G  9.5G  821M  93% /var/lib/directpv/mnt/8f9920e4-bab9-47e7-a1ef-74f20b8d7d6d
/dev/sdc         11G  9.5G  821M  93% /var/lib/directpv/mnt/59af0acd-cd43-4187-b9e1-cdefce538266
/dev/sdg         11G  106M   11G   2% /var/lib/directpv/mnt/e2c6daa2-2a1d-4734-a8e1-d5e955b507db
/dev/sdi         11G  106M   11G   2% /var/lib/directpv/mnt/9d4d7302-18e8-4a1f-aa9b-7d5af13ca5b5
/dev/sdh         11G  106M   11G   2% /var/lib/directpv/mnt/b001eff1-a6c2-4a46-871f-3a1259480985
/dev/sdf         11G  106M   11G   2% /var/lib/directpv/mnt/0335650c-806f-4026-8ad5-0eefc2c7bdbc

 

리밸런스 시작

root@vagrant:~# mc admin rebalance start k8s-tenant1 --insecure
Rebalance started for k8s-tenant1

리밸런스 상태 확인

root@vagrant:~# mc admin rebalance status k8s-tenant1 --insecure
Per-pool usage:
┌──────────┬────────┐
│ Pool-0   │ Pool-1 │
│ 93.38% * │ 1.26%  │
└──────────┴────────┘
Summary: 
Data: 0 B (0 objects, 0 versions) 
Time: 5.657142535s (0s to completion)

리밸런스 이벤트 트레이스

root@vagrant:~# mc admin trace --call rebalance k8s-tenant1 --insecure
2025-09-19T06:40:46.141 [REBALANCE] rebalance.SaveMetadata (pool-id=0) tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local:9000 saved at 2025-09-19 06:40:46.141944595 +0000 UTC m=+326.719404496 26.49858ms
2025-09-19T06:40:54.007 [REBALANCE] rebalance.SaveMetadata (pool-id=0) tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local:9000 saved at 2025-09-19 06:40:54.007766117 +0000 UTC m=+334.585226017 54.657272ms
2025-09-19T06:40:32.184 [REBALANCE] rebalance.RebalanceObject (pool-id=0) tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local:9000 mybucket 2g_a1  29.435957088s 2.0 GiB
2025-09-19T06:41:01.620 [REBALANCE] rebalance.RebalanceRemoveObject (pool-id=0) tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local:9000 mybucket 2g_a1 124.895µs
2025-09-19T06:41:02.315 [REBALANCE] rebalance.SaveMetadata (pool-id=0) tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local:9000 saved at 2025-09-19 06:41:02.315703431 +0000 UTC m=+342.893163332 81.560128ms
2025-09-19T06:41:07.682 [REBALANCE] rebalance.SaveMetadata (pool-id=0) tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local:9000 saved at 2025-09-19 06:41:07.682783408 +0000 UTC m=+348.260243309 88.307236ms

리밸런스가 진행되면 각 풀의 사용률이 점차 비슷해집니다.

^Croot@vagrant:~# mc admin rebalance status k8s-tenant1 --insecure
Per-pool usage:
┌──────────┬────────┐
│ Pool-0   │ Pool-1 │
│ 93.38% * │ 27.82% │
└──────────┴────────┘
Summary: 
Data: 11 GiB (4 objects, 4 versions) 
Time: 2m5.803078471s (3m40.267744117s to completion)

리밸런스 완료

3분정도 걸렸습니다.

root@vagrant:~# mc admin rebalance status k8s-tenant1 --insecure
Per-pool usage:
┌────────┬────────┐
│ Pool-0 │ Pool-1 │
│ 46.69% │ 46.69% │
└────────┴────────┘
Summary: 
Data: 19 GiB (7 objects, 7 versions) 
Time: 3m30.882762172s (0s to completion)

재업로드 진행

리밸런스 후 추가 업로드도 정상 동작하는지 확인합니다.

root@vagrant:~# for i in {1..20}; do
  echo "copying $i"
  mc cp 2g k8s-tenant1/mybucket/2g_b$i --insecure || break
done
copying 1
/root/2g:                                2.00 GiB / 2.00 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 106.36 MiB/s 19scopying 2
/root/2g:                                2.00 GiB / 2.00 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 92.54 MiB/s 22scopying 3
/root/2g:                                2.00 GiB / 2.00 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 102.19 MiB/s 20scopying 4
...

추가적으로 업로드까지 잘 된것을 확인해봤습니다.

root@vagrant:~# df -h --type xfs
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         11G  9.8G  479M  96% /var/lib/directpv/mnt/4726aeb1-03ea-4083-8654-378be7b924af
/dev/sdc         11G  9.8G  479M  96% /var/lib/directpv/mnt/6545df4c-d6bd-4066-a14e-1d110cab1c07
/dev/sdd         11G  9.8G  479M  96% /var/lib/directpv/mnt/7748e58f-0a59-4284-a410-ae95d989e260
/dev/sde         11G  9.8G  479M  96% /var/lib/directpv/mnt/4efeaf1a-8287-40d2-9056-d8bf14a4ac7b
/dev/sdf         11G  9.5G  816M  93% /var/lib/directpv/mnt/392d60e3-ac99-4b96-a3f0-90be1cf397d2
/dev/sdg         11G  9.5G  816M  93% /var/lib/directpv/mnt/0d820588-9f8d-4281-8553-389eb981bb9f
/dev/sdi         11G  9.5G  816M  93% /var/lib/directpv/mnt/b46396c0-e8ad-489e-9bb4-11cdd9fcc1b2
/dev/sdh         11G  9.5G  816M  93% /var/lib/directpv/mnt/7ee6d8c0-5823-480f-8a9a-58bb5c123367
root@vagrant:~#

ETC

객체 삭제시 용량 반환 시점

객체 삭제 후 df -h를 통해 확인해 봤을 때 사용량이 즉시 반영되지 않을 수 있습니다. 시간이 지나 반영되거나, 리밸런스를 수행하면 빠르게 갱신되는 것을 확인할 수 있습니다.

'> Tech' 카테고리의 다른 글

MinIO DirectPV PVC 테스트 (vagrant/k3s)  (0) 2025.09.18
MinIO DirectPV 소개 및 설치  (0) 2025.09.18
MinIO 아키텍처와 핵심 개념 정리  (0) 2025.09.13

관련글 더보기