Running Rocket.Chat and MongoDB on Kubernetes with StatefulSets

Rocket Chat can be run on-premise, with a pretty lean set of requirements; the application just needs a MongoDB database to get up and running, and this is particularly quick if you make use of their Docker images for the app. I planned to run a pretty active instance for a community project I recently began working on, and decided Kubernetes would make a quick, elastic way to run the server, and this turned out to be an excellent use for the StatefulSet resource.

Creating a MongoDB replica set was pretty straightforward — the StatefulSet allows you to use consistent naming, among other things, which proves useful here for your Rocket Chat server Deployment which I’ll cover in a moment.

Create a Service first for rocketchat-mongo-service along with the StatefulSet:

---
kind: Service
apiVersion: v1
metadata:
name: rocketchat-mongo-service
spec:
selector:
app: rocketchat-mongo
ports:
- protocol: TCP
port: 27017
targetPort: 27017
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rocketchat-mongo
spec:
selector:
matchLabels:
app: rocketchat-mongo
serviceName: "rocketchat-mongo"
replicas: 3
template:
metadata:
labels:
app: rocketchat-mongo
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongodb
image: mongo:3.2
ports:
- containerPort: 27017
name: web
command: ["mongod"]
args: ["--replSet","rs0","--smallfiles","--oplogSize","128","--storageEngine=mmapv1"]
volumeMounts:
- name: mongo-persistent-storage
mountPath: /data/db
volumeClaimTemplates:
- name: mongo-persistent-storage
annotations:
volume.beta.kubernetes.io/storage-class: "fast"
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi

So, this creates a replicaSet and DNS entries for `rocketchat-mongo-service-{0,1,2}.default` and for your Deployment, you’ll want to make use of the connection string for the Replica Set:

mongodb://rocketchat-mongo-service-0.default,rocketchat-mongo-service-1.default,rocketchat-mongo-service-2.mongo:27017

and use this in your Deployment:

---
kind: Service
apiVersion: v1
metadata:
name: rocketchat-server-service
spec:
selector:
app: rocketchat-server
ports:
- protocol: TCP
port: 33000
targetPort: 3000
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rocketchat-server-deployment
labels:
app: rocketchat-server
spec:
replicas: 1
selector:
matchLabels:
app: rocketchat-server
template:
metadata:
labels:
app: rocketchat-server
spec:
containers:
- name: rocketchat-server
image: rocketchat/rocket.chat:latest
env:
- name: PORT
value: "3000"
- name: ROOT_URL
value: "http://localhost:3000"
- name: MONGO_URL
value: "mongodb://rocketchat-mongo-service-0.default,rocketchat-mongo-service-1.default,rocketchat-mongo-service-2.mongo:27017/rocketchat"
- name: MONGO_OPLOG_URL
value: "mongodb://rocketchat-mongo-service-0.default,rocketchat-mongo-service-1.default,rocketchat-mongo-service-2.mongo:27017/local"
ports:
- containerPort: 3000

which consumes that replica set connection string for MONGO_URL and MONGO_OPLOG_URL .

Keep in mind that the Deployment will rely on the MongoDB StatefulSet, so run these in that order:

kubectl create -f rocketchat-mongodb.yaml

and once the output from:

kubectl get pods -l app=rocketchat-mongo

indicates 3/3 pods are Running , proceed to apply the rocketchat-server deployment, and once applied, you can access your Rocket Chat UI at http://$LB_ADDRESS:$SERVICE_PORT .

More about Rocket Chat’s Docker image can be found in their documentation for a Docker Compose-based deployment:

https://rocket.chat/docs/installation/docker-containers/docker-compose/