5 min read

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

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