2020/05/26

SlackライクなOSSチャットツール「Mattermost」をGKEで導入する

gkek8smattermost

概要

Titleの通りですが、OSSのチャットツールであるMattermostをkubernetes上にデプロイをして運用を開始しました。
人数が多くなると、Slackはややコストかさみますし、セキュリティ的な観点からも自前のチャットツールの方がベターかなということで導入を決めました。
見た目や機能はほとんどSlackと一緒で使いやすいです。

Mattermost ≒ Slackのオンプレ

といった感じです👍

実施事項

こちらの記事で作ったGKEクラスター上にMattermost serverをdeployしました。
モバイルアプリについてはまだ対応していません。後々時間作って、対応しようかなと思っています。

参考になったページ

k8sのデプロイ内容詳細

事前準備

  • mattermost serverが使うのpostgresql用のcompute diskを作成しておきます。
  • mattermost serverのweb server(nginx)のためのelastic ip addressを作成しておきます。

k8sへのデプロイ設定ファイル及び順序

namespace

apiVersion: v1
kind: Namespace
metadata:
  name: mattermost

secrets

apiVersion: v1
kind: Secret
metadata:
  name: postgresql
  namespace: mattermost
type: Opaque
data:
  password: <base64-encoded-string-here>
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: internal-tls
  namespace: mattermost
data:
  # nginxで使うsslのcrtファイルの中身をbase64エンコードします
  tls_certificate_chain: <base64-encoded-string-here>
  # nginxで使うsslのkeyファイルの中身をbase64エンコードします
  tls_certificate_key: <base64-encoded-string-here>
  # you can generate tls_dhparam by `openssl dhparam 2048 -out tls_dhparam`
  tls_dhparam: <base64-encoded-string-here>

config map

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgresql
  namespace: mattermost
data:
  user: mmuser
  db-name: mattermost

postgresql

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mattermost-postgresql
spec:
  storageClassName: mattermost-postgresql
  capacity:
    storage: 10Gi # <- 事前準備で作成した compute disk のサイズ
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    pdName: mattermost-postgresql # <- 事前準備で作成した compute disk の名前
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgresql
  namespace: mattermost
spec:
  storageClassName: mattermost-postgresql
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql
  namespace: mattermost
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      name: postgresql
      labels:
        app: postgresql
        node: management
    spec:
      containers:
        - name: postgresql
          image: postgres:9.5.6-alpine
          env:
            - name: POSTGRES_USER
              valueFrom:
                configMapKeyRef:
                  name: postgresql
                  key: user
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgresql
                  key: password
            - name: POSTGRES_DB
              valueFrom:
                configMapKeyRef:
                  name: postgresql
                  key: db-name
            - name: PGDATA
              value: /var/lib/postgresql/data/pgdata
          ports:
            - name: postgres
              containerPort: 5432
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgresql
      volumes:
        - name: postgresql
          persistentVolumeClaim:
            claimName: postgresql
---
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  namespace: mattermost
spec:
  ports:
    - name: postgres
      port: 5432
      targetPort: postgres
  selector:
    app: postgresql

mattermost server app

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mattermost-app
  namespace: mattermost
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mattermost-app
  template:
    metadata:
      name: mattermost-app
      labels:
        app: mattermost-app
        node: management
    spec:
      containers:
        - name: mattermost-app
          image: mattermost/mattermost-prod-app:5.20.1
          env:
            - name: DB_HOST
              value: "postgresql"
            - name: DB_PORT_NUMBER
              value: "5432"
            - name: MM_USERNAME
              valueFrom:
                configMapKeyRef:
                  name: postgresql
                  key: user
            - name: MM_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgresql
                  key: password
            - name: MM_DBNAME
              valueFrom:
                configMapKeyRef:
                  name: postgresql
                  key: db-name
          ports:
            - name: mattermost-app
              containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: mattermost-app
  namespace: mattermost
spec:
  ports:
    - name: mattermost-app
      port: 8000
      targetPort: mattermost-app
  selector:
    app: mattermost-app

nginx

deploymentは割愛しますが、 mattermost-app serviceに対してproxyするnginxのDockerを作成して、デプロイします。
secretでデプロイしたtlsの設定ファイルを使用してSSLを有効にします。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: mattermost
spec:
  type: LoadBalancer
  loadBalancerIP: <XXX.XXX.XXX.XXX> # <- 事前準備で作成した外部IPアドレスの値
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https
  selector:
    app: nginx

これらのdeploy後に、内部DNSにAレコードを追加してデプロイ完了です。

初回アクセス時に最初のユーザーを作成できます(自動的にadminになりました)。
ユーザー作成後に、システムコンソール画面に遷移できますので、そこから以下を対応しました。

  • ENVIRONMENT > SMTPの設定を行う
    • sendgridの設定を行い、mattermostからメールを送信できるように設定しました。(とりあえず、モバイルアプリへのpushが対応できるまではメールで対応します)
  • ENVIRONMENT > Web Serverの設定を行う
    • Site URLおよびListen Addressを修正しました。

以上になります。