2020/05/26
SlackライクなOSSチャットツール「Mattermost」をGKEで導入する
概要
Titleの通りですが、OSSのチャットツールであるMattermostをkubernetes上にデプロイをして運用を開始しました。
人数が多くなると、Slackはややコストかさみますし、セキュリティ的な観点からも自前のチャットツールの方がベターかなということで導入を決めました。
見た目や機能はほとんどSlackと一緒で使いやすいです。
Mattermost ≒ Slackのオンプレ
といった感じです👍
実施事項
こちらの記事で作ったGKEクラスター上にMattermost serverをdeployしました。
モバイルアプリについてはまだ対応していません。後々時間作って、対応しようかなと思っています。
参考になったページ
- GitHub - mattermost/mattermost-docker: Dockerfile for mattermost in production
- mattermost/mattermost-prod-app - Docker Hub
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を修正しました。
以上になります。
関連する記事
[小〜中規模向け]GKEにTiDBをデプロイする
MySQL互換のNewSQLであるTiDBをGKEにデプロイしてみました。
NATS JetStream Controllerを使ってNATSをGKEにデプロイする
helm chartのnackを使って、NATS JetStreamサーバーをデプロイして、Stream/Consumerをk8sリソースとして管理する
GKEにDragonflydbをデプロイする
redis互換のdragonflydbをGKEにデプロイしました
[GKE]Kafka Strimziをアップグレードする
GKEにデプロイしているKafka Strimzi 0.26.0を0.30.0にアップグレードする