オープンソースのチャットシステムであるMattermostはSlackの代替として使われることが多いですが、Kubernetes上に構築することもできます。
この記事では、ローカルで構築したKubernetes上にMattermostを構築する方法について説明します。今回はKubernetesのDeployment、Service、Ingressを使ってMattermostを構築します。
Mattermostは、社内ネットワークなどネットワークの制約が多い場合に、自前で構築することができ、Slackと同様の機能を提供してくれるので便利です。
環境
今回は次の環境にMattermostを構築します。
- Windows 11 Pro
- Ubuntu 22.04(WSL2)
- Kubernetes v1.27.3(KinDにて構築)
- Nginx Ingress Controller
上記の環境構築の方法は下記が参考になります。
Mattermostの構築手順
次の手順でMattermostを構築します。
- NameSpaceの作成
- MattermostをデプロイするためのNameSpaceを作成します。
- DBの構築
- マニフェストファイルの作成
- DBをKubernetesにデプロイ
- Mattermostの構築
- マニフェストファイルの作成
- MattermostをKubernetesにデプロイ
- Mattermostの公開
- Ingressの作成
- ブラウザにて確認
NameSpaceの作成
まずは、MattermostをデプロイするためのNameSpaceを作成します。次の手順で作成します。
- NameSpaceの作成
まず、MattermostをデプロイするためのNameSpaceを作成します。
コマンド実行
kubectl create namespace mattermost
DBの構築
- ディレクトリの作成
まず、Mattermostのマニフェストファイルを保存するディレクトリを作成します。
コマンド実行
mkdir mattermost
cd mattermost
- マニフェストファイルの作成(Deployment)
次に、Mattermostのマニフェストファイルを作成します。mattermost
ディレクトリ内にdb
ディレクトリを作成してdeployment.yaml
という名前でファイルを作成し、次の内容を記述します。
mattermost/db/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mattermost-db
namespace: mattermost
labels:
app: mattermost
tier: db
spec:
replicas: 1
selector:
matchLabels:
app: mattermost
tier: db
template:
metadata:
labels:
app: mattermost
tier: db
spec:
containers:
- name: mattermost-db
image: postgres:13
env:
- name: POSTGRES_USER
value: mattermost
- name: POSTGRES_PASSWORD
value: mattermost
- name: POSTGRES_DB
value: mattermost
ports:
- containerPort: 5432
今回、DBにはPersistentVolumeを使っていません。本番環境では、PersistentVolumeを使うことをお勧めします。またDBのパスワードはmattermost
としていますが、本番環境では適切なパスワードを設定してSecretリソースを使うことをお勧めします。
- DBのServiceの作成
次に、DBのServiceのマニフェストファイルを作成します。mattermost/db
ディレクトリの中にservice.yaml
という名前でファイルを作成し、次の内容を記述します。
mattermost/db/service.yaml
apiVersion: v1
kind: Service
metadata:
name: mattermost-db
namespace: mattermost
labels:
app: mattermost
tier: db
spec:
ports:
- port: 5432
protocol: TCP
selector:
app: mattermost
tier: db
Mattermostのアプリ側からDBにアクセスするために、Headless Serviceを作成しています。
- DBのデプロイ
次のコマンドでDBをKubernetesにデプロイします。
コマンド実行
kubectl apply -f db/
- DBの確認
次のコマンドでDBのPodとServiceが正常に作成されていることを確認します。
コマンド実行
kubectl get pod -n mattermost
kubectl get svc -n mattermost
次のように表示されれば、DBのPodとServiceが正常に作成されています。
$ kubectl get pod -n mattermost
NAME READY STATUS RESTARTS AGE
mattermost-db-79d4f7f7bd-twzxq 1/1 Running 0 62s
$ kubectl get svc -n mattermost
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mattermost-db ClusterIP 10.96.80.31 <none> 5432/TCP 64s
これで、DBの構築が完了しました。
Mattermostの構築
- マニフェストファイルの作成(Deployment)
次に、Mattermostのマニフェストファイルを作成します。mattermost
ディレクトリ内にapp
ディレクトリを作成してdeployment.yaml
という名前でファイルを作成し、次の内容を記述します。
mattermost/app/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mattermost-app
namespace: mattermost
labels:
app: mattermost
tier: app
spec:
replicas: 1
selector:
matchLabels:
app: mattermost
tier: app
template:
metadata:
labels:
app: mattermost
tier: app
spec:
containers:
- name: mattermost-app
image: mattermost/mattermost-team-edition:8.1.9
env:
- name: MM_USERNAME
value: "admin"
- name: MM_PASSWORD
value: "admin"
- name: MM_SQLSETTINGS_DATASOURCE
value: "postgres://mattermost:mattermost@mattermost-db:5432/mattermost?sslmode=disable&connect_timeout=10"
ports:
- containerPort: 8065
- MattermostのServiceの作成
次に、MattermostのServiceのマニフェストファイルを作成します。mattermost/app
ディレクトリの中にservice.yaml
という名前でファイルを作成し、次の内容を記述します。
mattermost/app/service.yaml
apiVersion: v1
kind: Service
metadata:
name: mattermost-app
namespace: mattermost
labels:
app: mattermost
tier: app
spec:
ports:
- port: 8065
targetPort: 8065
selector:
app: mattermost
tier: app
- Mattermostのデプロイ
次のコマンドでMattermostをKubernetesにデプロイします。
コマンド実行
kubectl apply -f app/
- Mattermostの確認
次のコマンドでMattermostのPodとServiceが正常に作成されていることを確認します。
コマンド実行
kubectl get pod,svc -n mattermost
次のように表示されれば、MattermostのPodとServiceが正常に作成されています。
NAME READY STATUS RESTARTS AGE
pod/mattermost-app-7f8f8f7f8-7f8f8f7f8 1/1 Running 0 1m
pod/mattermost-db-7f8f8f7f8-7f8f8f7f8 1/1 Running 0 1m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mattermost-app ClusterIP
service/mattermost-db ClusterIP
これで、Mattermostの構築が完了しました。
Mattermostの公開
- Ingressの作成
次に、Mattermostを公開するためのIngressのマニフェストファイルを作成します。mattermost
ディレクトリ内にingress.yaml
という名前でファイルを作成し、次の内容を記述します。
mattermost/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mattermost-ingress
namespace: mattermost
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
ingressClassName: nginx
rules:
- host: mattermost.example.com
http:
paths:
- backend:
service:
name: mattermost-app
port:
number: 8065
path: /
pathType: Prefix
- Ingressのデプロイ
次のコマンドでIngressをKubernetesにデプロイします。
コマンド実行
kubectl apply -f mattermost/ingress.yaml
- ブラウザにて確認
次に、ブラウザでhttp://mattermost.example.com
にアクセスしてMattermostが正常に表示されることを確認します。
これで、Kubernetes上にMattermostを構築することができました。
まとめ
この記事では、Kubernetes上にMattermostを構築する方法について説明しました。MattermostをKubernetes上に構築することで、Mattermostをスケーラブルに運用することができます。ぜひ、参考にしてみてください。