이번에는 Distributed Mode MinIO(MNMD)를 구성한 방법에 대해 작성하고자 합니다.
기존에는 3개 서버 정도에 5개의 디스크를 사용하려 했으나, 계획을 변경하여 여러 서버들을 모아 7개 서버에 10개의 디스크를 확보하고, 최종적으로 5개 노드에 10개의 디스크(1.65T씩 사용)를 띄우는 것으로 완료했습니다.
규모가 커지게된 배경에는 이전 SNSD에서는 1 SSD / 1 HDD 였기때문에 HDD에 들어있는 데이터를 가져오게되면 시간이 오래 걸렸지만(최대 4 Mb/s), 여러개의 HDD를 붙인다면 데이터를 분산해서 가져오기 때문에 HDD의 한계를 어느정도 극복할 수 있을 것이라 생각했습니다. ( 실제로 최소 7~8 Mb/s는 확보하게 되었습니다. )
디스크 드라이브 세팅
7개의 서버는 1개 디스크 드라이브를 가진 서버와 2개 디스크 드라이브를 가진 서버로 나누어져 있었다.
관리의 편리성을 위해 하나의 Yaml 파일을 통해 동적으로 PVC를 생성하여 Pod를 실행하려고 했지만 적절한 방법을 찾지 못하였고, 결국 5개의 서버에 디스크 드라이브를 2개씩 동일한 갯수로 맞춰 해결하고자 했다.
먼저 7개의 서버에 9개(2T(6), 3T(2), 3.6T(1))의 디스크를 확보했으며, 3.6T는 1.65T 씩 나눠서 총 10개의 PV를 생성했다.
PV / PVC
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-minio-server-1
spec:
capacity:
storage: 1650Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
local:
path: /mnt/minio-data-1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- server-1
claimRef:
name: minio-data-1-minio-0
namespace: minio-data
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-minio-server-2
spec:
capacity:
storage: 1650Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
local:
path: /mnt/minio-data-2
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- server-1
claimRef:
name: minio-data-2-minio-0
namespace: minio-data
nodeAffinity를 통해 다른 노드에서 PV를 사용할 수 없도록 제한했고(로컬 디스크기 떄문에),
MinIO를 실행할 때, args로 전달하는 데이터 폴더의 순서가 중요하기 때문에 claimRef를 통해 항상 같은 PV에 PVC가 Bound 될 수 있도록 설정했다.
Statefulset
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: minio
namespace: minio-data
spec:
serviceName: "minio-service"
replicas: 5
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
containers:
- name: minio
image: minio/minio
args:
- server
- http://minio-{0...4}.minio-service.minio-data.svc.cluster.local:9000/data-{1...2}
- --console-address
- ":9001"
env:
- name: MINIO_ROOT_USER
valueFrom:
secretKeyRef:
name: minio-secret
key: MINIO_ROOT_USER
- name: MINIO_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: minio-secret
key: MINIO_ROOT_PASSWORD
ports:
- containerPort: 9000
- containerPort: 9001
volumeMounts:
- name: minio-data-1
mountPath: /data-1
- name: minio-data-2
mountPath: /data-2
volumeClaimTemplates:
- metadata:
name: minio-data-1
namespace: minio-data
labels:
app: minio
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1650Gi
storageClassName: manual
- metadata:
name: minio-data-2
namespace: minio-data
labels:
app: minio
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1650Gi
storageClassName: manual
Statefulset은 이전의 SNSD와의 설정과 크게 다르지 않은데, replicas를 5로 설정했다.
*4~5번의 테스트에서는 PV와 Node가 알맞게 배분되었지만(ex: server 1에서 minio-0 Pod가 실행), 파드 스케줄링에 따라 다른 Node에 배포될 수 있으므로, 좀 더 안정적으로 실행하려면 Statefulset에 affinity를 추가해야 할듯 하다.
Service와 NodePort는 namespace를 제외하고 이전글에서와 똑같이 설정했다.
모든 Pod가 실행되고나서 Console을 통해 접근하여 아래와 같은 결과를 얻었다.
Prometheus 설정
MinIO Console의 Info를 제외한 나머지 부분(Usage, Traffic, Resources)를 확인하려면 Prometheus를 설정해야 한다.
초기 실행시 env에 추가를 해도되고, yaml에 추가하지 못했다면 kubectl edit을 통해 Pod에 직접 추가를 해도 된다.
env:
- name: MINIO_PROMETHEUS_URL
value: http://prometheus-server.monitoring.svc.cluster.local
or
kubectl edit -n namespace pod minio-0
Grafana Dashboard에서 사용하기 위해 Prometheus의 scrape_configs를 추가하는 방법도 있다.
먼저 minio client를 이용하여 alias를 설정하고 prometheus 설정값을 생성해준다.
kubectl exec -it -n namespace minio-0 -- /bin/sh
mc alias set [name] http://[service].[namespace].svc.cluster.local:9000 [username] [password]
mc admin prometheus generate [name]
Default 설정은 cluster이며, metrics_path의 최종 값(bucket,resources 등)을 조정하여 다른 값들도 설정할 수 있다.
kubectl edit configmaps -n monitoring prometheus-server
위의 값을 복사하여 prometheus-server의 configmap에 알맞은 위치에 추가하면, Grafana에서도 minio dashboard를 사용할 수 있게된다.
*직접 수정하는 것이 아닌 config 파일로 수정하는 방법을 알고 계시다면 댓글로 알려주세요.
마치며
이제 조금씩 사용해보고 있지만, 지금은 하나의 IP로 명시적으로 접근해서 업로드와 다운로드를 하고 있기에 부하 분산이 되고 있는지도 잘 모르겠고 여러모로 걱정이 되긴 합니다. 따라서 다음에는 부하 분산을 위한 로드 밸런서에 대해 알아볼 예정입니다.
'MLOps > MinIO' 카테고리의 다른 글
MinIO Client with Python (0) | 2024.07.17 |
---|---|
MinIO 부하 테스트 with NginX (1) | 2024.07.16 |
Minio SNSD on Kubernetes (2/2) (1) | 2024.07.08 |
Minio SNSD on Kubernetes (1/2) (0) | 2024.07.04 |
MinIO SNSD, SNMD (2) | 2024.06.11 |