Keycloak のコンテナ周りの動向調査

株式会社 日立製作所の茂木です。今回は Keycloak の Docker Container,Helm Chart, Operator を調査してみました。

# Docker Image

Keycloak の公式 Docker Image は [jboss/keycloak](https://hub.docker.com/r/jboss/keycloak)、Image 作成のための Dockerfile やスクリプトは[https://github.com/keycloak/keycloak-containers](https://github.com/keycloak/keycloak-containers)で公開されています。このイメージは柔軟な設定変更へ対応するために、DB のアドレスやユーザ名/パスワードといった一般的な設定項目だけでなく、様々なパラメータや機能が搭載されています。今回はこのうちのいくつかを紹介します。

## [Running custom scripts on startup](https://github.com/keycloak/keycloak-containers/tree/master/server#running-custom-scripts-on-startup)

Wildfly の CLI スクリプトやシェルスクリプトの実行を`/opt/jboss/startup-scripts`に配置すると、Keycloak の起動前にそれらのスクリプトが実行されるようになります。イメージのパラメータとして公開されていない設定などを変更する際に用途に有用です。

## [Enable some metrics](https://github.com/keycloak/keycloak-containers/tree/master/server#enable-some-metrics)

`KEYCLOAK_STATISTICS`に値を指定すると、データベースや HTTP リクエストといったメトリクス情報が取得できるようになります。「[Keycloak でメトリクス情報の取得](https://qiita.com/t-mogi/items/3bac5e45afec8d5b4ed2)」で紹介した Keycloak のメトリクスではなく、Wildfly が収集するメトリクス情報を取得できるようになります。

# Helm Chart

Kubernetes 上では、Helm を利用してアプリケーションをデプロイすることが主流になっているかと思います。Keycloak の Helm チャートも公開されていますが、`stable/keycloak` で提供されているチャートは DEPRECATED となっていて、バージョンも 5.0.0 から更新されていません。説明にもあるように、codecentric のリポジトリを利用しましょう。

```sh
$ helm repo add codecentric https://codecentric.github.io/helm-charts
$ helm install keycloak codecentric/keycloak
```

ちなみにこの Helm チャートを利用すると、Keycloak は `Deployment` ではなく `StatefulSet` でデプロイされます。なぜ`StatefulSet`を利用しているかは、[Why StatefulSet?](https://github.com/codecentric/helm-charts/tree/master/charts/keycloak#why-statefulset)で説明されています。

# Operator

Kubernetes 上にデプロイする方法としては、[Operator](https://coreos.com/operators/)を利用するものもあります。Keycloak の Operator は[https://github.com/keycloak/keycloak-operator](https://github.com/integr8ly/keycloak-operator)で公開されています。

Keycloak, Realm, Client, User および Backup の Custom Resource Definition(CRD)が提供されていて、これらを利用して Keycloak の操作を行えるようになっています。

今回は簡単に Keycloak Operator の導入方法を紹介します。

## 環境

今回は kubernetes v1.17 で動作させてみました。

## Keycloak Operator の導入方法

まずは[https://github.com/keycloak/keycloak-operator](https://github.com/keycloak/keycloak-operator)を Clone し、必要な CRD や RoleBinding などをインストールしていきます。Makefile が用意されているので、`make cluster/prepare`を実行するだけで必要なリソースが keycloak という namespace に作成されます。

```bash
 $ make cluster/prepare
customresourcedefinition.apiextensions.k8s.io/keycloakbackups.keycloak.org created
customresourcedefinition.apiextensions.k8s.io/keycloakclients.keycloak.org created
customresourcedefinition.apiextensions.k8s.io/keycloakrealms.keycloak.org created
customresourcedefinition.apiextensions.k8s.io/keycloaks.keycloak.org created
customresourcedefinition.apiextensions.k8s.io/keycloakusers.keycloak.org created
namespace/keycloak created
role.rbac.authorization.k8s.io/keycloak-operator created
rolebinding.rbac.authorization.k8s.io/keycloak-operator created
serviceaccount/keycloak-operator created
```

次に Operator のイメージをデプロイします。上記で作成された ServiceAccount や RoleBinding は keycloak namespace にあるので、Operator も `-n keycloak` をつけてデプロイします。

```bash
$ kubectl apply -n keycloak -f  deploy/operator.yaml
deployment.apps/keycloak-operator created
```

Keycloak Operator の Pod が起動したら、Keycloak のリソースを作成してみます。`deploy/examples/keycloak/`にサンプルの定義があるのでそれを利用します。

```bash
$ kubectl apply -n keycloak -f deploy/examples/keycloak/keycloak.yaml
keycloak.keycloak.org/example-keycloak created
```

これで、keycloak の StatefulSet および PostgreSQL の Deployment、Service や Ingress が作成されます。ここまではできたのですが、Service の設定に Openshift の拡張([Securing service traffic using service serving certificate secrets](https://docs.openshift.com/container-platform/4.1/authentication/certificates/service-serving-certificate.html))が利用されていたりなどで、現時点ではうまく動作しませんでした。

まだ開発が始まったばかりなので、これからの進化に期待していきたいと思います。

## サンプル定義の中身

最後にサンプル定義の中身を見てみます。下記のファイルは`deploy/examples/keycloak/rhsso.yaml`です。

```yaml
apiVersion: keycloak.org/v1alpha1
kind: Keycloak
metadata:
  name: example-keycloak
  labels:
    app: sso
spec:
  instances: 1
  extensions:
    - https://github.com/aerogear/keycloak-metrics-spi/releases/download/1.0.4/keycloak-metrics-spi-1.0.4.jar #<-- 1
  externalAccess:
    enabled: True
  profile: RHSSO # <--2
```

まず特徴的なのが 1 にあるように、プラグインの定義ができる点です。ここで指定されているのは[この記事](https://qiita.com/t-mogi/items/3bac5e45afec8d5b4ed2)で紹介した`keycloak-metrics-spi`です。この定義を見る限りでは複数のプラグインが設定できるようです。
また、2 にあるように`profile`という項目で Keycloak と Red Hat SSO のデプロイを切り替えることができるようです。

# まとめ

Keycloak のコンテナ周りについて調査しました。Operator は将来有望ですが、現時点ではまだまだ機能が足りないと感じます。当分は Helm を利用することになりそうです。

この Advent Calendar は去年からの取り組みですが、今年は社内で広く参加者を募集してみました。また、[(株)日立製作所 サービスコンピューティング研究部 Advent Calendar](https://qiita.com/advent-calendar/2019/hitachi-research)の開催、や[OpenChain Japan WG Advent Calendar](https://qiita.com/advent-calendar/2019/openchainjapanswg)への参加など、社内でも情報発信の文化が広まってきたように思います。今後も様々な情報を発信していこうと思っていますので、よろしくお願いします。

最後になりますが、記事を掲載していただいた方、Advent Calendar の公開に協力していただいた方、そして購読していただいた方、ありがとうございました。