Red Hatでソリューションアーキテクトをしている田中司恩(@tnk4on)です。 PodmanではじめるRed Hatのミドルウェア製品シリーズ、今回取り上げる製品は「Red Hat build of Keycloak(RHBK)」です。
(追記:続きの記事を書きました。合わせてお読みください) rheb.hatenablog.com
-目次-
- Red HatがサポートするRed Hat build of Keycloakの構成
- Podmanを使ってRed Hat build of Keycloakでできること
- Red Hat build of Keycloakのコンテナイメージの確認
- PodmanでRed Hat build of Keycloakのコンテナイメージを実行する
- まとめ
Red HatがサポートするRed Hat build of Keycloakの構成
はじめに確認するのはRed Hat build of Keycloakのサポート構成です。しかしこの構成が多岐に渡るので少しややこしいです。 まずは製品ドキュメントを確認するのですが、Red Hat build of Keycloakのサポート構成の詳細についてはKCS(ArticlesやSolutions)に記載があります。 チェック頂きたいのがこの2つのリンクです。
- Red Hat build of Keycloak でサポートされる構成 - Red Hat Customer Portal
- Red Hat build of Keycloak support on 3rd-party Kubernetes environments (EKS, AKS, GKE, xKS, ...) - Red Hat Customer Portal
「Red Hat build of Keycloak support on 3rd-party...」の方は日本語版が古い内容になっているので英語版をリンクしておきます
サポートされる構成をザックリ分けるとこの2つのパターンになります。
- RHELまたはWindowsのホストの上で直接Red Hat build of Keycloakを実行するパターン
- OpenShiftの上でコンテナとして実行するパターン
ここから話しが込み入ってくるのですが、その原因となるのが「OpenShift以外の3rdパーティ製のコンテナ/Kubernetes環境」です。 Red Hatは公式のRed Hat build of Keycloakコンテナイメージを提供していますが、これを使ってサポートされる構成は「OpenShift」で実行する場合のみです。 OpenShift以外の3rdパーティ製のコンテナ/Kubernetes環境でRed Hat提供のRed Hat build of Keycloakコンテナイメージを実行する場合はサポートされません。 また、このRed Hat提供のRed Hat build of KeycloakコンテナイメージをRHEL上のPodmanで動かしてもサポートされません。
え?このシリーズは「Podmanではじめる〜」なんですが、どうすんの?という点は後ほど回答します。 兎にも角にも「Red Hat提供のRed Hat build of KeycloakコンテナイメージがサポートされるのはOpenShiftのみ」と覚えておきましょう。
では、3rdパーティー製のコンテナ/Kuberentes環境ではRed Hat build of Keycloakが使う方法はないのか、というとそうではないのです。 3rdパーティー製のコンテナ/Kuberentes環境については、条件を合わせることで限定的なサポートを受けることができます。
要約すると下記のようなポイントがあります。
- 3rdパーティ環境にデプロイされたRed Hatミドルウェア製品のサポートガイドラインに沿ってcommercially reasonably support(商業的に合理的なサポート)を受けることが可能
- サポート対象のバージョンのRed Hat build of KeycloakのZIPアーカイブ、サポートされるJVM、UBIを使用してカスタムコンテナイメージをセルフビルドしたものを使用する
- Red Hatサポートはカスタム コンテナ イメージの作成と保守を支援またはサポート行わない(必要に応じて有償のコンサルティングサービスをご購入いただけます)
Red Hat build of Keycloakのサポート構成、サポートされない構成、商業的に合理的なサポート構成をまとめると下記の図のようになります。(各コンポーネントやOSのバージョンなどは省略しています)
Red Hat build of Keycloakのサポート構成
Red Hat build of Keycloakのサポートされない構成
Red Hat build of Keycloakの商業的に合理的なサポート構成
本記事ではこれ以上細かい内容については解説しませんが、導入の検討において詳細な確認が必要な場合は担当のRed Hatの営業までお尋ねください。
Podmanを使ってRed Hat build of Keycloakでできること
さて、PodmanではRed Hat build of Keycloakのコンテナイメージの実行がサポートされないという衝撃の事実があったのですが、製品ドキュメントを読み進めるとできることがだんだん分かってきました。
カスタムコンテナイメージの作成
製品ドキュメントの「3.1. カスタマイズおよび最適化されたコンテナーイメージの作成」には下記の記載があります。
第3章 Red Hat build of Keycloak をコンテナー内で実行する | Red Hat Product Documentation
デフォルトの Red Hat build of Keycloak コンテナーイメージは、すぐに設定および最適化できる状態で出荷されます。 Red Hat build of Keycloak コンテナーを最適に起動するには、コンテナーのビルド中に build ステップを実行してイメージをビルドします。この手順を実行することで、後に続くコンテナーイメージの各起動フェーズで時間を節約できます。
ざっくり要約すると、Red Hat build of Keycloakのコンテナイメージをそのまま使うとPodの実行のたびに時間がかかるので、事前にプリビルドしたカスタムコンテナイメージを使用することで起動時間を短縮できる、ということのようです。
製品ドキュメントには下記のContainerfileのサンプルがあります。
FROM registry.redhat.io/rhbk/keycloak-rhel9:24 as builder # Enable health and metrics support ENV KC_HEALTH_ENABLED=true ENV KC_METRICS_ENABLED=true # Configure a database vendor ENV KC_DB=postgres WORKDIR /opt/keycloak # for demonstration purposes only, please make sure to use proper certificates in production instead RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore RUN /opt/keycloak/bin/kc.sh build FROM registry.redhat.io/rhbk/keycloak-rhel9:24 COPY --from=builder /opt/keycloak/ /opt/keycloak/ # change these values to point to a running postgres instance ENV KC_DB=postgres ENV KC_DB_URL=<DBURL> ENV KC_DB_USERNAME=<DBUSERNAME> ENV KC_DB_PASSWORD=<DBPASSWORD> ENV KC_HOSTNAME=localhost ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
シンプルなマルチステージビルドの内容で、Red Hat提供のRed Hat build of Keycloakのコンテナイメージをベースイメージとし使用し、証明書やDBの設定を行う内容のようです。 元のイメージのまま起動した場合とカスタムコンテナイメージを使った場合でどれくらい時間短縮ができるのかについては、また別の機会に試してみたいと思います。
このカスタムコンテナイメージのビルドおよびテスト起動にPodmanを使うことがドキュメントに書かれています。 ちゃんとPodmanの出番があって安心しました。
開発またはテスト目的でコンテナ実行する
もうひとつのPodmanの利用用途がRed Hat build of Keycloakの開発またはテスト目的での実行です。これは製品ドキュメントの「3.3. 開発モードで Red Hat build of Keycloak を試用する」に記載があります。
3.3. 開発モードで Red Hat build of Keycloak を試用する | Red Hat Product Documentation
Red Hat提供のRed Hat build of Keycloakのコンテナイメージを使った実稼働環境での使用はサポートされませんが、開発またはテスト目的においてのみ使うことができる内容です。
podman run
コマンドでいくつかのオプションをつけてRed Hat build of Keycloakのコンテナイメージを実行するだけのとても簡単なものです。
OpenShiftを用意するまでもなく、Red Hat build of Keycloakのコンテナイメージの実行を試したい場合には手軽な手段です。
では、実際にPodmanでRed Hat build of Keycloakのコンテナイメージを動かしてその内容を確認してみましょう。
繰り返しますが、PodmanでのRed Hat提供のRed Hat build of Keycloakのコンテナイメージの実行はサポートされる構成ではない点ご注意ください
Red Hat build of Keycloakのコンテナイメージの確認
Red Hat build of Keycloakのコンテナイメージはregistry.redhat.io
でホストされており、コンテナイメージをダウンロードするにはコンテナレジストリにログインする必要があります。
Red Hat build of Keycloakが含まれる製品の有効なサブスクリプションをお持ちのRed Hatアカウント、または評価版を使用中のRed Hatアカウント、等が必要です
podman login
コマンドでコンテナレジストリにログインします。
$ podman login registry.redhat.io
Red Hat build of Keycloakのコンテナイメージは必ずタグまで指定してpullする必要があります。本記事執筆時点での最新版は「keycloak-rhel9:24-10」です。
$ podman pull registry.redhat.io/rhbk/keycloak-rhel9:24-10
タグ指定なし(latest指定)の場合はイメージが見つからずエラーになります。
$ podman pull registry.redhat.io/rhbk/keycloak-rhel9 Trying to pull registry.redhat.io/rhbk/keycloak-rhel9:latest... WARN[0000] Failed, retrying in 1s ... (1/3). Error: initializing source docker://registry.redhat.io/rhbk/keycloak-rhel9:latest: reading manifest latest in registry.redhat.io/rhbk/keycloak-rhel9: unsupported: This repository does not use the "latest" tag to track the most recent image and must be pulled with an explicit version or image reference. For more information, see: https://access.redhat.com/articles/4301321 WARN[0002] Failed, retrying in 1s ... (2/3). Error: initializing source docker://registry.redhat.io/rhbk/keycloak-rhel9:latest: reading manifest latest in registry.redhat.io/rhbk/keycloak-rhel9: unsupported: This repository does not use the "latest" tag to track the most recent image and must be pulled with an explicit version or image reference. For more information, see: https://access.redhat.com/articles/4301321 WARN[0003] Failed, retrying in 1s ... (3/3). Error: initializing source docker://registry.redhat.io/rhbk/keycloak-rhel9:latest: reading manifest latest in registry.redhat.io/rhbk/keycloak-rhel9: unsupported: This repository does not use the "latest" tag to track the most recent image and must be pulled with an explicit version or image reference. For more information, see: https://access.redhat.com/articles/4301321 Error: initializing source docker://registry.redhat.io/rhbk/keycloak-rhel9:latest: reading manifest latest in registry.redhat.io/rhbk/keycloak-rhel9: unsupported: This repository does not use the "latest" tag to track the most recent image and must be pulled with an explicit version or image reference. For more information, see: https://access.redhat.com/articles/4301321
OpenJDKの回*1*2で行ったようにイメージの確認をしてみます。podman images
、podman image tree
、podman history
を使います。
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/rhbk/keycloak-rhel9 24-10 559c3ef84129 13 days ago 461 MB $ podman image tree registry.redhat.io/rhbk/keycloak-rhel9:24-10 Image ID: 559c3ef84129 Tags: [registry.redhat.io/rhbk/keycloak-rhel9:24-10] Size: 460.7MB Image Layers ├── ID: 7a99878a1748 Size: 23.52MB └── ID: 690b8207333e Size: 437.2MB Top Layer of: [registry.redhat.io/rhbk/keycloak-rhel9:24-10] $ podman history registry.redhat.io/rhbk/keycloak-rhel9:24-10 ID CREATED CREATED BY SIZE COMMENT 559c3ef84129 13 days ago /bin/sh -c #(nop) USER 1000 437MB FROM registry.redhat.io/ubi9/ubi-micro@sha256:826cf6250899228070dcd4eb0abd8667d0468a5fe0148d54bb513c912b06cee4 <missing> 13 days ago /bin/sh -c mv -fZ /tmp/ubi.repo /etc/yum.r... 0B <missing> 13 days ago /bin/sh -c #(nop) USER root 0B <missing> 13 days ago /bin/sh -c #(nop) USER 1000 0B <missing> 13 days ago /bin/sh -c rm -f /tmp/tls-ca-bundle.pem 0B <missing> 13 days ago /bin/sh -c rm -f '/etc/yum.repos.d/odcs-31... 0B <missing> 13 days ago /bin/sh -c #(nop) USER root 0B ...
Red Hat build of KeycloakのベースイメージはUBI-microが使われているようです。
UBI-microについては以前書いた記事がありますので、こちらを参考にしてください。 【UBI】Red Hatの新しい最軽量コンテナーイメージ:UBI Microの紹介 - 赤帽エンジニアブログ
Armホスト上でpullする場合
Red Hat build of Keycloakのコンテナイメージはamd64、ppc64le、s390xイメージしか提供されておらず、arm64版は提供されていません。 Apple Silicon Macの場合、そのままではpullできずエラーになります。
% podman pull registry.redhat.io/rhbk/keycloak-rhel9:24-10 Trying to pull registry.redhat.io/rhbk/keycloak-rhel9:24-10... Error: choosing an image from manifest list docker://registry.redhat.io/rhbk/keycloak-rhel9:24-10: no image found in manifest list for architecture "arm64", variant "v8", OS "linux"
--arch
オプションに続けてアーキテクチャーを指定することでpullが可能になります。
% podman pull --arch amd64 registry.redhat.io/rhbk/keycloak-rhel9:24-10
PodmanでRed Hat build of Keycloakのコンテナイメージを実行する
ここからは普段使っているApple Silicon Mac上のPodman machineで実行してみます。
ドキュメントに記載のpodman run
コマンドは下記のとおりです
% podman run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin keycloak-rhel9:24-10 start-dev
-e KEYCLOAK_ADMIN
:管理ユーザーのユーザー名を指定-e KEYCLOAK_ADMIN_PASSWORD
:管理ユーザーのパスワードを指定start-dev
:開発モードで実行するためのスイッチ
上記のコマンドを実行した場合、Podman machineのメモリ設定がデフォルトの2GBのままだとエラーになり起動しません。Podman machine以外の環境でエラーになる場合も空きメモリに余裕があるかどうか確認ください。
% podman run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin keycloak-rhel9:24-10 start-dev WARNING: image platform (linux/amd64) does not match the expected platform (linux/arm64) Updating the configuration and installing your custom providers, if any. Please wait. 2024-06-11 20:30:36,636 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index org.apache.tools.ant.Task: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,676 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index org.springframework.core.io.DefaultResourceLoader: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,677 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index org.springframework.core.io.ResourceLoader: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,679 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index org.springframework.core.io.Resource: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,703 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index io.mashona.logwriting.ArrayStore: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,705 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index org.apache.activemq.artemis.core.journal.RecordInfo: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,705 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index org.apache.activemq.artemis.core.journal.Journal: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,711 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index jakarta.jms.XAConnection: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,711 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index jakarta.jms.XASession: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,712 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index jakarta.jms.XAConnectionFactory: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:30:36,747 WARN [io.qua.dep.ind.IndexWrapper] (build-68) Failed to index jakarta.jms.Connection: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 /opt/keycloak/bin/kc.sh: line 161: 76 Killed 'java' -Dkc.config.build-and-exit=true '-XX:MetaspaceSize=96M' '-XX:MaxMetaspaceSize=256m' '-Dfile.encoding=UTF-8' '-Dsun.stdout.encoding=UTF-8' '-Dsun.err.encoding=UTF-8' '-Dstdout.encoding=UTF-8' '-Dstderr.encoding=UTF-8' '-XX:+ExitOnOutOfMemoryError' '-Djava.security.egd=file:/dev/urandom' '-XX:+UseParallelGC' '-XX:GCTimeRatio=4' '-XX:AdaptiveSizePolicyWeight=90' '-XX:FlightRecorderOptions=stackdepth=512' '-XX:MinHeapFreeRatio=10' '-XX:MaxHeapFreeRatio=20' '-Xms64m' '-Xmx512m' '--add-opens=java.base/java.util=ALL-UNNAMED' '--add-opens=java.base/java.util.concurrent=ALL-UNNAMED' '--add-opens=java.base/java.security=ALL-UNNAMED' -Dkc.home.dir='/opt/keycloak/bin/..' -Djboss.server.config.dir='/opt/keycloak/bin/../conf' -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Dpicocli.disable.closures=true -Dquarkus-log-max-startup-records=10000 -cp '/opt/keycloak/bin/../lib/quarkus-run.jar' io.quarkus.bootstrap.runner.QuarkusEntryPoint --profile=dev start-dev
Podman machineのメモリの割り当てを増やすには、一度Podman machineを止めて設定を変更する必要があります。
Podman machineのメモリの割り当てメモリの変更はpodman machine set
コマンドに続けて--memory
オプションを使います。指定する数値はMiB
で指定します。
% podman machine ls NAME VM TYPE CREATED LAST UP CPUS MEMORY DISK SIZE podman-machine-default* applehv 9 days ago Currently running 5 2GiB 100GiB % podman machine stop % podman machine set --memory 10240 % podman machine ls NAME VM TYPE CREATED LAST UP CPUS MEMORY DISK SIZE podman-machine-default* applehv 9 days ago Currently running 5 10GiB 100GiB
Podman machineの割り当てメモリを変更後、再度podman run
コマンドを実行します。今度は無事にコンテナが起動しました。
- 無事に起動することが確認できれば
podman run
コマンドに-d
オプションをつけてバックグラウンドで起動するように変更してもよいでしょう
$ podman run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin keycloak-rhel9:24-10 start-dev WARNING: image platform (linux/amd64) does not match the expected platform (linux/arm64) Updating the configuration and installing your custom providers, if any. Please wait. 2024-06-11 20:36:15,582 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index org.springframework.core.io.DefaultResourceLoader: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,593 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index org.springframework.core.io.ResourceLoader: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,612 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index org.apache.tools.ant.Task: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,631 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index org.springframework.core.io.Resource: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,640 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index jakarta.jms.XAConnection: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,641 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index jakarta.jms.XASession: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,641 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index jakarta.jms.XAConnectionFactory: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,643 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index jakarta.jms.Connection: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,647 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index io.mashona.logwriting.ArrayStore: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,648 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index org.apache.activemq.artemis.core.journal.RecordInfo: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:36:15,649 WARN [io.qua.dep.ind.IndexWrapper] (build-40) Failed to index org.apache.activemq.artemis.core.journal.Journal: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@3ecedf21 2024-06-11 20:37:14,933 INFO [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 72776ms 2024-06-11 20:37:18,271 INFO [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: Base URL: <unset>, Hostname: <request>, Strict HTTPS: false, Path: <request>, Strict BackChannel: false, Admin URL: <unset>, Admin: <request>, Port: -1, Proxied: false 2024-06-11 20:37:20,669 WARN [io.quarkus.agroal.runtime.DataSources] (JPA Startup Thread) Datasource <default> enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly 2024-06-11 20:37:21,420 WARN [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled 2024-06-11 20:37:21,629 INFO [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller' 2024-06-11 20:37:22,566 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener 2024-06-11 20:37:22,599 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_120547, Site name: null 2024-06-11 20:37:24,429 INFO [org.keycloak.quarkus.runtime.storage.legacy.liquibase.QuarkusJpaUpdaterProvider] (main) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml UPDATE SUMMARY Run: 124 Previously run: 0 Filtered out: 0 ------------------------------- Total change sets: 124 2024-06-11 20:37:29,282 INFO [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm 2024-06-11 20:37:32,370 INFO [org.keycloak.services] (main) KC-SERVICES0009: Added user 'admin' to realm 'master' 2024-06-11 20:37:32,662 INFO [io.quarkus] (main) Keycloak 24.0.5.redhat-00001 on JVM (powered by Quarkus 3.8.4.redhat-00002) started in 17.107s. Listening on: http://0.0.0.0:8080 2024-06-11 20:37:32,664 INFO [io.quarkus] (main) Profile dev activated. 2024-06-11 20:37:32,664 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, keycloak, narayana-jta, reactive-routes, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx] 2024-06-11 20:37:32,674 WARN [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.
コンテナの起動後は、ブラウザでhttp://localhost:8080
にアクセスし、管理者ユーザーのIDとパスワードでログインします。
余談ですが、Apple Silicon MacでRed Hat build of Keycloakのコンテナイメージ(amd64)を実行する場合はエミュレーションモードでの実行になります。 Podman v5.1以降はmacOS版のPodman machineのエミュレーションモードはデフォルトでRosettaが使用されます。 Red Hat build of Keycloakの起動時間を比べたところ、
- Rosetta使用の場合:1分程度
- qemu-user-static使用の場合:2分程度
と2倍くらいの時間の差があります。起動後の負荷テストなどは行っていませんが、実際の稼働のパフォーマンスなどにも違いは出てくると思われます。 このRosetta機能は私がPull Requestを書いて実装したのですが、こうやって実際に役に立つ場面があると頑張った甲斐があるなと感動します。 PodmanのRosettaについての解説は下記の記事を参照ください。
まとめ
Red Hat build of Keycloakのコンテナイメージを使ってテスト目的でのPodmanの実行を行うことができました。 実稼働目的ではないとはいえ、まずはお試しでRed Hat build of Keycloak実行してみる手段としてはとても有用です。 この次のステップとしては、外部データーベースを同じくコンテナで起動してRed Hat build of Keycloakから繋いでみるとか、Podmanの環境で高可用性のテストなんかもできるかもしれません(あくまで妄想ですが)。
アップストリームのKeycloakではPodmanを使ったスタートガイドなども実はあります。
「Podmanではじめる〜」本シリーズはRed Hat製品を対象とするのでRed Hat build of Keycloakに対象を絞って紹介しました。 OpenShiftを使わずにRed Hat build of Keycloakをコンテナで実行できることが分かったので、さらに使い込んでRed Hat build of Keycloakのことを理解していきたいと思います。