[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