Kubernetes

[MinIO] MinIO with NKS

graph-dev 2024. 8. 9. 18:30
728x90

MinIO with NKS

 

 

 

MinIO는 쿠버네티스로도 운용할 수 있습니다. 그러나 쿠버네티스는 설치하고 관리하는 과정이 조금 까다롭습니다. 그래서 네이버클라우드에서 제공하는 Ncloud Kubernetes Service(NKS)를 활용해보기로 합니다.

 

 

 

NKS 세팅

처음 NKS의 클러스터를 생성하려면, 아래와 같이 Subnet을 만들어야 합니다.

 

Subnet 설정 화면

 

네트워크는 Private 이므로, Private 서브넷을 하나 만들고, LB는 Public/Private 각각 하나씩 만들어서 총 세개의 서브넷을 만들어 보겠습니다. 

 

 

추가로 아웃바운드를 활성화하기 위해, 안내 메시지에 따라 NAT GW를 만들어야 합니다. 그러면, NAT를 위해서 서브넷을 하나 더 만들었습니다.

 

NAT GW 생성하기

 

NAT GW를 만들고, Route Table(Private)에 아래처럼 추가해줍니다.

 

 

다음으로, NKS 노드풀 설정을 마치고 생성합니다.

노드 생성후 클러스터 제작 화면

 

NKS 클러스터가 완전히 생성될 때까지 30분정도 소요됩니다.

 

 

그렇게 생성이 되면, 운영중으로 바뀌고, 진행을 해보겠습니다. 공인 IP를 가진 서버 하나를 생성하여, 터미널로 접속합니다.

 

접속 화면

 

이제부터, IAM 인증을 위한 절차를 수행합니다.

 

가이드에 따라, ncp-iam-authenticator를 설치합니다.

https://guide.ncloud-docs.com/docs/k8s-iam-auth-ncp-iam-authenticator

 

ncp-iam-authenticator 설치 화면

 

 

추가로 도움이 될만한 ncloud CLI라는 것을 설치합니다.

https://cli.ncloud-docs.com/docs/guide-clichange

 

설치 화면

 

쿠버네티스 클러스터 UUID를 ncp-iam에 등록합니다. 등록한 것을 --output 옵션을 넣어 YAML 파일로 생성합니다.

ncp-iam-authenticator update-kubeconfig --region <region-code> --clusterUuid <cluster-uuid> --output kubeconfig.yaml

 

 

ncloud iam 설정

 

kubectl 명령어를 설치합니다.

 

https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/

 

kubectl 설치

 

alias 설정을 해주면, 실행할때마다 kubectl 명령어에 --kubeconfig="~kubeconfig.yaml" 이렇게 안 붙여도 됩니다.

alias 설정

 

 

이제 노드를 확인해보면, NKS의 노드 이름과 일치하는 것을 확인할 수 있습니다.

노드 이름



 

MinIO 그리고 NKS 연결하기

이제 NKS와 minIO를 연결해보겠습니다.

 

https://min.io/docs/minio/kubernetes/openshift/index.html

 

가이드는 아주 간단합니다. 먼저, github에 있는 minio-dev.yaml 파일을 받습니다.

 

curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O

 

해당 파일 내부는 이렇습니다.

minio-dev.yaml 파일
포트 번호를 80에서 실행하도록 변경하기



 

이 상태에서 80포트로 실행하기 위해 yaml 파일을 바꾸고, 실행해보겠습니다.

kubectl apply -f minio-dev.yaml

 

 

yaml 파일 실행

 

상태를 확인합니다.

pod 상태 확인

 

Pending 상태입니다. 원인을 찾기 위해, pod에다가 describe로 실행합니다.

오류 확인

 

Pod의 node affinity/selector가 동일하지 않다고 나옵니다. 이럴 때는, node affinity/selector를 확인해서 변경해줍니다.

 

nodeSelector

 

노드 셀렉터의 hostname이 kubealpha.local로 되어있는데, 이를 노드 이름으로 바꿉니다.

pod 실행하기

 

노드가 여러개면 node affinity로 설정해도 된다고 합니다. 참고해두세요. 이제 pod에 로드밸런서를 연결해서, 로드밸런서가 제공하는 IP를 통해 웹에서 접근을 가능하게 만듭니다.

 

minio-dev 서비스 외부에 노출하기

 

 

해당 주소에 제시된 포트 번호를 붙여서 확인합니다. 만약 포트를 9090으로 했다면 아래처럼 입력합니다. 80이라면, 따로 포트번호를 부착하지 않아도 됩니다. 왜냐하면, http의 기본포트가 80이기 때문에 생략할 수 있습니다.

http://External-ip:9090 #포트번호 9090
http://External-ip #포트번호 80

 

위 정보를 인터넷 주소창에 바로 입력하면 됩니다. 만약 네이버클라우드를 쓰신다면, ACG Inbound 규칙에 80 포트를 허용해주셔야 합니다.

 

ACG 80포트 규칙 허용

 

 

 

마지막으로 제시된 external-ip를 입력해봅니다.

kubectl get svc minio -n minio-dev

주소 확인

 

주소 입력시 나오는 MINIO 화면

 

잘 노출된 것을 확인했습니다.

 

이후 MINIO Client(mc)를 활용하여 조작할 수 있습니다.

 

mc 명령어로 먼저 등록을 해야하는데, 그전에 반드시 수행할 작업이 있습니다. 바로, 포트포워딩입니다.

 

참고한 사이트

 

일반적으로 minio에서는, S3 API를 9000 포트에서 설정하고, 웹 콘솔은 9090 포트로 잡아줍니다. 그런데 저는 웹 콘솔을 80으로 잡았고 이것은 NKS의 로드밸런서에서 외부로 이미 접속할 수 있게 제공하고 있으므로, 80포트는 따로 포트포워딩을 하지 않았습니다.

 

그래서 9000포트만 포트포워딩을 수행하고, 다른 터미널을 열어서 동일한 공인 IP로 서버에 접속합니다.

kubectl port-forward pod/minio 9000 -n minio-dev

 

포트포워딩 화면

 

이 상태에서, 다른 터미널에는 아래 명령어로 mc client의 배포 이름(ALIAS)을 설정합니다. 일종의 remote name과 비슷하다고 보면 됩니다. 해당 이름은 공식 문서를 참고해서 k8s-graph로 잡았습니다.

 

mc alias set k8s-graph http://127.0.0.1:9000 <MINIO_ROOT_USER> <MINIO_ROOT_PASSWORD>

 

 

이렇게 가거나, 아니면 아래처럼 사용자 이름과 비밀번호를 나중에 입력할 수도 있습니다.

mc alias set k8s-graph http://127.0.0.1:9000

 

 

저는 root 사용자를 쓰지 않는 것을 권장합니다. 다만 처음 사용자를 추가하려면 최초 접속은 root 사용자로 해야합니다. 그 이후에 아래 명령어를 사용하여 추가하거나 삭제가 가능합니다.

mc admin user add ALIAS ACCESSKEY SECRETKEY

 

저라면, ALIAS는 k8s-graph가 되겠네요. 아이디와 비밀번호를 각각 ACCESSKEY, SECRETKEY에 입력합니다. SECRETKEY는 8자 이상 40자 이하로 설정해야합니다. graph 라는 사용자를 추가했습니다.

https://min.io/docs/minio/kubernetes/upstream/administration/identity-access-management/minio-user-management.html#minio-users-root

사용자 추가

 

이제 s3의 권한을 부여합니다.

mc admin policy attach ALIAS readwrite --user=USERNAME

https://min.io/docs/minio/kubernetes/upstream/administration/identity-access-management/policy-based-access-control.html#minio-policy

 

 

여기서 저희는 readwrite라는 권한만 부여하면 아래와 같이 나타납니다.

 

readwrite 권한 부여

 

다른 사용자를 추가하거나 삭제할 수는 없습니다.

다른 사용자 추가 및 삭제는 불가능

 

웹 콘솔에 해당 사용자로 접속해서 버킷을 생성하고, 파일을 업로드합니다.

 

생성한 사용자로 버킷 생성 후 파일 업로드 화면

 

이렇게 NKS로 MinIO 접속해보고 사용자도 추가해보았습니다. NKS를 사용하면 로드밸런서로 pod를 외부에서 접속할 수 있는 서비스로 만들 수 있습니다. 일종의 배포가 가능하다고 봐야겠습니다.

 

다음에는 AWS S3 스토리지, Ncloud Object Storage 등과 연동하여 MinIO Client를 사용하는 방법에 관해 글을 작성해보겠습니다.

 

'Kubernetes' 카테고리의 다른 글

[MinIO] 멀티클라우드 스토리지 오픈소스 : MinIO  (0) 2024.08.07