概要

チャットツールであるMattermostをKubernetesに配置する方法を紹介します。

環境

  • Kubernetes 1.8

方法

Mattermostは、Podを作り直したりしたときにデータを残しておくために永続化の設定をする必要があります。

永続化しておくデータとして、投稿されたファイルやMattermostの設定があります。

さらにその前段階として、データベースを用意しておく必要があります。

以上のことから、流れとしてはデータベースの作成、ストレージの用意、Mattermostの配置のようになります。

データベースの作成

Mattermostでは、データベースとしてMySQLかPostgreSQLを選べます。

今回は、PostgreSQLの方が推奨されているということで、PostgreSQLでデータベースを用意するとします。

データベースの作成についてはここでは扱いません。

次の作業へ進む前に、PostgreSQLでデータベースを作成し、そのデータベース名、PostgreSQLにアクセスするためのユーザ名とパスワードを覚えておいてください。

ストレージの用意

ストレージの用意のために、PersistentVolumeとPersistentVolumeClaimを使います。

ここでは、nfsを使う場合の例を示しますが、他のものを使うのであれば適当な値で書き換えてください。

投稿されたファイルを置くためのストレージと設定情報を置くためのストレージの2つのPersistentVolumeを用意します。

最初に、投稿されたファイルを置くためのストレージを用意するためのPersistentVolumeのyamlです。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mattermost-pv
  labels:
    name: mattermost-pv
spec:
  capacity:
    storage: "5Gi"
  accessModes:
    - ReadWriteOnce
  nfs:
    server: ***
    path: ***

PersistentVolumeClaimのyamlです。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mattermost-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "5Gi"
  selector:
    matchLabels:
      name: mattermost-pv

次に、設定情報を置くためのストレージを用意するPersistentVolumeのyamlです。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mattermost-config-pv
  labels:
    name: mattermost-config-pv
spec:
  capacity:
    storage: "1Gi"
  accessModes:
    - ReadWriteOnce
  nfs:
    server: ***
    path: ***

PersistentVolumeClaimのyamlです。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mattermost-config-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "1Gi"
  selector:
    matchLabels:
      name: mattermost-config-pv

これらのyamlを元にストレージを用意しましょう。

Mattermostの配置

では、Mattermostの配置します。

配置はDeploymentでします。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mattermost
  labels:
    app: mattermost
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mattermost
  template:
    metadata:
      labels:
        app: mattermost
    spec:
      containers:
        - image: mattermost/mattermost-prod-app:latest
          name: mattermost
          env:
            - name: DB_HOST
              value:
            - name: MM_USERNAME
              value:
            - name: MM_PASSWORD
              value:
            - name: MM_DBNAME
              value:
          volumeMounts:
            - name: mattermost-persistent-storage
              mountPath: /mattermost/data
            - name: mattermost-config-persistent-storage
              mountPath: /mattermost/config
      volumes:
        - name: mattermost-persistent-storage
          persistentVolumeClaim:
            claimName: mattermost-pvc
        - name: mattermost-config-persistent-storage
          persistentVolumeClaim:
            claimName: mattermost-config-pvc

追加しなければならない情報として、環境変数としてデータベースに関する設定を書く必要があります。

DB_HOSTには、PostgreSQLにアクセスするためのホスト名、MM_USERNAMEにはユーザ名、MM_PASSWORDにはユーザ名に対するパスワード、MM_DBNAMEにはデータベース名を書きましょう。

これを元に、MattermostのDeploymentを作成すれば、Mattermostが動作します。

Serviceの用意

外部からアクセスできるようにするには、Serviceを用意する必要があります。

ここでは、Kubernetes内部に公開するClusterIPの例を示します。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: mattermost
  name: mattermost
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 8065
      targetPort: 8065
      protocol: TCP
  selector:
    app: mattermost

Mattermostは8065番ポートで公開されているので、そのポートを公開します。

まとめ

当初、設定ファイルの永続化をしておらず、Mattermostにアクセスして設定を終えた後にコンテナを一度作り直したら、設定が消えていたということがありました。

設定に関してもデータの永続化を忘れないようにしましょう。