Jibの話 / about Jib

36bb9dcd778d2a9621d44e92425d0907?s=47 hhiroshell
March 29, 2019
830

Jibの話 / about Jib

「Jib」という、JVMアプリケーションのコンテナ化を支援するツールについてまとめました。
Cloud Native Meetup Tokyo #7 @Abema Towers での発表資料(LT枠)です。
https://cloudnative.connpass.com/event/123324/

36bb9dcd778d2a9621d44e92425d0907?s=128

hhiroshell

March 29, 2019
Tweet

Transcript

  1. Cloud Native Developers JP Jibの話 @hhiroshell 1

  2. Cloud Native Developers JP • 早川 博(はやかわ ひろし) • 日本オラクル所属

    – Cloud Nativeな技術スタック担当のSA – Microservices / DevOps • Cloud Native Developers JP オーガナイザー 自己紹介 @hhiroshell 2 ※ 遊舎工房さんの店舗はこちら
  3. Cloud Native Developers JP Jibとは • Java/JVM言語アプリケーションのコンテナイメージ作成を省力化し てくれるツール – https://github.com/GoogleContainerTools/jib

    • GoogleContainerTools配下のOSSプロジェクト – Apache License 2.0 3
  4. Cloud Native Developers JP 4 https://github.com/GoogleContainerTools

  5. Cloud Native Developers JP JVMアプリケーション on Kubernetesの開発作業 • コンテナ/Kubernetes上のアプリを開発するのは手間がかかる 1.

    アプリケーションのコードを編集 2. ローカルでビルド、自動テスト (Maven/Gradleなどのビルドツールを利用) 3. Dockerfileを編集 (必要な場合) 4. docker build / push 5. 開発用のKubernetesクラスターにデプロイ 6. 動作確認 (→ 1. に戻ってくりかえし) 5 アプリケーション開発者のつらみ Jibが解決するつらみ
  6. Cloud Native Developers JP アプリケーション開発者の悩み • Dockerfileを書くの難しい。ちゃんと 書けなかったら怒られそう (死にたいぐらい恥ずかしいデート) •

    docker build は結構時間がかかる。 せっかくゾーンに入ってたのに作業 中断… 6
  7. Cloud Native Developers JP Jibを使うとここが嬉しい • 使い慣れたビルドツール(Maven/Gradle)とプラグインだけでコンテナ イメージが作成できる – Dockerfileフリー。使い慣れた記述形式

    – Dockerfileのベストプラクティスを知らなくても高品質のコンテナが作れる (JVMアプリとして必要なファイルだけを選択的にコンテナに入れてくれる) • コーディングが滞らない – 高速でコンテナイメージをビルド。ずっとゾーンにいられる[^1] 7 [^1] 効果には個人差があります。 i
  8. Cloud Native Developers JP Maven/GradleプラグインとしてのJibの利用方法 • Maven/Gradleのプラグインとして Jibを指定 • 作成するコンテナイメージのプロ

    パティをプラグインの設定値とし て記述する – mainClass : ENTRYPOINTとなるクラス – ports : コンテナの公開ポート – jvmFlags : JVMに与えるオプション (…etc) 8 plugins { application kotlin("jvm") version "1.3.10" id("com.google.cloud.tools.jib") version "1.0.1" } (…snip…) val main_class by extra("io.ktor.server.netty.EngineMain") (…snip…) Jib { container { ports = listOf(“8080”) mainClass = main_class // good defauls intended for Java 8 containers jvmFlags = listOf( “-server”, “-Djava.awt.headless=true”, “-XX:+UnlockExperimentalVMOptions”, (…snip…) ) } } build.gradle ファイルの記述例 →
  9. Cloud Native Developers JP Demo 動いているところをちょっとだけ 見てみよう 9

  10. Cloud Native Developers JP もう少し詳しいJibの話 1/3 – イメージ作成の仕組み • ベースイメージに以下のレイヤーを

    足したイメージが作られる – 依存ライブラリ(.jar) – リソース(.conf, .properties, …etc) – classファイル(.class) (それぞれ別のレイヤー) • ファイルの変更内容に応じて必要な レイヤーを更新するだけなので高速 10 (… snip …) ============================================================ 13 MB $ jib-gradle-plugin:1.0.1 ============================================================ 2.6 MB app/libs/kotlin-reflect-1.3.10.jar 1.2 MB app/libs/kotlin-stdlib-1.3.10.jar 784 kB app/libs/kotlinx-coroutines-core-1.0.1.jar 730 kB app/libs/kotlinx-html-jvm-0.6.11.jar (… snip …) ============================================================ 814 B $ jib-gradle-plugin:1.0.1 ============================================================ 474 B app/resources/logback.xml 333 B app/resources/application.conf 7 B app/resources/hoge.conf ============================================================ 57 kB $ jib-gradle-plugin:1.0.1 ============================================================ 6.0 kB app/classes/example/ktor/AppKt$router$1$4$1.class 4.9 kB app/classes/example/ktor/AppKt$init$1$1.class 4.8 kB app/classes/example/ktor/AppKt$router$1$4$2.class 4.0 kB app/classes/example/ktor/AppKt$router$1$3.class (… snip …) ↑ dlayer(by @orisanoさん) にかけた結果の抜粋 https://github.com/orisano/dlayer
  11. Cloud Native Developers JP もう少し詳しいJibの話 2/3 – Jibライブラリの構成 • Maven/Gradeプラグインがjib-plugins-common経由でCore

    APIを参照 11 Jib.from("busybox") .addLayer(Arrays.asList(Paths.get("helloworld.sh")), AbsoluteUnixPath.get("/")) .setEntrypoint("sh", "/helloworld.sh") .containerize( Containerizer.to(RegistryImage.named("gcr.io/my-project/hello-from-jib") .addCredential("myusername", "mypassword"))); • Core APIを利用することで、イメージ作成をJavaコードで記述できる jib-maven-plugin jib-gradle-plugin jib-plugins-common jib-core
  12. Cloud Native Developers JP もう少し詳しいJibの話 3/3 – Skaffoldと連携可能 • Skaffoldから呼び出すビルドプラグインとしてJibを利用可能

    1. アプリケーションのコードを編集 2. ローカルでビルド、自動テスト (Maven/Gradleなどのビルドツールを利用) 3. Dockerfileを編集 (必要な場合) 4. docker build / push 5. 開発用のKubernetesクラスターにデプロイ 6. 動作確認 (→ 1. に戻ってくりかえし) 12 Skaffoldと組み合わせて全部解決 Jibが解決するつらみ Skaffoldについての詳細は https://speakerdeck.com/hhiroshell/skaffolddekubernetesneiteibunakai-fa-huan-jing-wozuo-tutemita
  13. Cloud Native Developers JP まとめと考察 • ローカル開発がかなり快適に。Skaffoldと組み合わせるとなおよい • アプリ開発者/インフラエンジニア分担問題への解になるか…? –

    Dockerfile作成までがアプリ開発者 → Jib(Maven/Gradleプラグイン)で代用 – アプリ開発者にとっては受け入れやすい • とはいえ、あくまでJVM言語用(しかたない) • 使い込めてないので、安定性は不明…。 13
  14. Cloud Native Developers JP Fin. 14