오늘은 MinIO 서버를 Cronjob을 이용하여 재시작 하는 내용과 S3 Browser를 이용한 파일 다운로드/업로드 하는 작업에 대해 다뤄보고자 합니다. 왜 이 주제를 다루게 되었는지는 본문에서 설명하도록 하겠습니다.
MinIO 서버 재시작
앞서서 여러 부하테스트(벤치마크, 실사용 테스트 등)을 진행하니 메모리 점유율이 2~3GB 단위를 넘어가는 상황이 발생했습니다. 늘어난 메모리는 다시 줄어들지 않았는데, 앞서 말씀드렸다시피 K8S 클러스터들은 MinIO 서비스 뿐만 아니라 다른 일들(대부분 ML)도 처리를 해야 하는데요, 이러한 상황에서 메모리를 많이 점유하고 있기엔 부담스러웠습니다. ( 최소 32GB의 메모리를 요구하는걸 보면 못해도 절반은 사용할 것으로 예상했습니다. )
따라서 사람들이 자주 사용하지 않을 시간대를 골라 주기적으로 pod를 재시작해 메모리를 초기화하고자 했습니다. 재시작은 K8S의 Cronjob을 이용했습니다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: cronjob-service-account
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cronjob-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets"]
verbs: ["get", "list", "watch", "patch"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create", "delete", "get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cronjob-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cronjob-role
subjects:
- kind: ServiceAccount
name: cronjob-service-account
namespace: default
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: restart-cronjob
namespace: default
spec:
schedule: "0 0 * * 0"
jobTemplate:
spec:
template:
spec:
serviceAccountName: cronjob-service-account
containers:
- name: kubectl
image: bitnami/kubectl:latest
command:
- /bin/sh
- -c
- |
kubectl rollout restart statefulset -n minio-data minio
kubectl rollout restart deployment nginx-deployment
env:
- name: KUBERNETES_SERVICE_HOST
value: "kubernetes.default.svc"
- name: KUBERNETES_SERVICE_PORT
value: "443"
restartPolicy: OnFailure
시간대는 매주 일요일 자정에 초기화 되도록 하였고, 재시작은 rollout을 이용해 statefulset(minio)과 deployment(nginx)를 restart 하는 방식을 이용했습니다. minio만 재시작 할 경우 앞서 설정한 nginx의 리버스 프록시 기능이 제대로 작동하지 않아 nginx도 재시작 되도록 추가 했습니다. 저번주 테스트를 진행하였고, 재시작 후에도 기능 이상 없이 작동함을 확인했습니다.
S3 Browser
S3 Browser는 파일 서버를 위해 사용하게 되었습니다. MinIO의 자체 Web UI Console을 이용하여 업로드와 다운로드를 진행할 때, Mac에선 접속이 되지 않았고, 윈도우에서도 종종 연결이 끊긴다거나 하는 불안정한 모습을 보였습니다. 결정적인건 단일 파일은 괜찮으나 파일 갯수(아마도 100개 이상)가 많아지면 업로드가 되지 않는 현상이 발생했었습니다.
S3 Browser는 여기서 설치할 수 있는데, S3 Browser에 대해 간단히 설명하면 S3와 호환되는 클라우드 스토리지 서비스와 상호 작용하기 위한 그래픽 사용자 인터페이스(GUI)입니다. Windows 탐색기와 유사한 방식으로 파일을 관리할 수 있게 도와줍니다.
저는 무료버전을 이용했고, 속도 제한은 있지만 안정적으로 파일이 올라감을 확인했습니다. S3 Browser를 이용한 MinIO 접속 방법은 다음과 같습니다.
1. S3 Browser 설치 후 Add new account를 눌러 접속 정보를 추가하는 창을 엽니다.
2. 접속 정보를 추가합니다.
- Display name : 원하는 이름
- Account type : S3 Compatible Storage
- REST Endpoint : [minio 접속 IP]:[Port]
Port의 경우 Console이 아닌 Minio 끼리 통신하는 Port를 의미하며, 저 같은 경우는 Nodeport로 30002에 설정했습니다.
Access Key ID: MinIO 접속 ID
Secret Access Key: MinIO 접속 Password
SSL/TLS 연결은 사용하지 않으므로 체크 해제 했습니다.
이렇게 설정하고 Add new account를 누르면 설정이 저장되며, Accounts Tab을 누르면 저장된 Account를 볼 수 있습니다.
server를 클릭하면 MinIO 서버로 접속이 완료되고, GUI를 이용하여 파일 다운로드 / 업로드를 진행할 수 있게됩니다.
마치며
MinIO에서 FTP 기능을 지원하는걸 봐서 FTP로도 되나 싶었지만, 정보가 많지 않고 여러 시도 끝에 연결이 되지 않아서 S3 Browser를 사용하는 것으로 변경했습니다.
Rollout을 이용하여 restart 하는 방법도 최적의 방법은 아닌 것 같긴한데, 혹시 좋은 방법이 있다면 알려주시면 감사하겠습니다.
'MLOps > MinIO' 카테고리의 다른 글
MinIO Client with Python (0) | 2024.07.17 |
---|---|
MinIO 부하 테스트 with NginX (1) | 2024.07.16 |
MinIO MNMD on Kubernetes with Prometheus (0) | 2024.07.09 |
Minio SNSD on Kubernetes (2/2) (1) | 2024.07.08 |
Minio SNSD on Kubernetes (1/2) (0) | 2024.07.04 |