EKSにhelmでredmineを構築

説明しようと思ったらほとんど他の記事で説明されていたので、説明があるものは前提に書いておきます。
あとはTLSとか、バックアップとか気になって調べたことを記載しておきます。

# 前提
- EKS構築済み
    - 本記事ではeksctlを利用して以下のように作成
    - `eksctl create cluster --name=cluster --nodes=3 --node-type=t2.medium --ssh-public-key=/Users/XXXX/.ssh/id_rsa.pub`
- HelmをEKSにinstall済み
    - [Using Helm to install applications onto Amazon EKS – Haimo Zhang – Medium](https://medium.com/@zhaimo/using-helm-to-install-application-onto-aws-eks-36840ff84555)
- StorageClass設定済み
    - redmineのストレージに使用します。下記に説明があったのでこちらを参考ください。
    - [ストレージクラス - Amazon EKS](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/storage-classes.html)

# helm install
設定できるパラメータは[charts/stable/redmine at master · helm/charts](https://github.com/helm/charts/tree/master/stable/redmine)を参照ください。
今回は全部デフォルト設定です。

```sh
⇒ helm install --name release-test --namespace redmine stable/redmine
NAME:   release-test
LAST DEPLOYED: Sun Nov 11 13:27:46 2018
NAMESPACE: redmine
STATUS: DEPLOYED

RESOURCES:
==> v1/Secret
NAME                  TYPE    DATA  AGE
release-test-mariadb  Opaque  2     1s
release-test-redmine  Opaque  2     1s

==> v1/ConfigMap
NAME                        DATA  AGE
release-test-mariadb        1     1s
release-test-mariadb-tests  1     1s

==> v1/PersistentVolumeClaim
NAME                  STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
release-test-redmine  Pending  gp2     1s

==> v1/Service
NAME                  TYPE          CLUSTER-IP     EXTERNAL-IP  PORT(S)       AGE
release-test-mariadb  ClusterIP     10.100.63.141  <none>       3306/TCP      1s
release-test-redmine  LoadBalancer  10.100.80.126  <pending>    80:30727/TCP  1s

==> v1beta1/Deployment
NAME                  DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
release-test-redmine  1        1        1           0          1s

==> v1beta1/StatefulSet
NAME                  DESIRED  CURRENT  AGE
release-test-mariadb  1        1        1s

==> v1/Pod(related)
NAME                                   READY  STATUS   RESTARTS  AGE
release-test-redmine-568fbf5468-99ph2  0/1    Pending  0         1s
release-test-mariadb-0                 0/1    Pending  0         1s


NOTES:
1. Get the Redmine URL:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace redmine -w release-test-redmine'


  export SERVICE_IP=$(kubectl get svc --namespace redmine release-test-redmine --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
  echo "Redmine URL: http://$SERVICE_IP/"

2. Login with the following credentials

  echo Username: user
  echo Password: $(kubectl get secret --namespace redmine release-test-redmine -o jsonpath="{.data.redmine-password}" | base64 --decode)
```

# アクセス
URLを取得してアクセスします。

```sh
⇒   export SERVICE_IP=$(kubectl get svc --namespace redmine release-test-redmine --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")

⇒   echo "Redmine URL: http://$SERVICE_IP/"
Redmine URL: http://a2404a9c0e56a11e8aed90286c631ec0-999150614.us-west-2.elb.amazonaws.com/
```
URLにアクセスするとアクセスができます。

# ログイン
ユーザはデフォルトで「user」です。これはinstall時のパラメータで変更できます。
初期パスワードを以下コマンドで確認しログインします。

```sh
⇒   echo Password: $(kubectl get secret --namespace redmine release-test-redmine -o jsonpath="{.data.redmine-password}" | base64 --decode)
Password: vT4kdNpOkd
```

![スクリーンショット 2018-11-11 14.39.20.png](https://qiita-image-store.s3.amazonaws.com/0/230552/5e8ce1a3-188e-d123-d164-7680bcf97c9d.png)

![スクリーンショット 2018-11-11 14.39.33.png](https://qiita-image-store.s3.amazonaws.com/0/230552/adc719a5-2a0f-9fc9-7845-2310e33fc7c1.png)

無事ログインできました。

# TLSの利用
お気づきだと思いますが、初期設定ではHTTPでのアクセスとなります。HTTPS使いたいですよね。
2018/11/10現在helmのパラメータを確認するとingressを利用したhttps終端しかサポートしていません。EKSだとGKEのようにingressのcontrollerいないのでnginx-controllerとか用意する必要があります。
AWSマスター（？）としてはELBでHTTPS終端したいって思いますよね。Kubernetesでできないことはないのですが（[Services - Kubernetes](https://kubernetes.io/docs/concepts/services-networking/service/#ssl-support-on-aws)）、Helmでは開発者がパラメータとして用意してくれないと使えないのです。リクエストするか、フォークしてカスタマイズするしかないですね、、、、。
ただやろうと思えばサービスで作成されたELBがあるので、それに手動でTLSの終端設定をすることができます。Infrastracture as Codeの考え的にはよくないですが、この辺はまだまだ手動が必要な部分がありますね。。。

# バックアップは？
基本的な作業は「[Redmineのバックアップ](http://guide.redmine.jp/RedmineBackupRestore/)」に書かれています。じゃあKubernetesだとどうなるのでしょうか。

バックアップに含めるべきものは以下の通りです。

- データベース
- 添付ファイル (デフォルトではRedmineのインストールディレクトリ直下の files ディレクトリに保存されています)

## データベース
データベースはmariadbのPodが立っているのでそれを利用してバックアップすることになります。

```sh
# podの確認
⇒ kubectl get -n redmine pod
NAME                                    READY     STATUS    RESTARTS   AGE
release-test-mariadb-0                  1/1       Running   0          1h
release-test-redmine-568fbf5468-99ph2   1/1       Running   0          1h
```

まずは設定の確認から。これはredmine pod（今回だとrelease-test-redmine-568fbf5468-99ph2）上のdatabase.ymlで確認できます。以下のコマンドで確認。

```sh
⇒  kubectl exec -it release-test-redmine-568fbf5468-99ph2 -- cat /bitnami/redmine/conf/database.yml
# Default setup is given for MySQL with ruby1.9.
# Examples for PostgreSQL, SQLite3 and SQL Server can be found at the end.
# Line indentation must be 2 spaces (no tabs).

production:
  adapter: mysql2
  database: bitnami_redmine_z7d08
  host: release-test-mariadb
  username: bn_redmine
  password: f5grDntBC8
  encoding: utf8

development:
  adapter: mysql2
  database: bitnami_redmine_z7d08_development
  host: release-test-mariadb
  username: bn_redmine
  password: f5grDntBC8
  encoding: utf8
```

productionの方を利用します。この情報を元にmariadbのpodに対して以下のコマンドを実行すればdumpが取得できます。作成される場所はkubectl実行ホスト上です。

```sh

⇒ kubectl exec -it release-test-mariadb-0 -- mysqldump -ubn_redmine -pf5grDntBC8 -hrelease-test-mariadb bitnami_redmine_z7d08 > backup.sql
```

## 添付ファイル
これは先ほど確認したredmine podの `bitnami/redmine/files` にあるのでこれをコピーします。

```sh

⇒ kubectl cp redmine/release-test-redmine-568fbf5468-99ph2:bitnami/redmine/files ./files
```

これでkubectlを利用したローカルにファイルを落とせます。便利ですね。

# helm delete
最後に削除方法を記載しておきます。ELBとかEBSが自動で作られているので消し忘れには注意しましょう。

```sh
⇒ helm delete release-test
release "release-test" deleted
```

注意点としては、StorageClassの設定でRetainを選択している場合自動でEBSは消えません。
AWSのコンソールから直接消しましょう。

```sh
⇒ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                                 STORAGECLASS   REASON    AGE
pvc-240077c4-e56a-11e8-aed9-0286c631ec0a   8Gi        RWO            Retain           Released   redmine/release-test-redmine          gp2                      2h
pvc-24082561-e56a-11e8-aed9-0286c631ec0a   8Gi        RWO            Retain           Released   redmine/data-release-test-mariadb-0   gp2                      2h
```

[EC2 Management Console](https://us-west-2.console.aws.amazon.com/ec2/v2/home?region=us-west-2#Volumes:sort=desc:createTime)のEBS画面で該当のEBSを削除しましょう。

# おわりに
EKSでのredmine構築方法と、TLSの現状、バックアップ方法を紹介しました。