Share
Embed
Transcript
47 slides
-
© 2023 Fujitsu Limited 2023/11/11 数村憲治 コンテナ環境での Javaトラブル シューティング JJUG
CCC Fall 2023 @kkzr -
© 2023 Fujitsu Limited 自己紹介 Jakarta EE 仕様策定委員 MicroProfile ステコミ委員
JCP Executive Committee メンバー Eclipse Foundation ボードディレクター EclipseCon、 JakartaOne、JJUGなどで登壇 3 -
5 コンテナ利用の動機 パッケージング ⚫ 依存するものをすべてパッケージング ポータビリティ ⚫ どのプラットフォームでも、開発環境と運用環境 軽量 (lightweight)
⚫ VMよりは起動が速い 独立性 (isolation) ⚫ 効率的にスケール可能 ・・・ トラブルシューティングやセキュリティの動機はない © 2023 Fujitsu Limited -
8 コンテナイメージ 小サイズ化 の動機 起動時間短縮 ⚫ ダウンタイムの縮小 ⚫ スケールアウト時間の短縮 セキュリティ向上
⚫ 必要最小限の構成で、脆弱性が入り込む余地を 小さくする 依然、トラブルシューティングの動機はない © 2023 Fujitsu Limited -
ベースイメージ内に脆弱性があるライブラリが検出された場合、 そのライブラリをアプリケーションが使っていないくても対応 が必要 11 イメージ内のライブラリ脆弱性 イメージのビルド時・公開時に最新版を使っていても、 次第に脆弱性が増える 最新ベースイメージで、ビルドし直し ベースイメージ アプリケーション
コンテナイメージ アプリで使っていなくても 対応が必要 © 2023 Fujitsu Limited -
13 Javaのコンテナイメージを小さくする方法 © 2023 Fujitsu Limited distroless ベースイメージ を小さくする Java版もあり
jlink アプリケーション に必要な モジュールのみ パッケージ JRE JDKに含まれる ツール類がなくなる (jshell/jarコマンドなど) jfrは含まれる -
gcr.io/distrolessで公開 ⚫ Java版もあり: `gcr.io/distroless/java17-debian12` など Microsoft 版もあり ⚫ mcr.microsoft.com/openjdk/jdk:17-distroless トラブルシューティングに使えそうなものは、
ほぼ入っていない ⚫ ls や ps もなし 14 distroless © 2023 Fujitsu Limited OS標準機能に関する調査はできない -
Java機能に関する調査はできない 15 JRE © 2023 Fujitsu Limited JREにはJDKに含まれる、ほぼすべてのツールが含まれない jcmd /
jstack / jar / javac / jdb / javadoc / ・・・ JREに含まれないツール JREに含まれるツール java / keytool / rmiregistry / jfr / ・・・ -
16 Javaコンテナのジレンマ © 2023 Fujitsu Limited 実現手段 起動時間 セキュリティ トラシュー
小イメージ化 相性が悪い JDKツール、OSトラシューツールが使えない -
© 2023 Fujitsu Limited 17 コンテナのポジション (2) トラブルシューティング セキュリティ 起動性能
? (1) (2) 小イメージサイズ 理想から遠のく -
iノードで管理 8個のnamespaceでプロセスを分離 ⚫ cgroup/net/ipc/uts/user/pid/time/mnt ⚫ それぞれを共有する・しないことで、 コンテナの柔軟な独立性を実現 namespace 関連コマンド 例
⚫ lsns ⚫ nsenter ⚫ ・・・ `docker exec` コマンドは、namespaceの変更 ⚫ `nsenter --target ${PID} --all` と同等 22 Linux の namespace © 2023 Fujitsu Limited -
24 ノードからコンテナにアクセス © 2023 Fujitsu Limited コンテナ内のプロセスは、 ホスト・ノードのプロセスとしても 見える。ただし、PIDは違う どのプロセスがどのコンテナの
ものかは一見では分からない ホスト・ノードにアクセス可能 なら、この方法でもよいが。。。 コンテナ視点 (ネットワーク設定など)での トラシューは難しいかも ホスト・ノード コンテナ JDK jstackなど Java アプリ -
25 ノード上でデバッグコンテナ作成 © 2023 Fujitsu Limited K8Sノードでホストのnamespaceで動作するコンテナ kubectl debug node/{ノード名}
-it \ --image={イメージ} -- bash Pod コンテナ コンテナ Java アプリ Pod ノード jstackなど ノードの namespaceで動作 -
Podのnamespace共有 © 2023 Fujitsu Limited Pod 26 コンテナ1 pid mnt
共有 共有 プロセスへのアクセス不可 コンテナ2 pid mnt uts net 共有 共有 -
サイドカーでのnamespace共有 © 2023 Fujitsu Limited Pod 28 コンテナ アプリ(JRE) mnt
プロセスへのアクセス可能 mnt コンテナ デバッガ(JDK) pid 共有 共有 uts net 共有 共有 shareprocess -
29 サイドカー © 2023 Fujitsu Limited Pod内にトラシュー用のイメージを サイドカーとして実行しておく ⚫ pod定義で、以下を指定
spec.shareProcessNamespace:true アプリのコンテナイメージにトラシューツール が入れる必要はなくなるが、トラブルがなくても 常に起動されるのでリソースの無駄 ⚫ 開発時など、最初からトラブルが発生することが 分かっていれば有用 -
コピーによるnamespace共有 © 2023 Fujitsu Limited Pod 31 プロセスへのアクセス可能 Pod net
コピー Pod net uts コンテナ デバッガ(JDK) コンテナ net uts アプリ(JRE) コンテナ アプリ(JRE) コンテナ pid アプリ(JRE) mnt pid mnt mnt pid uts mnt shareprocess -
32 コピー © 2023 Fujitsu Limited トラブル時に、アプリコンテナをコピーして、 デバッガ用コンテナを追加 サイドカーより、リソースを節約できるが・・・ ライブマイグレーションするわけではない
kubectl debug -it debuggee-pod \ --copy-to debugger-pod \ –share-processes debuggee-pod \ --image JDK-image -- bash -
エフェメラルコンテナによる共有 © 2023 Fujitsu Limited Pod 34 プロセスへのアクセス可能 Pod net
uts mnt コンテナ net uts mnt アプリ(JRE) エフェメラル コンテナ デバッガ(JDK) コンテナ mnt アプリ(JRE) pid 追加 pid -
35 エフェメラルコンテナ © 2023 Fujitsu Limited トラシュー対象コンテナと、namespaceが 共通なコンテナを既存Podに追加 dockerの場合 Kubernetesの場合
docker run \ -it --name=debugger --pid=container:jre \ jdk-image bash kubectl debug -it -c debugger --target debuggee \ --image=jdk-image debuggee -- bash -
36 トラブルシューティング方法比較 © 2023 Fujitsu Limited 長所 短所 ノードからコンテナに アクセス
N/A ホスト権限が必要 コンテナ視点の欠如 docker exec 手軽 トラシューツールが 使えない場合あり サイドカー トラシューツール用コンテナ とアプリ用コンテナが分離 リソースの無駄 コピー トラブル時にのみコピー可能 トラブルコンテナ そのものを対象にできない エフェメラルコンテナ トラブルコンテナにトラブル時 にのみ、アクセス可能 一度作った エフェメラルコンテナ を削除できない -
38 Linux用ツール https://www.brendangregg.com/linuxperf.html © 2023 Fujitsu Limited 性能調査ツール アプリケーション からカーネル層
まで対応 CPUイベント ベース Java VM(JIT)も 対応 -
39 OpenJDKのperf対応 © 2023 Fujitsu Limited JDK-8080650: Enable stubs to
use frame pointers correctly JDK-8254723: Add diagnostic command to write Linux perf map file JDK-8316286: Add diagnostic command to write Linux perf jit dump file JDK-8314029: Add file name parameter to Compiler.perfmap JDK-8314027: Add code heap list parameter to Compiler.perfmap Fix:9 HotSpot VMのhsperfdata(UsePefData)とは関係ない Fix:16 open open open -
40 perf使用手順 © 2023 Fujitsu Limited perfとJDKの入ったイメージを作成する オプションでFrameGraphを入れてもよい https://github.com/brendangregg/FlameGraph 1
対象Javaアプリケーションは、 “-XX:+PreserveFramePointer”を指定しPodを起動しておく 2 Step1で作成したイメージを、Step2のPodに、 エフェメラルコンテナ化し追加する 3 perfコマンドで、性能情報を収集する 4 jcmdで、perf.mapを作成する 5 perfコマンドで、データ解析・表示する 6 -
JVMのワークロードベンチマーク 手軽に起動可能 複数のテストスイート 41 ルネサンスベンチマーク © 2023 Fujitsu Limited ⚫
https://renaissance.dev/ ⚫ https://github.com/renaissance-benchmarks/renaissance/ $ java -jar 'renaissance-gpl-0.15.0.jar' <benchmarks> ⚫ apache-spark / concurrency / database / functional /scala / web -
42 デモ (Renaissance) © 2023 Fujitsu Limited Pod “rena” コンテナ
“rena” jcmd コピー perf エフェメラルコンテナ “perf” perf report renaissance /tmp/perf-1.map perf.data /tmp/perf-1.map レポート JRE -
© 2023 Fujitsu Limited 44 コンテナのポジション (3) トラブルシューティング セキュリティ 起動性能
(1) (2) (3) エフェメラルコンテナなど 小イメージサイズ