간단하지만, 국문 자료 소개가 전혀 안되어 있는 k8s 클러스터에 discourse 배포하기
1. discourse 란?
discourse는 잘 알려져 있는 오픈소스 커뮤니티 플랫폼으로, 루비 기반으로 프로젝트가 빌드 되어 있다. (프로젝트 링크)
최근 오픈소스 프로젝트 트렌드를 쭉 살펴 보면 코어만 오픈하고, 기능 중에 필요하지만 사용하는데 지장이 없는 기능들 (예를 들면, 권한 & 인증, 그룹 관리 등과 같은 RBAC)을 클라우드 상에서 유료로 제공하고 있어서 쓰다보면 답답한 경우가 많다.
그런데 discourse는 그렇지 않다. 클라우드에서 제공하는 모든 커뮤니티 기능들을 오픈소스로 오픈해서 무료로 제공하고 있으며, 개발자가 직접 빌드해서 사용하겠다고 하면 가격 정책에 따라 차등해서 제공되는 플러그인들 조차 무료로 사용할 수 있다. (플러그인 링크)
특히 ML 관련해서 오픈소스 플랫폼들은 워낙 이런 부분 유료화 제품들이 많아서, discourse 같은 완전 공개 프로젝트를 보니 혜자 팩이라는 생각이 들었다.
최근 들어, 회사에서 반복적이고 동일한 문의를 주는 ML 연구원들이 많다 보니 (cpu intensive한 실험을 하고 싶은데 별도 인스턴스 열어주실 수 있나요 ~, OO 프로젝트를 argo workflow에 이관하고 싶은데 어떻게 해야하나요 ~, 네트워크가 느린 것 같은데 해결해주세요 ~ 등) 이런 문의를 모아서 한 번에 해결하기 위해 AWS 클러스터에 discourse를 배포하게 되었다.
사실 discourse를 사용하는 use case를 보면 외부에 자사 서비스를 사용하다가 issue가 발생하면 개발자들이 대응하는 형태로 보통 사용하는 것으로 보이는데 (대표적으로 nvidia나 linux 프로젝트 웹사이트) 반복 질문이나 프로젝트 세팅 같은 불필요한 노고가 반복되는 문의를 정리해서 운영하는 것에도 적합한 것 같아 우리 팀에서 내가 배포를 하게 되었다.
배포 방법은 전혀 어렵지 않은데, 문제는 discourse를 helm 기반으로 배포하고 관리하는 것에 대해 discourse 공식 홈페이지나 누군가가 정리해놓은 글이 없다는 점이다.
이것 때문에 약간 삽질한 것 빼고는 모든 것이 괜찮았고, 다른 사람들도 회사 사정에 따라 discourse 등으로 이슈 관리를 할 수 있기 때문에 내가 작성한 가이드를 보고 설치에 불필요한 시간을 투입 안했으면 하는 마음에 정리한다.
2. EKS에 discourse 배포하기 (on-prem k8s, 기타 클라우드 상의 k8s 서비스도 동일)
먼저 https://artifacthub.io/packages/helm/bitnami/discourse에 접속해서 bitnami에 업로드 되어 있는 discourse 버전을 확인하자. 그냥 최신 버전을 사용하고 싶으면 chart 버전을 특별히 확인할 필요는 없다.
artifacthub과 bitnami 공식 홈페이지 (링크)에서 설치할 때 안내하는 내용은 OCI(Open Container Initiative) 레지스트리지만, https 프로토콜로 설치 가능하고, 내가 진행한 방법은 https 기반 설치 작업이다.
- helm repo add discourse https://charts.bitnami.com/bitnami
- helm install discourse bitnami/discourse <적용하려는 values.yaml> -n <사용하려는 네임스페이스>
- (
설치 이후, 업데이트 필요한 경우
)helm upgrade discourse bitnami/discourse -f <업데이트가 반영된 values.yaml> -n <discourse 네임스페이스>
여기까지가 가장 기본이 되는 helm과 discourse 배포 방법이지만, EKS를 사용하면서 인증된 유저가 외부에서 해당 웹사이트로 접속하려면 ALB (AWS Load-balancer)를 열어줘야한다.
helm을 지원하기 때문에 discourse에 ingress 설정이 가능하고, 이와 관련한 내용은 ALB 문서를 참조해서 작성이 가능하다. (링크)
아래는 내가 직접 설정한 ALB 관련 annotation이다.
그리고 values.yaml 설정 값이 일부 discourse 컨테이너 이미지 버전과 호환이 안되는 것이 있어서, 불필요한 삽질을 했는데 사용한 discourse 컨테이너 버전은 아래와 같다. (필요한 경우 DB pod도 postgresql을 띄울 수 있지만, 인프라팀에서 운영 중인 서비스들은 RDS에 DB를 구성해서 운영하고 있다.)
registry: docker.io
repository: bitnami/discourse
tag: 3.0.3-debian-11-r7
이유는 모르나 ROR(Ruby on rails) version error에러로 3.0.3-debian-11-r0을 사용하면 에러가 발생하니 참고 바란다.
3. discourse 플러그인 설치하기
이게 가장 까다로웠던 작업인데, helm 도 helm 레포 경로 안내가 없어서 삽질했는데 플러그인 설치 방법이 일반 인스턴스 설치와 방법이 조금 달라서 해맸다.
values.yaml
에 있는 plugin:
항목에 설치하고자 하는 plugin은 몇 개를 정의하더라도 설치가 안되니, 참고 바란다.
공식적으로 플러그인 설치 안내는 bitnami 페이지에 숨겨져 있다. (링크)
내용인즉, discourse를 클러스터에 배포하고나면 해당 파드에 직접 접속해서 /opt/bitnami/discourse에 플러그인 저장소 url을 입력해서 설치하라는 것이다.
예를 들어, OIDC 플러그인을 설치하고 싶다면 (이 플러그인은 business plan 이상부터 원래 지원된다.) 아래와 같이 진행하면 된다.
- cd /opt/bitnami/discourse
- sudo RAILS_ENV=production bundle exec rake plugin:install repo= https://github.com/discourse/discourse-openid-connect
- sudo RAILS_ENV=production bundle exec rake assets:precompile
설치 후에, pod를 한 번 재시작해주면 아래와 같이 플러그인 설치가 잘 되어 있는 것을 볼 수 있다.
4. 마치며
네트워크 설정, docker 컨테이너 <-> values.yaml 버전이 안맞는 이슈와 플러그인 설치 등으로 유독 에러가 많이 있던 discourse 배포지만, 배포 이후에 ML 연구원 분들이 단순 반복적인 질문을 이제 덜 하는 덕분에 무척 편하다.
helm의 values.yaml 부분은 많이 설명하지 못하고 넘어갔는데 보안상 중요한 내용들이 많다보니 해당 부분은 ingress를 제외하고 많이 생략했다.
필요하면 댓글로 관련 문의를 주면 답변 드릴 수 있으니 언제든 문의주시길.
서비스 배포 이후 운영이 진짜 문제라고 다들 많이 말하는데, 실제로 인프라팀에서 서비스 하나 업데이트하거나 배포하면 문의가 쏟아져서 이런 반복적인 질문은 관리가 필요하다.
왜 개발을 배우겠는가? 반복적이고 단순한 작업들을 효율적으로 관리하기 위한 목적이 아니겠는가?
그런 의미에서 보면 discourse는 다방면의 사용자를 잘 배려한 좋은 오픈소스 프로젝트라고 믿는다.
Ryan