Rocket.Chat Helm Chart 배포
개요
Helm Chart를 이용하여 RocketChat을 간편하게 Kubernetes 클러스터에 배포하는 방법에 대해 기술합니다.
RocketChat는 MongoDB를 사용하며 Helm Chart를 통해 함께 배포하여 신규 구축 시간을 단축 할 수 있습니다.
또한 기존 MongoDB를 사용하여 RocketChat을 Helm Chart로 배포할 수 있습니다.
MongoDB를 신규로 RocketChat과 함께 설치 하려면 StorageClass를 통해 PV를 바인딩하기에 Dynamic Provisioner를 사용해야하기 때문에 간편하게 사용할 Local Path Provisioner를 사용합니다.
Rocket.Chat Helm Chart Repository
Local Path Provisioner
기본 정보
- OS: Ubuntu 22.04 LTS
- Kubernetes: k3s(v1.25.10+k3s1)
- Helm: v3.14.0
- RocketChat: Helm Chart Version 6.4.4
Rocket Chat Storage설정
이전에 언급한 대로 Storage는 Local Path Provisioner를 사용하여 동적으로 Rocket Chat 스토리지를 구성합니다.
Local Path Provisioner 배포 yaml 다운로드
Github에서 Stable 버전 파일 URL을 가져와 wget으로 다운로드합니다.
configmap 수정
이후 적용될 Local 경로의 Path를 할당하여 Provisioner에서 해당 경로를 사용하게끔 설정 합니다.
kind: ConfigMap
apiVersion: v1
metadata:
name: local-path-config
namespace: rocket
data:
config.json: |-
{
"nodePathMap":[
{
"node":"zlcus-sv",
"paths":["/external-nfs/rocketchat"]
}
]
}
setup: |-
#!/bin/sh
set -eu
mkdir -m 0777 -p "$VOL_DIR"
teardown: |-
#!/bin/sh
set -eu
rm -rf "$VOL_DIR"
helperPod.yaml: |-
apiVersion: v1
kind: Pod
metadata:
name: helper-pod
spec:
priorityClassName: system-node-critical
tolerations:
- key: node.kubernetes.io/disk-pressure
operator: Exists
effect: NoSchedule
containers:
- name: helper-pod
image: busybox
imagePullPolicy: IfNotPresent
저는 Local Path Provisioner를 rocketchat에만 사용하기에 Provisioner를 아예 rocket Namespace에 배포했습니다.
Local Path Provisioner 배포
kubectl apply -f local-path-storage.yaml
RocketChat Helm 배포
본 가이드에서 Helm으로 배포 될 주요 리소스는 아래와 같습니다.
- RocketChat Pod(Deployment) 1개
- MongoDB Pod(Statefulset) 1개
RocketChat 레포지토리 등록
helm repo add rocketchat https://rocketchat.github.io/helm-charts
URL 주소는 변경될 수 있으니 Github에서 잘 확인하고 등록하세요!
values.yaml
레포지토리에 등록된 values.yaml 파일을 가져와 수정하여 배포합니다.
helm show values rocketchat/rocketchat > values.yaml
image:
repository: registry.rocket.chat/rocketchat/rocket.chat
pullPolicy: IfNotPresent
host: "chat.hons.io"
replicaCount: 1
minAvailable: 1
smtp:
enabled: false
username:
password:
host:
port: 587
registrationToken: "-------------비밀!-------------"
podAntiAffinityTopologyKey: kubernetes.io/hostname
mongodb:
enabled: true
initdbScriptsConfigMap: rocketchat-mongodb-fix-clustermonitor-role-configmap
auth:
rootPassword: "-------------비밀!-------------"
usernames:
- "-------------비밀!-------------"
passwords:
- "-------------비밀!-------------"
databases:
- "-------------비밀!-------------"
architecture: replicaset
replicaCount: 1
persistence:
enabled: true
storageClass: "rocketchat-local-path-provisioner"
accessMode: ReadWriteOnce
size: 50Gi
volumePermissions: { enabled: true }
persistence:
enabled: true
storageClass: "rocketchat-local-path-provisioner"
accessMode: ReadWriteOnce
size: 50Gi
securityContext:
enabled: true
runAsUser: 999
fsGroup: 999
serviceAccount:
create: true
ingress:
enabled: true
pathType: Prefix
ingressClassName: "nginx"
path: /
tls:
- secretName: chat.hons.io-tls
hosts:
- chat.hons.io
service:
type: ClusterIP
port: 80
loadBalancerIP: "-------------비밀!-------------"
livenessProbe:
enabled: true
path: /health
initialDelaySeconds: 60
periodSeconds: 15
timeoutSeconds: 5
failureThreshold: 3
successThreshold: 1
readinessProbe:
enabled: true
path: /health
initialDelaySeconds: 10
periodSeconds: 15
timeoutSeconds: 5
failureThreshold: 3
successThreshold: 1
podDisruptionBudget:
enabled: true
nats:
nats:
image: nats:2.4-alpine
제가 작성한 예시 파일이며 참고용으로 봐주시면 되겠습니다.
values.yaml 파일에서 눈여겨 볼 점은 아래와 같습니다.
host
: RocketChat의 호스트 이름(Ingress Controller를 사용하시면 입력하셔야 합니다.)
smtp
: 이메일 인증이나 알림에 활용되는 SMTP 서버 설정 부분입니다.
registrationToken
: Rocket.Chat Cloud에 등록하고 토큰을 받을 수 있습니다.
Rocket.Chat Cloud Token을 받으면 좋은 점
- 엡 푸시 알림 사용 가능
- 마켓플레이스 사용 가능
- 라이브 채팅 옴니채널 사용 가능
- 소셜 네트워크용 OAuth 프록시 사용 가능
일반적으로 앱 푸시 알림과 마켓플레이스 때문에 등록합니다.
Helm Chart 배포
helm install rocketchat/rocketchat -n rocket -f values.yaml