Slide 1

Slide 1 text

© 2023 Fujitsu Limited 2023/11/11 数村憲治 コンテナ環境での Javaトラブル シューティング JJUG CCC Fall 2023 @kkzr

Slide 2

Slide 2 text

© 2023 Fujitsu Limited 2 アジェンダ Javaコンテナのジレンマ Javaコンテナのトラシュー サマリ perfツール

Slide 3

Slide 3 text

© 2023 Fujitsu Limited 自己紹介 Jakarta EE 仕様策定委員 MicroProfile ステコミ委員 JCP Executive Committee メンバー Eclipse Foundation ボードディレクター EclipseCon、 JakartaOne、JJUGなどで登壇 3

Slide 4

Slide 4 text

アジェンダ © 2023 Fujitsu Limited Javaコンテナのジレンマ Javaコンテナのトラシュー サマリ perfツール 4

Slide 5

Slide 5 text

5 コンテナ利用の動機 パッケージング ⚫ 依存するものをすべてパッケージング ポータビリティ ⚫ どのプラットフォームでも、開発環境と運用環境 軽量 (lightweight) ⚫ VMよりは起動が速い 独立性 (isolation) ⚫ 効率的にスケール可能 ・・・ トラブルシューティングやセキュリティの動機はない © 2023 Fujitsu Limited

Slide 6

Slide 6 text

6 本セッションのテーマ コンテナを使うのだから、起動性能は追求したい ただし、セキュリティも大事 でも、現実としてトラブルは起きるので対処必要 これら3つの要件を満たす方法を探る © 2023 Fujitsu Limited

Slide 7

Slide 7 text

© 2023 Fujitsu Limited 7 コンテナのポジション (1) トラブルシューティング セキュリティ 起動性能 ? (1) 理想

Slide 8

Slide 8 text

8 コンテナイメージ 小サイズ化 の動機 起動時間短縮 ⚫ ダウンタイムの縮小 ⚫ スケールアウト時間の短縮 セキュリティ向上 ⚫ 必要最小限の構成で、脆弱性が入り込む余地を 小さくする 依然、トラブルシューティングの動機はない © 2023 Fujitsu Limited

Slide 9

Slide 9 text

9 コンテナ起動時間 https://niravshah2705.medium.com/kubernetes-image-pull-optimisation-part-i-exploring-options-f79d79c3fe45 大半は、 イメージのpull pullは、fetchと uncompressに 分解できる イメージサイズが 大きくなるほど、 uncompressに 時間がかかる © 2023 Fujitsu Limited

Slide 10

Slide 10 text

10 コンテナでのセキュリティプラクティス ベースイメージを小さくする ユーザ権限を最小限にする 脆弱性情報を監視する トークン・鍵をイメージに ・・・ https://res.cloudinary.com/snyk/image/upload/v1551798390/Docker_Image_Security_Best_Practices_.pdf 入れない © 2023 Fujitsu Limited

Slide 11

Slide 11 text

ベースイメージ内に脆弱性があるライブラリが検出された場合、 そのライブラリをアプリケーションが使っていないくても対応 が必要 11 イメージ内のライブラリ脆弱性 イメージのビルド時・公開時に最新版を使っていても、 次第に脆弱性が増える 最新ベースイメージで、ビルドし直し ベースイメージ アプリケーション コンテナイメージ アプリで使っていなくても 対応が必要 © 2023 Fujitsu Limited

Slide 12

Slide 12 text

12 Docker Hubでの脆弱性表示例 © 2023 Fujitsu Limited

Slide 13

Slide 13 text

13 Javaのコンテナイメージを小さくする方法 © 2023 Fujitsu Limited distroless ベースイメージ を小さくする Java版もあり jlink アプリケーション に必要な モジュールのみ パッケージ JRE JDKに含まれる ツール類がなくなる (jshell/jarコマンドなど) jfrは含まれる

Slide 14

Slide 14 text

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標準機能に関する調査はできない

Slide 15

Slide 15 text

Java機能に関する調査はできない 15 JRE © 2023 Fujitsu Limited JREにはJDKに含まれる、ほぼすべてのツールが含まれない jcmd / jstack / jar / javac / jdb / javadoc / ・・・ JREに含まれないツール JREに含まれるツール java / keytool / rmiregistry / jfr / ・・・

Slide 16

Slide 16 text

16 Javaコンテナのジレンマ © 2023 Fujitsu Limited 実現手段 起動時間 セキュリティ トラシュー 小イメージ化 相性が悪い JDKツール、OSトラシューツールが使えない

Slide 17

Slide 17 text

© 2023 Fujitsu Limited 17 コンテナのポジション (2) トラブルシューティング セキュリティ 起動性能 ? (1) (2) 小イメージサイズ 理想から遠のく

Slide 18

Slide 18 text

アジェンダ © 2023 Fujitsu Limited Javaコンテナのジレンマ Javaコンテナのトラシュー サマリ perfツール 18

Slide 19

Slide 19 text

docker exec ノードからコンテナにアクセス サイドカー コピー エフェメラルコンテナ コンテナのトラブルシューティング方法 © 2023 Fujitsu Limited 19

Slide 20

Slide 20 text

docker exec ノードからコンテナにアクセス サイドカー コピー エフェメラルコンテナ コンテナのトラブルシューティング方法 © 2023 Fujitsu Limited 20

Slide 21

Slide 21 text

コンテナ内視点で、 システムやプロセスにアクセス可能 ただし、コンテナ内にトラブルシューティングに 必要なツールが揃っているとは限らない sshのようにシステムにログインする感覚だが、 実際は、namespaceの変更により、 実現されている 21 docker exec © 2023 Fujitsu Limited

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

docker exec ノードからコンテナにアクセス サイドカー コピー エフェメラルコンテナ コンテナのトラブルシューティング方法 © 2023 Fujitsu Limited 23

Slide 24

Slide 24 text

24 ノードからコンテナにアクセス © 2023 Fujitsu Limited コンテナ内のプロセスは、 ホスト・ノードのプロセスとしても 見える。ただし、PIDは違う どのプロセスがどのコンテナの ものかは一見では分からない ホスト・ノードにアクセス可能 なら、この方法でもよいが。。。 コンテナ視点 (ネットワーク設定など)での トラシューは難しいかも ホスト・ノード コンテナ JDK jstackなど Java アプリ

Slide 25

Slide 25 text

25 ノード上でデバッグコンテナ作成 © 2023 Fujitsu Limited K8Sノードでホストのnamespaceで動作するコンテナ kubectl debug node/{ノード名} -it \ --image={イメージ} -- bash Pod コンテナ コンテナ Java アプリ Pod ノード jstackなど ノードの namespaceで動作

Slide 26

Slide 26 text

Podのnamespace共有 © 2023 Fujitsu Limited Pod 26 コンテナ1 pid mnt 共有 共有 プロセスへのアクセス不可 コンテナ2 pid mnt uts net 共有 共有

Slide 27

Slide 27 text

docker exec ノードからコンテナにアクセス サイドカー コピー エフェメラルコンテナ コンテナのトラブルシューティング方法 © 2023 Fujitsu Limited 27

Slide 28

Slide 28 text

サイドカーでのnamespace共有 © 2023 Fujitsu Limited Pod 28 コンテナ アプリ(JRE) mnt プロセスへのアクセス可能 mnt コンテナ デバッガ(JDK) pid 共有 共有 uts net 共有 共有 shareprocess

Slide 29

Slide 29 text

29 サイドカー © 2023 Fujitsu Limited Pod内にトラシュー用のイメージを サイドカーとして実行しておく ⚫ pod定義で、以下を指定 spec.shareProcessNamespace:true アプリのコンテナイメージにトラシューツール が入れる必要はなくなるが、トラブルがなくても 常に起動されるのでリソースの無駄 ⚫ 開発時など、最初からトラブルが発生することが 分かっていれば有用

Slide 30

Slide 30 text

docker exec ノードからコンテナにアクセス サイドカー コピー エフェメラルコンテナ コンテナのトラブルシューティング方法 © 2023 Fujitsu Limited 30

Slide 31

Slide 31 text

コピーによる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

Slide 32

Slide 32 text

32 コピー © 2023 Fujitsu Limited トラブル時に、アプリコンテナをコピーして、 デバッガ用コンテナを追加 サイドカーより、リソースを節約できるが・・・ ライブマイグレーションするわけではない kubectl debug -it debuggee-pod \ --copy-to debugger-pod \ –share-processes debuggee-pod \ --image JDK-image -- bash

Slide 33

Slide 33 text

docker exec ノードからコンテナにアクセス サイドカー コピー エフェメラルコンテナ コンテナのトラブルシューティング方法 © 2023 Fujitsu Limited 33

Slide 34

Slide 34 text

エフェメラルコンテナによる共有 © 2023 Fujitsu Limited Pod 34 プロセスへのアクセス可能 Pod net uts mnt コンテナ net uts mnt アプリ(JRE) エフェメラル コンテナ デバッガ(JDK) コンテナ mnt アプリ(JRE) pid 追加 pid

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

36 トラブルシューティング方法比較 © 2023 Fujitsu Limited 長所 短所 ノードからコンテナに アクセス N/A ホスト権限が必要 コンテナ視点の欠如 docker exec 手軽 トラシューツールが 使えない場合あり サイドカー トラシューツール用コンテナ とアプリ用コンテナが分離 リソースの無駄 コピー トラブル時にのみコピー可能 トラブルコンテナ そのものを対象にできない エフェメラルコンテナ トラブルコンテナにトラブル時 にのみ、アクセス可能 一度作った エフェメラルコンテナ を削除できない

Slide 37

Slide 37 text

アジェンダ © 2023 Fujitsu Limited Javaコンテナのジレンマ Javaコンテナのトラシュー サマリ perfツール 37

Slide 38

Slide 38 text

38 Linux用ツール https://www.brendangregg.com/linuxperf.html © 2023 Fujitsu Limited 性能調査ツール アプリケーション からカーネル層 まで対応 CPUイベント ベース Java VM(JIT)も 対応

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

JVMのワークロードベンチマーク 手軽に起動可能 複数のテストスイート 41 ルネサンスベンチマーク © 2023 Fujitsu Limited ⚫ https://renaissance.dev/ ⚫ https://github.com/renaissance-benchmarks/renaissance/ $ java -jar 'renaissance-gpl-0.15.0.jar' ⚫ apache-spark / concurrency / database / functional /scala / web

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

アジェンダ © 2023 Fujitsu Limited Javaコンテナのジレンマ Javaコンテナのトラシュー サマリ perfツール 43

Slide 44

Slide 44 text

© 2023 Fujitsu Limited 44 コンテナのポジション (3) トラブルシューティング セキュリティ 起動性能 (1) (2) (3) エフェメラルコンテナなど 小イメージサイズ

Slide 45

Slide 45 text

サマリ © 2023 Fujitsu Limited 45 オンプレで使えたツールが使えない場合あり (Javaコンテナのジレンマ) エフェメラルコンテナなど、複数の対応手法あり 運用環境と独立したトラシュー環境も可能に 起動時間 セキュリティ トラシュー

Slide 46

Slide 46 text

© 2023 Fujitsu Limited Question? 46

Slide 47

Slide 47 text

Thank you © 2023 Fujitsu Limited