[k8s] minio: 분산 스토리지 구성하기

minio는 자체 클라우드 스토리지 구성을 지원하는 서버 시스템 중 하나다.

AWS S3와의 호환 기능을 제공해서 일반 스토리지처럼 쓸 수도 있다.




구조

minio는 기본적으로 분산 노드 환경에서의 고가용성 구조를 지향한다.
그래서 2 노드 구성이 기본이다.

minio 시스템은 minio tenant라고 하는 관리 서버의 집합으로 구성된다.
tenant는 별도의 node에 하나씩 프로비저닝되고, minio operator는 이 tenant들을 관리하면서 필요에 따라서 파일을 할당하거나 하는 것이다.

게다가 고가용성과 장애 대응을 위해서 리소스를 과도하게 분산해놓는 경향이 있다.
하나의 tenant에는 서버를 4개 이상 배치하는데, 각각의 서버는 또 4개 이상의 Volume을 들고 있어야 한다.
그러니까 하나의 tenant에 볼륨 16개를 깔아놓는게 권장사항이란 것이다. 그래서 파일 하나 올려도 볼륨 16개에 다 복제된다.

이를 통해 부분적으로 문제가 생겼을 때도 안전하게 복구가 가능한게 장점이다.




minio operator 설치

6.0.0 버전 기준이다. k8s v1.28.9 이상부터 사용 가능하다.

다음과 같이 apply를 날리면

kubectl apply -k "github.com/minio/operator?ref=v6.0.4"

바로 리소스들을 자동으로 만들어준다.


kubectl get all -n minio-operator

근데 쓰고있는 클러스터가 단일노드라면, 하나만 되고 하나는 되지 않을 수 있다.
affinity 구성이 되어있어서 각각 별도 노드에 깔리게끔 해놨다.

멀티노드라면 그냥 쓰면 되고, 아니라면 다음과 같이 레플리카 수를 조절한다.

kubectl scale deployment minio-operator -n minio-operator --replicas=1




minio tenant 구성하기

minio operator는 전반적인 관리자일 뿐이고, minio의 실질적인 동작 구현은 tenant 수준에서 이루어진다.

우선 tenant를 관리할 네임스페이스를 하나 만들었다.

kubectl create namespace minio-tenant

그리고 storageclass를 하나 만든다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: minio
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

이걸 달았을때 자동으로 minio에 기반해서 마운트되도록 할 것이다.




PV 관리자 구성 - directpv

minio는 동적으로 조정되고 멀티노드 환경에서의 유연한 관리가 필요한 경우에는 directpv를 권장한다.
krew를 통해서 설치할 수 있고, 드라이브를 선택한 뒤에 init 명령을 날리면 드라이브 하나를 통째로 들고서 스토리지를 나눠쓸 수 있다.

kubectl krew install directpv
kubectl directpv install 
kubectl directpv discover

설치하면 관련 pod 구성들도 만들어지고

drive 목록 골라서 적당히 선택할 수 있다.




PV 관리자 구성 - local volume 기반

단일 노드 환경에 가벼운 개발환경으로만 쓸거라면 로컬 볼륨 구성이 간편할 수 있다.

sudo mkdir -p /mnt/disks/minio/1
sudo mkdir -p /mnt/disks/minio/2
sudo mkdir -p /mnt/disks/minio/3
sudo mkdir -p /mnt/disks/minio/4
sudo mkdir -p /mnt/disks/minio/5
sudo mkdir -p /mnt/disks/minio/6
sudo mkdir -p /mnt/disks/minio/7
sudo mkdir -p /mnt/disks/minio/8
sudo mkdir -p /mnt/disks/minio/9
sudo mkdir -p /mnt/disks/minio/10
sudo mkdir -p /mnt/disks/minio/11
sudo mkdir -p /mnt/disks/minio/12
sudo mkdir -p /mnt/disks/minio/13
sudo mkdir -p /mnt/disks/minio/14
sudo mkdir -p /mnt/disks/minio/15
sudo mkdir -p /mnt/disks/minio/16

마운트할 경로 만들고


apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv
spec:
  capacity:
    storage: 20Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: minio
  local:
    path: /mnt/disks/minio
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - 노드명

각각에 대해서 16개의 PV를 만들어준다.




minio tenant 구성 -

PV가 준비되었으면 이제 tenant 서버 세트를 띄우면 된다.
기본설정으로만 띄우고 싶다면 아래 명령만 돌리면 된다.

kubectl apply -k github.com/minio/operator/examples/kustomization/base

참고로 이건 directpv 전용이다.

local로 마운트할거라면 해당 경로에 있는 파일들 받아다가 storageclass를 방금 만든 minio 등으로 조정해줘야 한다.

kubectl apply -k ./minio-tenant

그리고 날린다.


kubectl get all -n minio-tenant

그래서 모든 pod들, pvc들이 다 마운트되면 잘 된 것이다.

console 서비스만 외부공개해서 적당히 열어놓고

kubectl patch svc myminio-console -n minio-tenant -p '{"spec": {"type": "LoadBalancer"}}'

들어가서 쓰면 된다.



코드 참조
https://github.com/myyrakle/infrastructures/tree/master/k8s/templates/onpremise/minio



참조
https://min.io/docs/minio/kubernetes/upstream/operations/installation.html
https://github.com/minio/operator
https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-minio-tenant-helm.html#deploy-tenant-helm
https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-minio-tenant.html#minio-k8s-deploy-minio-tenant
https://github.com/minio/operator/tree/master/examples/kustomization/base