Keycloak / Kubernetes

これまで環境の都合でWildFly版のver.15のKeycloakを使ってきましたが、ver.17よりQuarkus版のディストリビューションが採用されていることから、こちらの構築も試してみました。

参考) https://www.keycloak.org/getting-started/getting-started-kube

Quarkusは下記でも扱いましたが、クラウドネイティプでKubernetesに適したJavaアプリのフレームワークです。

Reactive Messaging / Quarkus

環境) Keycloak 21.0.1 on JVM (powered by Quarkus 2.13.7.Final) / Ubuntu 20.04

参考) 「Ubuntu20.04.1 LTSにminikubeをインストールする」
https://qiita.com/yuichi1992_west/items/571016084c110d15320e

メモ) まずVirtualBoxで構築しようとしたところ、仮想環境の部分でうまくいかないことがあり、リアルPCを使用しました。(ブラウザもつかえるGUIあり)
・Ubuntu22.04/VBoxでは、minikubeがdriverのkvm2がうまくいかず
・Ubuntu20.04/VBoxでは、minikube driver=dockerはうまくいくが keycloakが、 Fatal glibc error: CPU does not support x86-64-v2
・コンテナにSSHログインができなかったため、SSHのPort Forwardをつかえず、そのマシン上で管理画面を動かす。そのためFireFoxが動く環境が必要。

minikubeインストール

$ curl -LO “https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl”
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
$ sudo apt install apt-transport-https ca-certificates software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
$ sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable”
$ sudo apt update
$ sudo apt install docker-ce
$ sudo groupadd docker
$ sudo usermod -aG docker n (n:user)
logout & login
$ sudo systemctl restart docker
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ chmod +x minikubes
$ sudo mv minikube /usr/local/bin

ingress addon 有効化

$ wget -q -O – https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/latest/kubernetes-examples/keycloak-ingress.yaml | sed “s/KEYCLOAK_HOST/keycloak.$(minikube ip).nip.io/” | kubectl create -f –
$ minikube addons enable ingress
$ minikube addons list

起動

n@n:~/kube$ minikube start –driver=docker
* Ubuntu 20.04 上の minikube v1.29.0
* ユーザーの設定に基づいて docker ドライバーを使用します
* root 権限を持つ Docker ドライバーを使用
* minikube クラスター中のコントロールプレーンの minikube ノードを起動しています
* ベースイメージを取得しています…
* ロード済み Kubernetes v1.26.1 をダウンロードしています…
> preloaded-images-k8s-v18-v1…: 397.05 MiB / 397.05 MiB 100.00% 4.89 Mi
> gcr.io/k8s-minikube/kicbase…: 407.19 MiB / 407.19 MiB 100.00% 2.32 Mi
* docker container (CPUs=2, Memory=2200MB) を作成しています…
* Docker 20.10.23 で Kubernetes v1.26.1 を準備しています…
– 証明書と鍵を作成しています…
– コントロールプレーンを起動しています…
– RBAC のルールを設定中です…
* bridge CNI (コンテナーネットワークインターフェース) を設定中です…
– gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
* Kubernetes コンポーネントを検証しています…
* 有効なアドオン: storage-provisioner, default-storageclass
* 終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました

または

n@n:~/kube$ minikube start –driver=docker –listen-address=’0.0.0.0′
* Ubuntu 20.04 上の minikube v1.29.0
* 既存のプロファイルを元に、docker ドライバーを使用します
* minikube クラスター中のコントロールプレーンの minikube ノードを起動しています
* ベースイメージを取得しています…
* 「minikube」のために既存の docker container を再起動しています…
* Docker 20.10.23 で Kubernetes v1.26.1 を準備しています…
* bridge CNI (コンテナーネットワークインターフェース) を設定中です…
– registry.k8s.io/ingress-nginx/controller:v1.5.1 イメージを使用しています
– registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343 イメージを使用しています
– gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
* Kubernetes コンポーネントを検証しています…
– registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343 イメージを使用しています
* ingress アドオンを検証しています…
* 有効なアドオン: storage-provisioner, default-storageclass, ingress
* 終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました

Keycloakのインストール

n@n:~/kube$ kubectl create -f https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/latest/kubernetes-examples/keycloak.yaml
service/keycloak created
deployment.apps/keycloak created

コンテナの情報

n@n:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
keycloak-76d756bbcb-kfcc7 1/1 Running 2 (92m ago) 98m
n@n:~$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
keycloak LoadBalancer 10.101.204.232 8080:30924/TCP 98m
kubernetes ClusterIP 10.96.0.1 443/TCP 102m
n@n:~$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
keycloak 1/1 1 1 99m
n@n:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 102m v1.26.1

ログ表示

n@n:~$ kubectl logs keycloak-76d756bbcb-kfcc7
Updating the configuration and installing your custom providers, if any. Please wait.
2023-03-28 07:17:35,912 INFO [io.quarkus.deployment.QuarkusAugmentor] (main) Quarkus augmentation completed in 102544ms
2023-03-28 07:17:40,327 INFO [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: Base URL: , Hostname: , Strict HTTPS: false, Path: , Strict BackChannel: false, Admin URL: , Admin: , Port: -1, Proxied: true
2023-03-28 07:17:43,877 WARN [io.quarkus.agroal.runtime.DataSources] (main) Datasource 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
2023-03-28 07:17:46,739 INFO [org.infinispan.SERVER] (keycloak-cache-init) ISPN005054: Native IOUring transport not available, using NIO instead: io.netty.incubator.channel.uring.IOUring
2023-03-28 07:17:47,399 WARN [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled
2023-03-28 07:17:47,449 WARN [org.infinispan.PERSISTENCE] (keycloak-cache-init) ISPN000554: jboss-marshalling is deprecated and planned for removal
2023-03-28 07:17:47,641 INFO [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller ‘org.infinispan.jboss.marshalling.core.JBossUserMarshaller’
2023-03-28 07:17:48,682 WARN [io.quarkus.vertx.http.runtime.VertxHttpRecorder] (main) The X-Forwarded-* and Forwarded headers will be considered when determining the proxy address. This configuration can cause a security issue as clients can forge requests and send a forwarded header that is not overwritten by the proxy. Please consider use one of these headers just to forward the proxy address in requests.
2023-03-28 07:17:54,261 INFO [org.keycloak.quarkus.runtime.storage.legacy.liquibase.QuarkusJpaUpdaterProvider] (main) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml
2023-03-28 07:18:02,451 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_242440, Site name: null
2023-03-28 07:18:02,853 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener
2023-03-28 07:18:02,981 INFO [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm
2023-03-28 07:18:09,351 INFO [io.quarkus] (main) Keycloak 21.0.1 on JVM (powered by Quarkus 2.13.7.Final) started in 32.445s. Listening on: http://0.0.0.0:8080
2023-03-28 07:18:09,352 INFO [io.quarkus] (main) Profile dev activated.
2023-03-28 07:18:09,352 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, jdbc-mariadb, jdbc-mssql, jdbc-mysql, jdbc-oracle, jdbc-postgresql, keycloak, logging-gelf, micrometer, narayana-jta, reactive-routes, resteasy, resteasy-jackson, smallrye-context-propagation, smallrye-health, vertx]
2023-03-28 07:18:10,341 INFO [org.keycloak.services] (main) KC-SERVICES0009: Added user ‘admin’ to realm ‘master’
2023-03-28 07:18:10,346 WARN [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.


(課題:外部からport:30924でアクセスできなかった。minikube start –driver=docker –listen-address=’0.0.0.0′ –apiserver-ips=’192.168.1.139’ 試したが・・)

デフォルトのadmin/adminでログインしたら、サイトを参考にレルム、クライアント、ユーザを作成します。

デモサイトからログインのテスト

kubernetesの環境面で時間をとられましたが、Keycloak自体はすぐに構築できました。Keycloakはバージョンアップがさかんですので、このような導入の仕方は便利に感じます。(安定バージョンというものがなく、機能追加、バグフィックスが次々とされる)

最後に使ったマニュフェストを引用しておきます。
https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/latest/kubernetes-examples/keycloak.yaml