K8S 환경은 아래와 같이 구성하였다 .
Ubuntu 20.04 LTS -> 4 Node
Docker 20.10.15
K8S v1.23.6 -> 1.24로 설치하고자 했지만, Docker 관련한 문제가 발생하여 설치를 못함. 아래 K8S 공식 문서를 참조하자.
https://kubernetes.io/blog/2021/11/12/are-you-ready-for-dockershim-removal/
아래 절차를 따라 설치를 진행해주자.
Krew란?
설치 방법은 아래와 같다.
$ sudo apt install git
$ (
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}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
# $HOME/.krew/bin 디렉토리를 PATH에 추가해준다.
$ export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
# .bashrc 적용
$ source ~/.bashrc
# krew 버전 확인
$ kubectl krew version
OPTION VALUE
GitTag v0.4.3
출처 : https://krew.sigs.k8s.io/docs/user-guide/setup/install/
# 설치
$ kubectl krew update
$ kubectl krew install minio
# 버전 체크
$ kubectl minio version
v4.4.17
# Initialize
$ kubectl minio init
# pod 체크
$ kubectl get pods -n minio-operator
NAME READY STATUS RESTARTS AGE
console-64b557c49b-rqxzz 1/1 Running 0 26s
minio-operator-6c7675f6c8-66pgp 1/1 Running 0 26s
minio-operator-6c7675f6c8-8hrhk 1/1 Running 0 26s
MinIO Operator Console에 접근해보자.
$ kubectl minio proxy -n minio-operator
Starting port forward of the Console UI.
To connect open a browser and go to http://localhost:9090
Current JWT to login: TOKENSTRING
MinIO Tenant Configuration을 하는 과정에서, 설정을 하는 부분을 모르겠어서, Documentation을 보고 각 부분이 어떤 것을 의미하는지 알아보겠다.
Namespace : MinIO는 각 Namespace 당 하나의 Tenent만 허용한다. 다음 명령어로 MinIO Tenant를 위한 namespace하나를 할당하자.
$ kubectl create namespace minio-tenant-1
# namespace가 생성된 것을 확인할 수 있다.
$ kubectl get namespace
NAME STATUS AGE
default Active 17h
...
minio-tenant-1 Active 11s
# 혹은, Operator Console에서 직접 추가할 수 있다. aa 이름의 namespace를 오른쪽의 +를 누르고 추가해보았다.
$ kubectl get namespace
NAME STATUS AGE
aa Active 3s
....
kube-public Active 17h
MinIO K8S Operator는 Tenant를 Deploy하는 과정에서, 자동으로 PVC를 생성한다. 이 내용을 이해하기 위해, PV, PVC, Storage Class가 무엇인지 알아보자.
MinIO Operator Plugin은 각 PVC를 K8S default Storage Class에 할당한다. 만약, default Storage Class가 PVC 생성을 하용하지 않으면, Tenant Deploy는 실패한다.
따라서, MinIO Tenants는 StorageClass가 VolumeBindingMode를 WaitForFirstConsumer로 설정하는 것을 요구한다.
# default StorageClass 세팅
volumeBindingMode: Immediate
# MinIO가 원하는 pvc binding Mode는 아래와 같다.
volumeBindingMode: WaitForFirstConsumer
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: direct-csi-min-io
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
$ kubectl apply -f direct-csi-min-io.yaml
$ kubectl get sc --all-namespaces
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE
direct-csi-min-io kubernetes.io/no-provisioner Delete WaitForFirstConsumer
MinIO Operator는 아래와 같이 PVC를 생성한다.
따라서, MinIO를 정상적으로 작동시키고 싶으면, Cluster는 반드시 각 PVC가 요구하는 capacity를 만족하기 위해 충분한 PV를 반드시 가지고 있어야한다. 예시를 보자.
MinIO는 DirectPV를 사용하여 Attached Dirves에서 PV를 자동으로 Provision하기 위해 사용한다. 아래 과정은 DirectPV를 설치한 것을 가정한다. -> https://velog.io/@jamangstangs/MinIO-DirectPV 참고
출처 : https://github.com/minio/operator/blob/master/README.md
아래 과정을 따라서 Tenant를 생성해보자.
Name
Capacity
출처 : https://docs.min.io/minio/k8s/deployment/deploy-minio-operator.html