Above & Beyond

日々のアウトプット記録

OCHaCafe#3 - JDK開発者が語るMicroservicesなJavaアプリケーション

03/07(木) は「OCHaCafe#3 - JDK開発者が語るMicroservicesなJavaアプリケーション」に参加してきました。

ochacafe.connpass.com

f:id:kabukawa:20190303170959p:plain:w500

会場は 日本オラクル株式会社 さんのカフェスペース。

f:id:kabukawa:20190308113501j:plain

外は雨だったんですが、そんな事を忘れてしまうくらい、静かできれいなスペースです。 何度か来ていますが、毎回「こんなスペースが会社にあったら入り浸るよな。。。」と思っちゃいます。 この写真を見てそう思った人は応募してみるといいかもしれません(募集しているのかな?)


目次


OCHaCafe について

1回目に参加した時の参加報告がありますので、こちらもどうぞ。

kabukawa.hatenablog.jp


内容

今回のテーマは「MicroservicesなJavaアプリケーション」。 それをを実現するためにDockerコンテナでJavaを使おうということで OpenJDK Author でもあるOracleの伊藤さんから、 昨年サンフランシスコで開催されたOracle Code One San Francisco で講演された「Java in a World of Containers」の内容の日本語版として

  • OpenJDK コミュニティが行ってきたコンテナに対する取り組み
  • 現在開発中であるProject Portola

を紹介していただきました。

尚、「Java in a World of Containers」のオリジナルの資料は多分これです。

www.slideshare.net

当日のツイートも既にトゥギャられていますので、雰囲気を知りたい方はこちらも是非。

togetter.com

最初から飲み物が提供されていて、この勉強会の「ゆるい雰囲気の中ガチな勉強をする」というのが個人的には大好きです。 しかも今回は飲み物の選択がヤバイ(笑)

f:id:kabukawa:20190308121519j:plain:w400


Java in the World of Container

いとうちひろ さん(Oracle Technologist, OpenJDK Author)

www.slideshare.net

今回のお話は米OracleのDavid Buckさんの講演資料を元にされていますが、かなり補足情報を入れて(スライド枚数が倍)分かりやすく解説をしていただきました。 ということで、内容については自分のツイートを拾いながらという形で。


前半戦

コンテナの世界でのJava(Java in the World of Container)

  • 会場内でJavaをコンテナで使っている人に挙手してもらったら、思ったより多かった(個人的印象)
  • 逆にJavaをコンテナで使ってない理由を問われたので、自分はこんな感じの回答をした。

で、本題。

コンテナの世界で期待されるのは

  • 安全とセキュリティはますます重要に
  • スプロール

Javaはどうか?

  • 管理付きランタイム・⾔語
  • ハードや OS に依存せず
  • JVM によって保証されたセキュリティと安全性
  • 信頼性:互換性は設計⽬標
  • 可搬性:実⾏環境が変更されても、JVM が安定した運⽤を保つ
  • 豊富なエコシステム
  • コンテナの利用なら Java の特徴は理想的


休憩

今回は雨で開始が10分位ずれたこともあり、ここで早めにブレイクして食べ物をいただけることに。 これも毎回のことですが、食べ物はどれもメチャ美味しいです。

なんか写真だけ見ると「勉強しているのかよ!」みたいに思われそうですが、勉強の方はガチですよ、まじで。


後半戦

  • Docker + Java 9。

何も考えずに作るとDockerイメージが巨大になりがち。

  • 229MB OS のベースイメージ
  • 343MB の JDK

ただし、すべてのものが必要なわけではないので、使わないものを削減すればサイズを小さくできるが、モジュールには依存関係が有る。

Java SEモジュール依存関係

カスタム JRE とモジュール

  • JDK 9 でモジュールシステムが導⼊ (“Jigsaw”)
    • JDK ⾃体をモジュール化
    • カスタムの JRE を⽣成するツール
      • アプリが必要とするモジュールや機能だけを含む
  • 最も⼩さい JREjava.base のみを含む
    • 多くのアプリケーションにとって⼗分


カスタムの JRE を⽣成するツールが標準で用意されている。

jlinkとjdeps

docs.oracle.com

docs.oracle.com

jdepsで依存関係を確認し、jlinkで最小構成のカスタムJREを生成する、という感じの流れでしょうか。 ぐぐってみると、使っている(依存している)モジュールが分かっているならjdeps使わないでも大丈夫、という意見も有るようですが、動かないで困るのは自分なのでjdepsで確認したものがjlinkで生成したものに含まれなければ、手動で追加する、という感じになるのかな、たぶん。

カスタムJREのDockerイメージを作成する


JREサイズの最適化と削減結果

更にOS部分をOracle LinuxSlimにすると更に削減

OpenJDK Project “Portola”

  • Provides a port of the JDK to Alpine/musl への JDK ポート

openjdk.java.net

OSをAlpineLinuxに変えると

JVMも見てみると、使わないと思われるものも結構含まれている。

更にその部分も最適化すると、、、

Class Data Sharing

サイズ削減やクラスファイル共有の効果

  • 読み込むものが小さくなることで、起動時間が短縮されるなどの効果が出ることも有る。


Javaが提供するDocker用の機能

詳しくは以下を参照。

blog.gilliard.lol

Docker ⽤の改善

  • JDK-8146115: Docker container detection and resource configuration usage (jdk8, jdk10+)
  • JDK-8186248: More flexible, percentage based heap sizing flags (jdk10+)
  • JDK-8179498: Namespace aware attach (jdk10+)
  • JDK-8193710: Docker container aware jcmd (jdk11+)
  • JDK-8203357: JDK internal Container Metrics API (jdk11+) 51

f:id:kabukawa:20190308134231j:plain:w300 f:id:kabukawa:20190308134247j:plain:w300

f:id:kabukawa:20190308134300j:plain:w300 f:id:kabukawa:20190308134311j:plain:w300


まとめ

  • デフォルトのままのイメージは⼤きい
    • JDK 11: 229MB + 300MB = 529MB
  • サイズを極点に減らすことが可能
    • 適切なベースイメージを利⽤
      • oraclelinux:7-slim は 117MB, alpine は 4MB
    • jlink でカスタム JRE を作成
      • “netty” は 60MB, “java.base” は 46MB (jlink ‒compressed=2 の場合:~38MB)
  • JVM を含む HelloWorld は 38MB 未満のイメージでデプロイ出来る
  • Class Data Sharing で複数の JVM や docker コンテナでクラスのデータを共⽤できる

新機能など

  • [新機能]:cgroup 制限を守るための機能
    • CPUs: --cpuset-cpus, --cpus, --cpu-shares, --cpu-quota
    • Memory: -m
  • [新機能]:“percentage” でヒープサイズを指定する
    • -XX:{Initial,Min,Max}RAMPercentage
  • [新機能]:サービサビリティツールがコンテナ対応になる
    • jps, jcmd, …
  • これからさらに新しい機能などが出る⾒込み

懇親会

懇親会はその日の内容を振り返ったりしながら、スピーカーに質問したり参加者同士で話をしたり。

f:id:kabukawa:20190308135222j:plain

既に食べたり飲んだりは終わっているので、のんびり話をしながら振り返りをするのは結構楽しかったです。 (と書いてから、スピーカーやスタッフの皆さんはいつ食べたり飲んだりしているんだろう、ということが心配になってきた)


まとめ

今回はJavaの話ということで、Java 1.1から触っていた者としてはどれだけ変わっているんだろうという気持ちで参加しました。 実際、かなりの変化に「浦島太郎状態とはこの事か!」ということを感じたわけですが、逆に変わっていないところも再認識できましたし、色々勉強になりました。こうやって聞いた内容を振り返ってみると、分かっていなかったところとかも明らかになるし、そこまで含めて勉強会ですね。 そう考えると、資料が分かりやすく作られているのはこの勉強会で毎回感心するところなのですが、それに加えてすぐに資料を公開してくれたりというのも有り難いです。更に今回はTogetterでツイートまとめも作成されていて、どんどん改善されているなぁと思いました。

ということで、今回も参加できてとても有意義な時間を過ごすことができました。 内容もとても勉強になりました。

今回も、スピーカー、スタッフ、参加者の皆様、本当にありがとうございました!