株式会社 日立製作所の茂木です。今回は Keycloak の Docker Container,Helm Chart, Operator を調査してみました。
Docker Image
Keycloak の公式 Docker Image は jboss/keycloak、Image 作成のための Dockerfile やスクリプトはhttps://github.com/keycloak/keycloak-containersで公開されています。このイメージは柔軟な設定変更へ対応するために、DB のアドレスやユーザ名/パスワードといった一般的な設定項目だけでなく、様々なパラメータや機能が搭載されています。今回はこのうちのいくつかを紹介します。
Running custom scripts on startup
Wildfly の CLI スクリプトやシェルスクリプトの実行を/opt/jboss/startup-scripts
に配置すると、Keycloak の起動前にそれらのスクリプトが実行されるようになります。イメージのパラメータとして公開されていない設定などを変更する際に用途に有用です。
Enable some metrics
KEYCLOAK_STATISTICS
に値を指定すると、データベースや HTTP リクエストといったメトリクス情報が取得できるようになります。「Keycloak でメトリクス情報の取得」で紹介した Keycloak のメトリクスではなく、Wildfly が収集するメトリクス情報を取得できるようになります。
Helm Chart
Kubernetes 上では、Helm を利用してアプリケーションをデプロイすることが主流になっているかと思います。Keycloak の Helm チャートも公開されていますが、stable/keycloak
で提供されているチャートは DEPRECATED となっていて、バージョンも 5.0.0 から更新されていません。説明にもあるように、codecentric のリポジトリを利用しましょう。
$ helm repo add codecentric https://codecentric.github.io/helm-charts
$ helm install keycloak codecentric/keycloak
ちなみにこの Helm チャートを利用すると、Keycloak は Deployment
ではなく StatefulSet
でデプロイされます。なぜStatefulSet
を利用しているかは、Why StatefulSet?で説明されています。
Operator
Kubernetes 上にデプロイする方法としては、Operatorを利用するものもあります。Keycloak の Operator はhttps://github.com/keycloak/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を Clone し、必要な CRD や RoleBinding などをインストールしていきます。Makefile が用意されているので、make cluster/prepare
を実行するだけで必要なリソースが keycloak という namespace に作成されます。
$ 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
をつけてデプロイします。
$ kubectl apply -n keycloak -f deploy/operator.yaml
deployment.apps/keycloak-operator created
Keycloak Operator の Pod が起動したら、Keycloak のリソースを作成してみます。deploy/examples/keycloak/
にサンプルの定義があるのでそれを利用します。
$ 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)が利用されていたりなどで、現時点ではうまく動作しませんでした。
まだ開発が始まったばかりなので、これからの進化に期待していきたいと思います。
サンプル定義の中身
最後にサンプル定義の中身を見てみます。下記のファイルはdeploy/examples/keycloak/rhsso.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 にあるように、プラグインの定義ができる点です。ここで指定されているのはこの記事で紹介したkeycloak-metrics-spi
です。この定義を見る限りでは複数のプラグインが設定できるようです。
また、2 にあるようにprofile
という項目で Keycloak と Red Hat SSO のデプロイを切り替えることができるようです。
まとめ
Keycloak のコンテナ周りについて調査しました。Operator は将来有望ですが、現時点ではまだまだ機能が足りないと感じます。当分は Helm を利用することになりそうです。
この Advent Calendar は去年からの取り組みですが、今年は社内で広く参加者を募集してみました。また、(株)日立製作所 サービスコンピューティング研究部 Advent Calendarの開催、やOpenChain Japan WG Advent Calendarへの参加など、社内でも情報発信の文化が広まってきたように思います。今後も様々な情報を発信していこうと思っていますので、よろしくお願いします。
最後になりますが、記事を掲載していただいた方、Advent Calendar の公開に協力していただいた方、そして購読していただいた方、ありがとうございました。