Redmine
kubernetes

EKSにhelmでredmineを構築

説明しようと思ったらほとんど他の記事で説明されていたので、説明があるものは前提に書いておきます。

あとはTLSとか、バックアップとか気になって調べたことを記載しておきます。


前提


helm install

設定できるパラメータはcharts/stable/redmine at master · helm/chartsを参照ください。

今回は全部デフォルト設定です。

⇒ 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を取得してアクセスします。

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時のパラメータで変更できます。

初期パスワードを以下コマンドで確認しログインします。

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

スクリーンショット 2018-11-11 14.39.33.png

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


TLSの利用

お気づきだと思いますが、初期設定ではHTTPでのアクセスとなります。HTTPS使いたいですよね。

2018/11/10現在helmのパラメータを確認するとingressを利用したhttps終端しかサポートしていません。EKSだとGKEのようにingressのcontrollerいないのでnginx-controllerとか用意する必要があります。

AWSマスター(?)としてはELBでHTTPS終端したいって思いますよね。Kubernetesでできないことはないのですが(Services - Kubernetes)、Helmでは開発者がパラメータとして用意してくれないと使えないのです。リクエストするか、フォークしてカスタマイズするしかないですね、、、、。

ただやろうと思えばサービスで作成されたELBがあるので、それに手動でTLSの終端設定をすることができます。Infrastracture as Codeの考え的にはよくないですが、この辺はまだまだ手動が必要な部分がありますね。。。


バックアップは?

基本的な作業は「Redmineのバックアップ」に書かれています。じゃあKubernetesだとどうなるのでしょうか。

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


  • データベース

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


データベース

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

# 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で確認できます。以下のコマンドで確認。

⇒  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実行ホスト上です。


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


添付ファイル

これは先ほど確認したredmine podの bitnami/redmine/files にあるのでこれをコピーします。


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

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


helm delete

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

⇒ helm delete release-test

release "release-test" deleted

注意点としては、StorageClassの設定でRetainを選択している場合自動でEBSは消えません。

AWSのコンソールから直接消しましょう。

⇒ 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のEBS画面で該当のEBSを削除しましょう。


おわりに

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