Skip to main content

Rocket.Chat Helm Chart 배포

Kyungmin Park

개요

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

GitHub - RocketChat/helm-charts: Repository for RocketChat helm charts
Repository for RocketChat helm charts. Contribute to RocketChat/helm-charts development by creating an account on GitHub.

Local Path Provisioner

GitHub - rancher/local-path-provisioner: Dynamically provisioning persistent local storage with Kubernetes
Dynamically provisioning persistent local storage with Kubernetes - GitHub - rancher/local-path-provisioner: Dynamically provisioning persistent local storage with Kubernetes

기본 정보

  • 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 다운로드

https://github.com/rancher/local-path-provisioner

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
정상적으로 배포 된 모습(이미 배포한지 30일이나 지났군요)

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
정상적으로 배포 된 모습
정상적으로 배포 된 모습 2