概要
私は現在、タスク管理の目的でRedmineというプロジェクト管理ツールを使っています。 Redmineは自分のサーバに入れて動かして使うもので、私は現在Kubernetes上で動かしています。
今回は、RedmineをKubernetesで動かす方法について紹介します。
環境
- Kubernetes 1.14
- Redmine 4.0
イメージと設定について
RedmineのイメージはDocker Hubで公開されている公式イメージを使用します。 通常Redmineの設定として代表的なものにデータベースの設定がありますが、これはファイルの編集によって行います。しかし、公式イメージでは環境変数から設定できるようになっているのでそれを使って設定をします。
また、Redmineにはメールを送る機能があり、そのための設定をファイルとして配置することで使うことができるようになります。
その他にもアップロードしたファイルなどはVolumeを使ってマウントして永続化する必要があります。
今回は以上の設定も合わせてします。
Volumeの設定
最初にアップロードしたファイルを永続化するVolumeの設定をします。
どのようなVolumeを使うかで少し設定が変わるのですが、今回はNFSを使った設定を次に書きます。
apiVersion: v1
kind: PersistentVolume
metadata:
name: redmine-files-pv
labels:
name: redmine-files-pv
spec:
capacity:
storage: "100Gi"
accessModes:
- ReadWriteMany
nfs:
server: xxx
path: xxx
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redmine-files-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: "100Gi"
selector:
matchLabels:
name: redmine-files-pv
Volumeの設定には、PersistentVolumeとPersistentVolumeClaimを使用しました。 また、100GBの容量を確保しました。ここはそれぞれの環境で適切なものを書きましょう。
データベース等の設定
データベースの設定は、セキュリティのためにSecretを使っています。
apiVersion: v1
kind: Secret
metadata:
name: redmine-appsettings
type: Opaque
data:
secret_key_base: xxx
db_host: xxx
db_name: xxx
db_username: xxx
db_password: xxx
内容としては、secret_key_baseにはセキュリティのために使われるsecret_keyを、db_hostにはデータベースへの接続のためのホスト、db_nameにはデータベース名、db_usernameにはデータベースに接続するためのユーザ名、db_passwordにはデータベースに接続するためのパスワードをBASE64でエンコードしたものを書きます。
メールサーバの設定
メールサーバの設定は、環境変数でできないので、ConfigMapを使ってファイルとしてマウントしてそれをコンテナの作成時に適切な場所へコピーして使うというようにしています。
apiVersion: v1
kind: ConfigMap
metadata:
name: redmine-configuration
data:
configuration.yml: |
default:
email_delivery:
delivery_method: :smtp
smtp_settings:
enable_starttls_auto: true
address: "smtp.gmail.com"
port: 587
domain: "smtp.gmail.com"
authentication: :plain
user_name: "[email protected]"
password: "password"
設定例として、gmailを使う方法を書きました。 それぞれの環境に合わせて書き換えてください。
Redmineのデプロイ
設定を終えたので、Redmineをデプロイします。
Redmineのデプロイでは、Deploymentを使います。
apiVersion: apps/v1
kind: Deployment
metadata:
name: redmine
labels:
app: redmine
spec:
selector:
matchLabels:
app: redmine
template:
metadata:
labels:
app: redmine
spec:
containers:
- image: redmine:4.0.3
name: redmine
command: ['sh', '-c']
args: ['cp /usr/src/config/configuration.yml /usr/src/redmine/config/configuration.yml && /docker-entrypoint.sh rails server -b 0.0.0.0']
env:
- name: REDMINE_SECRET_KEY_BASE
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: secret_key_base
- name: REDMINE_DB_POSTGRES
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: db_host
- name: REDMINE_DB_DATABASE
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: db_name
- name: REDMINE_DB_USERNAME
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: db_username
- name: REDMINE_DB_PASSWORD
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: db_password
volumeMounts:
- name: redmine-files-persistent-storage
mountPath: /usr/src/redmine/files
- name: configuration
mountPath: /usr/src/config
volumes:
- name: redmine-files-persistent-storage
persistentVolumeClaim:
claimName: redmine-files-pvc
- name: configuration
configMap:
name: redmine-configuration
今回、データベースとしてPostgreSQLを使う予定なので、環境変数としてREDMINE_DB_POSTGRESに値を設定しています。 MySQLなどの別のデータベースを使う場合はそれに合わせて環境変数の名前を変える必要があります。 また、今回データベースはすでに用意されているものとします。なので、PostgreSQLの用意については説明しません。
重要な部分として、commandoとargsを使って、ConfigMapでマウントしたファイルをcpコマンドで適切な場所にコピーしています。 これで、メールサーバの設定ができていることになります。
アクセスについて
Redmineへのアクセスのために、Serviceを用意します。
apiVersion: v1
kind: Service
metadata:
labels:
app: redmine
name: redmine
namespace: redmine
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30000
protocol: TCP
selector:
app: redmine
Serviceについてはあくまでひとつの例です。環境によって書き換えてください。 この例では、http://nodeのIP:30000 にアクセスすればRedmineを使うことができます。
さいごに
これで、RedmineをKubernetesで動かすことができるようになりました。
同じようなことをやりたいと思っている人にとって、参考になれば幸いです。