a Kubernetes-Native Java Stack based Identity and Access Manager 認証基盤OSS「Keycloak」がQuarkusというKuberntes Native向けJavaフレームワークに対応し始めました。本セッションではQuarkus版Keycloakをコンテナ化し、簡単な動作確認および性能検証を行った結果を紹介します。
OpenShift.Run Winter 2020
© Hitachi, Ltd. 2020. All rights reserved.Keycloak on Quarkusa Kubernetes-Native Java Stack based Identity and Access Manager#openshiftjpHitachi, Ltd. R&D GroupTakaya Ide2020/12/10
View Slide
© Hitachi, Ltd. 2020. All rights reserved.本セッションの趣旨▪ ID・アクセス管理OSSのKeycloakにおいて、Quarkus版ディストリビューションが開発中▪ Quarkusはコンテナに適したJavaフレームワーク。KubernetesやOpenShift上での活躍が期待される▪ 本セッションではQuarkus版Keycloakをコンテナ化し、性能評価を実施した結果を共有1
© Hitachi, Ltd. 2020. All rights reserved.目次1. 背景◇ API公開の広がり◇ Keycloak2. Keycloak.X◇ Keycloak on OpenShift◇ Keycloakの改善◇ Quarkus◇ Keycloak.X3. Keycloak.Xのコンテナ化◇ 利用時のTips◇ 実行サンプル4. 性能評価◇ メモリ消費量◇ スループット◇ 起動時間◇ 考察5. まとめ2
© Hitachi, Ltd. 2020. All rights reserved.API公開の広がり▪ API:外部からサービス機能を呼び出すインタフェース▪ DXの一環として各分野でAPI公開/活用が進展32017年の銀行法改正によるオープンAPI活用推進政府や自治体の情報を民間企業から利用しやすくするためにAPIを活用外部組織やモバイルアプリとのインタフェースとしてAPI公開が一般化金融公共商業{API}
© Hitachi, Ltd. 2020. All rights reserved.ケーススタディ▪ アプリから銀行の預金残高を確認するサービスを考える▪ 「OAuth 2.0を用いて残高取得APIを公開しよう」▪ ユーザ管理、社内DB連携、アクセストークン発行・検証、脆弱性対策、アプリ新機能に伴う公開APIの増加、etc. etc. …4③ユーザ認証および第三者へのAPIアクセス認可の確認④第三者のAPIアクセスを認可①アクセス②認可リクエスト⑥トークンを用いたAPIアクセス⑤トークン発行サービス銀行APIサーバユーザOAuth 2.0を用いたAPIアクセスの概略図
© Hitachi, Ltd. 2020. All rights reserved.Keycloak▪ モダンなアプリ・サービスのためのID・アクセス管理OSS▪ 特徴◇ OAuth 2.0, OIDC, SAMLなどの標準プロトコルに対応◇ 外部LDAP、Active Directory、RDBとの連携◇ 外部IDプロバイダ連携によるソーシャルログイン対応◇ 商用版あり(Red Hat Single Sign On)▪ CNCF Incubating Projectへの登録を提案中◇ https://github.com/cncf/toc/pull/4635
© Hitachi, Ltd. 2020. All rights reserved.Keycloakを用いたケーススタディ▪ 認証・認可処理をKeycloakに移譲▪ APIサーバはAPIの処理に注力6③ユーザ認証および第三者へのAPIアクセス認可の確認④第三者のAPIアクセスを認可①アクセス②認可リクエスト⑥トークンを用いたAPIアクセス⑤トークン発行サービス銀行APIサーバユーザOAuth 2.0を用いたAPIアクセスの概略図Keycloak(認可サーバ)⑦トークン検証
© Hitachi, Ltd. 2020. All rights reserved.Keycloak on OpenShift7▪ KubernetesやOpenShift上のアプリでのAPIを公開したい→ 公式コンテナあり。また、keycloak-operator※にて運用を支援▪ 3scaleなどのAPIゲートウェイと連携し、API管理基盤を実現※ keycloak-operator:Kubernetes上にてインストール、更新、バックアップ、リストア等の運用を自動化するソフトウェアOpenShiftKeycloak(認証認可サーバ)3scale(API Gateway)APIサーバAPI利用者API管理基盤keycloakoperator②トークン発行運用自動化③アクセスwithトークン④トークン検証⑤認可済みアクセス①ユーザ認証
© Hitachi, Ltd. 2020. All rights reserved.Keycloakの改善▪ Keycloak v1.0のリリースは2014年◇ コンテナ技術が台頭する前◇ Javaで実装され、Java EE APサーバのWildFly上で動作▪ Keycloakをよりスリムで、便利で、将来性のあるものにできないか◇ 消費リソースの削減◇ スケール性の向上◇ 設定容易化◇ etc.8
© Hitachi, Ltd. 2020. All rights reserved.QUARKUS9
© Hitachi, Ltd. 2020. All rights reserved.Quarkus▪ Red Hat社が主導するKubernetes-Native Java Stack◇ 高速起動、省メモリの特徴を持つ◇ JVM上での動作以外にネイティブコンパイルが可能▪ OpenShiftのサポート対象(保証、開発ツール連携)https://www.redhat.com/en/blog/introducing-quarkus-red-hat-openshift10JVM Hot Spot GraalVMQuarkus CoreJandex Gizmo Graal SDKArC(DI)Quarkus ExtensionsQuarkusアーキテクチャ▪ Understanding Quarkus◇ 情報が多い。Quarkus内部設計も記載◇ https://developers.redhat.com/books/understanding-quarkus▪ Quarkus Technical Deep Dive – Japanese◇ 日本語で全体像を把握できる◇ https://speakerdeck.com/chiroito/quarkus-technical-deep-dive-japaneseお薦めの参考文献
© Hitachi, Ltd. 2020. All rights reserved.Keycloak.X Project▪ Keycloak改善に向け、実験的に大胆な変更を追加するプロジェクトhttps://github.com/keycloak/keycloak-community/tree/master/design/keycloak.x▪ フレームワークにQuarkusを採用▪ 現在開発中。JVM版は既に動作可能? 検証11▪ 起動時間と消費メモリの削減▪ 設定容易化▪ スケーリング容易化▪ 無停止アップデート▪ 機能拡張性の向上目的(抜粋)▪ Quarkusの採用▪ 構成オプションの環境変数化(WIP)▪ ストレージレイヤの刷新(WIP)▪ REST/gRPC経由でのカスタムプロバイダー提供(WIP)取り組み(抜粋)
© Hitachi, Ltd. 2020. All rights reserved.Keycloak.Xのコンテナ化▪ Keycloak.Xをコンテナで動かす▪ 公式のDockerfileあり※◇ Keycloak.Xバイナリは未配布◇ Dockerfile改修もしくはKeycloak.Xバイナリ配信が必要▪ Keyloak.Xバイナリのビルド◇ 右Dockerfileにて可能◇ 2020年12月現在、Masterブランチのみビルド可能12ARG MAVEN_VERSION=3.6.3ARG JAVA_VERSION=11# Specify the Commit ID to stabilize the buildARG COMMIT_ID=a01dcc54565542bfd72006c2e155ce3aa11fe01dFROM maven:${MAVEN_VERSION}-openjdk-${JAVA_VERSION} as buildARG KEYCLOAK_VERSIONARG ARTIFACT_DIRARG COMMIT_IDWORKDIR /opt# [NOTE] it spends over 10 minutesRUN git clone https://github.com/keycloak/keycloak.gitRUN cd ./keycloak && \git pull && \git checkout ${COMMIT_ID}# [NOTE] it spends over 70 minutesRUN cd ./keycloak/quarkus && \mvn -f ../pom.xml clean install \-DskipTestsuite -DskipExamples -DskipTests \-Pquarkus,distribution -e# The binary was built on /opt/keycloak/distribution/bin※keycloak/keycloak-containerリポジトリにて公開https://github.com/keycloak/keycloak-containers/tree/master/server-x
© Hitachi, Ltd. 2020. All rights reserved.Keycloak.Xの動作確認▪ トークンを用いたユーザアクセス認可のシナリオに沿って動作を実機検証→ ユーザログイン、トークン発行、トークン検証ともに問題なく動作13
© Hitachi, Ltd. 2020. All rights reserved.Keycloak.X 利用時のTips▪ Keycloak.Xのデザインノートの情報が詳しい(※ドラフト版)https://github.com/keycloak/keycloak-community/blob/master/design/keycloak.x/configuration.md◇ そこに情報がなければCLIのヘルプメッセージかテストコードを参照▪ 動的プロパティと静的プロパティが存在◇ 動的プロパティ:環境変数や起動オプションで指定◇ 静的プロパティ:サーバイメージ再生成要。 ./bin/kc.sh config コマンドで指定◇ 2020年12月現在、 --db 及び --features[-x] が静的プロパティ▪ プロパティとは別に環境変数にて初期adminアカウントの設定要◇ KEYCLOAK_ADMIN / KEYCLOAK_ADMIN_PASSWORD▪ 死活監視およびメトリクス取得用のエンドポイントあり◇ /health/live , /health/ready , /metrics◇ 機能有効化のための metrics.enabled オプションが認識されず14
© Hitachi, Ltd. 2020. All rights reserved.Keycloak.Xの実行サンプル▪ 外部PostgreSQLサーバを用いる構成のdocker-compose.yml▪ 動的プロパティは環境変数で設定▪ 静的プロパティであるDBベンダはCLIにて設定◇ コミュニティ公式のDockerfileを使用している場合、auto-config機能でも設定可能https://github.com/keycloak/keycloak-containers/tree/master/server-x15version: '3'volumes:postgres_data:driver: localservices:postgres:image: postgres:13.0-alpinevolumes:- postgres_data:/var/lib/postgresql/dataenvironment:POSTGRES_DB: keycloakPOSTGRES_USER: keycloakPOSTGRES_PASSWORD: passwordkeycloak:image: my-keycloak-x:a01dcc5environment:KC_DB_USERNAME: keycloakKC_DB_PASSWORD: passwordKC_DB_SCHEMA: publicKC_DB_URL: jdbc:postgresql://postgres:5432/keycloakKC_HTTP_ENABLED: 'true'KEYCLOAK_USER: adminKEYCLOAK_PASSWORD: passwordports:- 8080:8080depends_on:- postgresentrypoint: ''command: >bash -c "./bin/kc.sh config --db=postgres-10 &&./bin/kc.sh start"
© Hitachi, Ltd. 2020. All rights reserved.性能測定通常のKeycloakとKeycloak.Xで消費メモリ、スループット、起動時間を比較16実験構成▪ Keycloak[.X]コンテナの基本設定◇ vCPU:3◇ Javaヒープメモリ:8GB◇ ログインユーザ数:1万人◇ 同時接続 / worker thread数:64▪ コンテナイメージ◇ Keycloak:jboss/keycloak:11.0.3◇ Keycloak.X:自作※◇ Javaはopenjdk-11.0.9▪ 3回計測し、平均を算出※コミットID a01dcc5時点のKeycloak.Xをビルドトークン検証APIリクエストVM VMKeycloak.XコンテナPostgresコンテナKeycloakコンテナPostgresコンテナ負荷生成ログインスクリプトユーザログイン消費メモリ検証スループット検証起動速度検証
© Hitachi, Ltd. 2020. All rights reserved.結果(1/3) – 消費メモリ▪ ログインユーザ数に応じたメモリ消費量※1をグラフ化▪ 消費メモリはユーザ数に線形比例(両者とも相関係数 > 0.99)▪ Keycloak.XはKeycloakより50MBほど消費メモリが少ない17※1 GC直後のヒープサイズの値をGCログから取得85 9612320330331498015625201002003004000 1,000 10,000 50,000 100,000Memory Usage (MB)Number of logged in usersログインユーザ数に応じたメモリ消費量変化KeycloakKeycloak.X
© Hitachi, Ltd. 2020. All rights reserved.結果(2/3) – スループット▪ CPUやメモリの割当量を変化させつつスループット(rps)を測定▪ CPUやメモリが潤沢な場合、両者同程度のスループット▪ Keycloak.XはCPUやメモリが少ない場合でもスループットが低下しにくい18184330243350 33673293 3356 3352 337501000200030004000128 256 1024 4096Throughput (req/seq)Memory (MB)メモリ量に応じたスループットKeycloakKeycloak.X146327303351 3492 344529573382 3365 3390 3406010002000300040001 2 3 4 8Throughput (req/sec)Number of CPUsCPU数に応じたスループット変化KeycloakKeycloak.X
© Hitachi, Ltd. 2020. All rights reserved.結果(3/3) – 起動時間▪ CPU数に応じたKeycloak[.X]の起動時間を測定※1▪ Keycloak.Xの起動時間はKeyxloakの 1/3 程度19※1 起動時間はログから取得32.519.816.0 15.911.06.3 5.8 5.5051015202530351 2 3 4Startup time (sec)Number of CPUsCPU数に応じた起動時間の変化KeycloakKeycloak.X
© Hitachi, Ltd. 2020. All rights reserved.性能評価のまとめと考察考察▪ 消費メモリおよび起動速度にてQuarkusの特徴が反映された▪ メモリが少ない際のスループットの差は消費メモリの違いによるGC発生頻度の影響か▪ CPUが少ない場合のスループットの差の理由は調査中▪ Keycloak.XはCPUを3コアから1コアに減らしても 88% の性能を維持→ CPU 1コアのコンテナを3個起動すればスループットを増やせる可能性20評価対象 結果サマリ消費メモリ Keycloak.X はログインユーザ数に依らず50MBほど消費メモリが少ない起動速度 Keycloak.Xは通常版の1/3の時間で起動スループット最大速度は両者同等。Keycloak.X はCPUやメモリが少ない場合でも性能が低下しにくい結果まとめ
© Hitachi, Ltd. 2020. All rights reserved.まとめ▪ Keycloak はID・アクセス管理のOSS◇ keycloak-operatorを用いたKubernetes/OpenShift対応◇ Quarkusを採用した実験版 Keycloak.X が開発中▪ Keycloak.X をコンテナ化し、評価を実施◇ バイナリを用意すればコンテナ化が可能◇ トークン発行・検証などの動作確認に成功◇ 通常のKeycloakより消費メモリは50MB削減、起動速度は1/3に低減◇ 通常のKeycloakよりCPUやメモリが少なくとも性能が低下しにくい21
© Hitachi, Ltd. 2020. All rights reserved.ThinkIT連載 : Keycloakで実現するAPIセキュリティ▪ 日立のKeycloak有識者が連載している解説記事▪ https://thinkit.co.jp/series/9721▪ 次回以降、Istio, Quarkus, strimziのKeycloak連携を解説予定22画像出典元: https://thinkit.co.jp/series/9721
© Hitachi, Ltd. 2020. All rights reserved.参考文献▪ Understanding Quarkus, https://developers.redhat.com/books/understanding-quarkus (2020.11)▪ Quarkus Technical Deep Dive – Japanese,https://speakerdeck.com/chiroito/quarkus-technical-deep-dive-japanese (2020.8)▪ Quarkus Runtime Performance, https://quarkus.io/blog/runtime-performance (2019.7)▪ Quarkus vs Spring Boot - Part 2,http://www.mastertheboss.com/soa-cloud/quarkus/quarkus-vs-spring-boot-part-2 (2020.7)▪ Keycloak, https://www.keycloak.org/ (2020.11)▪ Keycloak.Xhttps://github.com/keycloak/keycloak-community/tree/master/design/keycloak.x (2020.6)▪ Keycloak.X Server Configuration,https://github.com/keycloak/keycloak-community/blob/master/design/keycloak.x/configuration.md (2020.11)▪ Keycloak.X Docker Image,https://github.com/keycloak/keycloak-containers/tree/master/server-x▪ CNCF TOC, https://github.com/cncf/toc/pull/463 (2020.6)▪ KeycloakによるAPIセキュリティの基本, https://thinkit.co.jp/article/17559 (2020.5)23
© Hitachi, Ltd. 2020. All rights reserved.Trademarks▪ Keycloak, OpenShift, JBoss and Wildfly are registered trademarks ofRed Hat, Inc. in the United States and other countries.▪ OpenID is a trademark or registered trademark of OpenID Foundationin the United States and other countries.▪ その他記載の会社名、製品名、サービス名、その他固有名詞は、それぞれの会社の商標または登録商標です▪ 本発表中の文章、図では、TM、マークは表記しておりません24
© Hitachi, Ltd. 2020. All rights reserved.Special Thanks本発表にあたり、実験や考察で大変お世話になりました。この場を借りてお礼申し上げます▪ (株)日立製作所 OSSソリューションセンタ 中村雄一さん▪ (株)日立製作所 OSSソリューションセンタ 岡井裕矢さん▪ (株)日立製作所 研究開発グループ 田中 晶さん▪ (株)日立製作所 研究開発グループ 西田 寿雄さん25