概要

私は現在、タスク管理の目的で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で動かすことができるようになりました。

同じようなことをやりたいと思っている人にとって、参考になれば幸いです。