EKSでMattermostを構築した話：4-2. Mattermostのインストール(helm適用編)

## これまでの復習
- EKSでMattermostを構築ということで少しずつ進めてきました。

1.  [EKSでMattermostを構築した話：0.概要編 - Qiita](https://qiita.com/tnagano1981/items/555301cecd3ed309fa43)
1.  [EKSでMattermostを構築した話：1. VPC作成編 - Qiita](https://qiita.com/tnagano1981/items/75408d509c0660408c97)
1.  [EKSでMattermostを構築した話：2. EKSクラスター作成編 - Qiita](https://qiita.com/tnagano1981/items/fc5d96ddf9a3b5c4fb03)
1.  [EKSでMattermostを構築した話：3-1. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール編 - Qiita](https://qiita.com/tnagano1981/items/c91d27fa2e286a96b6ff)
1. [EKSでMattermostを構築した話：3-2. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール編 - Qiita](https://qiita.com/tnagano1981/items/b477f3a6a21038b76db2)
1. [EKSでMattermostを構築した話：4-1. Mattermostのインストール(helm理解編) - Qiita](https://qiita.com/tnagano1981/items/9c36cf9f0a6196fcf865)
1. Mattermostのインストール(helm適用編) ← `今回はここ`
1. Mattermost Configの設定

## 今回作成するもの
- Mattermostアプリ
    - 前回でhelmの便利さを理解できたので、次はhelmを利用して実際にMattermost(チャットアプリ)を利用できるようにしていきます。

## Mattermostをhelm install
- ということで早速インストールをしていきます。
- で、インストールだけであれば実は以下のコマンドを実行するだけで完了です。
    - (注)以下コマンドで作成された構成が最終形態ではないので、ここではローカルのPC上にhelm installしています
    - 参考：[Windows10にDocker for WindowsでKubernetesを使ってみる - Qiita](https://qiita.com/tnagano1981/items/7a4a7410a2123edfaa23)

```
helm install --generate-name mattermost/mattermost-team-edition --set mysql.mysqlUser=sampleUser --set mysql.mysqlPassword=samplePassword
```

- 上記コマンドを実行すると以下のようにレスポンスがあります。

```
$ helm install --generate-name mattermost/mattermost-team-edition --set mysql.mysqlUser=sampleUser --set mysql.mysqlPassword=samplePassword
NAME: mattermost-team-edition-1604794691
LAST DEPLOYED: Sun Nov  8 09:18:12 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
You can easily connect to the remote instance from your browser. Forward the webserver port to localhost:8065

- kubectl port-forward --namespace default $(kubectl get pods --namespace default -l "app.kubernetes.io/name=mattermost-team-edition,app.kubernetes.io/instance=mattermost-team-edition-1604794691" -o jsonpath='{ .items[0].metadata.name }') 8080:8065



To expose Mattermost via an Ingress you need to set host and enable ingress.

helm install --set host=mattermost.yourdomain.com --set ingress.enabled=true stable/mattermost-team-edition



WARNING:
--------

Every `helm upgrade` will generate a new set of keys unless it is set manually like this:

configJSON:
  EmailSettings:
    InviteSalt: xHapfJOG3LMFuOEqKhmB0JOi33w4IosO
  FileSettings:
    PublicLinkSalt: onBRMAQ7Y10qNfg18HyrMFHEzkBM35Mm
  SqlSettings:
    AtRestEncryptKey: QW87SR3D8sjpibppi6CYW2GJYRRWIaqI
```

- deploymentを確認します

```
$ kubectl get deploy
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
mattermost-team-edition-1604794691         1/1     1            1           2m5s
mattermost-team-edition-1604794691-mysql   1/1     1            1           2m5s
```

- podを確認します

```
$ kubectl get pod
NAME                                                        READY   STATUS    RESTARTS   AGE
mattermost-team-edition-1604794691-68fbb9568-krlwt          1/1     Running   0          2m11s
mattermost-team-edition-1604794691-mysql-84d7db4588-dbhlm   1/1     Running   0          2m11s
```

- Mattermostの機能を提供するpodと、投稿などを保存するmysqlのpodが作成されています。
    - でも、この構成はあまり実用的ではなく、今回求めている構成ではないんです。

### どこが実用的ではないのか？
- まず上記の構成では、Mattermostのpodもmysqlのpodも全部EKSクラスタを構成している2台のEC2上に作成されています。データの永続性という観点で見ると、EC2がオートスケーリングで増えたり減ったりした際や、podが消えてしまった際などには、データも消えてしまうのでは？という不安がでてきます。
    - なのでデータベースは外部に切り出したいです。特に今回はせっかくAWS上に構築しているので、AWSのマネージドサービス(RDS)を利用したいです。
    - あとMattermostのpodが利用するデータ保存領域もデータベースと同様の考えをすれば、外部に切り出したいですよね。今回ここは`S3にデータを保存する`というMattermost自体の機能があったのでそれを利用することで実現しています。

### helm chartsの編集
- そうなってくるとhelm hub上にあるchartsを単純にインストールするだけでは自分たちが求める内容を満たすことはできない、ということになってきます。
    - そこで`helm chartsの編集`が必要になってくるのです。
- で、helm chartsはすでに固定された内容でhelm hub上にアップロードされてしまっています。とはいえ最初からhelm chartsを作るのもとても面倒です。
    - ということで、アップロードされているhelm chartsを手元の環境にダウンロードする、ということから始めていきましょう。以下のコマンドでダウンロードします。

```
$ helm fetch mattermost/mattermost-team-edition
```

- そうすると`mattermost-team-edition-3.13.0.tgz`がダウンロードされているので、これを解凍していきます。そしてディレクトリ構成を見てみるとこんな感じになっています。

```
$ tree .
.
└── mattermost-team-edition
    ├── Chart.yaml
    ├── README.md
    ├── charts
    │   └── mysql
    │       ├── Chart.yaml
    │       ├── README.md
    │       ├── templates
    │       │   ├── NOTES.txt
    │       │   ├── _helpers.tpl
    │       │   ├── configurationFiles-configmap.yaml
    │       │   ├── deployment.yaml
    │       │   ├── initializationFiles-configmap.yaml
    │       │   ├── pvc.yaml
    │       │   ├── secrets.yaml
    │       │   ├── serviceaccount.yaml
    │       │   ├── servicemonitor.yaml
    │       │   ├── svc.yaml
    │       │   └── tests
    │       │       ├── test-configmap.yaml
    │       │       └── test.yaml
    │       └── values.yaml
    ├── ci
    │   ├── default-values.yaml
    │   └── extra-values.yaml
    ├── requirements.lock
    ├── requirements.yaml
    ├── templates
    │   ├── NOTES.txt
    │   ├── _deprecations.tpl
    │   ├── _helpers.tpl
    │   ├── _warnings.tpl
    │   ├── deployment.yaml
    │   ├── ingress.yaml
    │   ├── pvc-plugins.yaml
    │   ├── pvc.yaml
    │   ├── route.yaml
    │   ├── secret-config.yaml
    │   ├── service.yaml
    │   └── tests
    │       ├── mattermost-config-test.yaml
    │       └── mattermost-test.yaml
    └── ★values.yaml

8 directories, 35 files
```

- このあと変更していくのは、★をつけた`values.yaml`になります。

### values.yamlの変更点
- データを消失させないために、S3と連携させる部分
- データベースを切り出すために、RDSと連携させる部分
- Mattermostユーザーがパスワードを忘れた際に再設定をさせるために、メールサーバ(今回はAmazon SES)と連携させる部分
- Mattermostのプラグイン機能を実現するために、共有ストレージ(Amazon EFS)と連携させる部分
- アプリケーションロードバランサーを構築するために、ALBと連携させる部分
- ALBのDNS名を自動的に指定したFQDNと紐付けるために、Route53と連携させる部分
- その他色々
    - ローリングアップデート設定、etc、、、

- また一部、values.yaml以外のファイルも変更する必要があったりします。この辺りは、以下の辺りで触れている事前にセットアップしておいたツールとの連携で必要になってくる設定です。
    -   [EKSでMattermostを構築した話：3-1. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール編 - Qiita](https://qiita.com/tnagano1981/items/c91d27fa2e286a96b6ff)
    -   [EKSでMattermostを構築した話：3-2. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール編 - Qiita](https://qiita.com/tnagano1981/items/b477f3a6a21038b76db2)


## まとめ
- helm hub上に用意されているhelm chartsでは、自分たちの作りたい内容と比べて足りない箇所がある、、、ということは往々にしてあることだと思います。
- 次からはその解決のために`values.yamlの変更`をしていくわけですが、上記でも記載したように`一部はvalues.yaml以外のファイルも変更`していきます。本当はここを`values.yamlの変更`のみで対応できるようにするのが良いのだと考えています。
    - おそらく、そういう時に必要になってくるのが`Kustomize`などのツールになってくるのでしょう。
    - とはいえ、最初にhelmのみで色々と試行錯誤をしておくことで、`Kustomize`の便利さやその使い所などもよく理解できるようになると思うので、ここはひとまずhelmでの構築を続けて最終形態にまで、もっていきたいと考えています。
    - 参考：[Kustomizeを利用してk8sの構成管理をシンプルにやってみる - CADDi Tech Blog](https://caddi.tech/archives/427)


## 関連記事
-   [EKSでMattermostを構築した話：0.概要編 - Qiita](https://qiita.com/tnagano1981/items/555301cecd3ed309fa43)
-   [EKSでMattermostを構築した話：1. VPC作成編 - Qiita](https://qiita.com/tnagano1981/items/75408d509c0660408c97)
-   [EKSでMattermostを構築した話：2. EKSクラスター作成編 - Qiita](https://qiita.com/tnagano1981/items/fc5d96ddf9a3b5c4fb03)
-   [EKSでMattermostを構築した話：3-1. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール編 - Qiita](https://qiita.com/tnagano1981/items/c91d27fa2e286a96b6ff)
-   [EKSでMattermostを構築した話：3-2. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール編 - Qiita](https://qiita.com/tnagano1981/items/b477f3a6a21038b76db2)
-   [EKSでMattermostを構築した話：4-1. Mattermostのインストール(helm理解編) - Qiita](https://qiita.com/tnagano1981/items/9c36cf9f0a6196fcf865)