Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンテナ環境でのJavaトラブルシューティング

 コンテナ環境でのJavaトラブルシューティング

JJUG CCC 2023 Fall

Kenji Kazumura

November 11, 2023
Tweet

More Decks by Kenji Kazumura

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  22. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  39. 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

    View full-size slide

  40. 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

    View full-size slide

  41. 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

    View full-size slide

  42. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  46. © 2023 Fujitsu Limited
    Question?
    46

    View full-size slide

  47. Thank you
    © 2023 Fujitsu Limited

    View full-size slide