「Jib」という、JVMアプリケーションのコンテナ化を支援するツールについてまとめました。 Cloud Native Meetup Tokyo #7 @Abema Towers での発表資料(LT枠)です。 https://cloudnative.connpass.com/event/123324/
Cloud Native Developers JPJibの話@hhiroshell1
View Slide
Cloud Native Developers JP• 早川 博(はやかわ ひろし)• 日本オラクル所属– Cloud Nativeな技術スタック担当のSA– Microservices / DevOps• Cloud Native Developers JP オーガナイザー自己紹介@hhiroshell2※ 遊舎工房さんの店舗はこちら
Cloud Native Developers JPJibとは• Java/JVM言語アプリケーションのコンテナイメージ作成を省力化してくれるツール– https://github.com/GoogleContainerTools/jib• GoogleContainerTools配下のOSSプロジェクト– Apache License 2.03
Cloud Native Developers JP 4https://github.com/GoogleContainerTools
Cloud Native Developers JPJVMアプリケーション on Kubernetesの開発作業• コンテナ/Kubernetes上のアプリを開発するのは手間がかかる1. アプリケーションのコードを編集2. ローカルでビルド、自動テスト(Maven/Gradleなどのビルドツールを利用)3. Dockerfileを編集(必要な場合)4. docker build / push5. 開発用のKubernetesクラスターにデプロイ6. 動作確認(→ 1. に戻ってくりかえし)5アプリケーション開発者のつらみJibが解決するつらみ
Cloud Native Developers JPアプリケーション開発者の悩み• Dockerfileを書くの難しい。ちゃんと書けなかったら怒られそう(死にたいぐらい恥ずかしいデート)• docker build は結構時間がかかる。せっかくゾーンに入ってたのに作業中断…6
Cloud Native Developers JPJibを使うとここが嬉しい• 使い慣れたビルドツール(Maven/Gradle)とプラグインだけでコンテナイメージが作成できる– Dockerfileフリー。使い慣れた記述形式– Dockerfileのベストプラクティスを知らなくても高品質のコンテナが作れる(JVMアプリとして必要なファイルだけを選択的にコンテナに入れてくれる)• コーディングが滞らない– 高速でコンテナイメージをビルド。ずっとゾーンにいられる[^1]7[^1] 効果には個人差があります。i
Cloud Native Developers JPMaven/GradleプラグインとしてのJibの利用方法• Maven/GradleのプラグインとしてJibを指定• 作成するコンテナイメージのプロパティをプラグインの設定値として記述する– mainClass : ENTRYPOINTとなるクラス– ports : コンテナの公開ポート– jvmFlags : JVMに与えるオプション(…etc)8plugins {applicationkotlin("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 containersjvmFlags = listOf(“-server”,“-Djava.awt.headless=true”,“-XX:+UnlockExperimentalVMOptions”,(…snip…))}}build.gradle ファイルの記述例 →
Cloud Native Developers JPDemo動いているところをちょっとだけ見てみよう9
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.jar1.2 MB app/libs/kotlin-stdlib-1.3.10.jar784 kB app/libs/kotlinx-coroutines-core-1.0.1.jar730 kB app/libs/kotlinx-html-jvm-0.6.11.jar(… snip …)============================================================814 B $ jib-gradle-plugin:1.0.1============================================================474 B app/resources/logback.xml333 B app/resources/application.conf7 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.class4.9 kB app/classes/example/ktor/AppKt$init$1$1.class4.8 kB app/classes/example/ktor/AppKt$router$1$4$2.class4.0 kB app/classes/example/ktor/AppKt$router$1$3.class(… snip …)↑ dlayer(by @orisanoさん) にかけた結果の抜粋https://github.com/orisano/dlayer
Cloud Native Developers JPもう少し詳しいJibの話 2/3 – Jibライブラリの構成• Maven/Gradeプラグインがjib-plugins-common経由でCore APIを参照11Jib.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-pluginjib-gradle-pluginjib-plugins-common jib-core
Cloud Native Developers JPもう少し詳しいJibの話 3/3 – Skaffoldと連携可能• Skaffoldから呼び出すビルドプラグインとしてJibを利用可能1. アプリケーションのコードを編集2. ローカルでビルド、自動テスト(Maven/Gradleなどのビルドツールを利用)3. Dockerfileを編集(必要な場合)4. docker build / push5. 開発用のKubernetesクラスターにデプロイ6. 動作確認(→ 1. に戻ってくりかえし)12Skaffoldと組み合わせて全部解決Jibが解決するつらみSkaffoldについての詳細はhttps://speakerdeck.com/hhiroshell/skaffolddekubernetesneiteibunakai-fa-huan-jing-wozuo-tutemita
Cloud Native Developers JPまとめと考察• ローカル開発がかなり快適に。Skaffoldと組み合わせるとなおよい• アプリ開発者/インフラエンジニア分担問題への解になるか…?– Dockerfile作成までがアプリ開発者 → Jib(Maven/Gradleプラグイン)で代用– アプリ開発者にとっては受け入れやすい• とはいえ、あくまでJVM言語用(しかたない)• 使い込めてないので、安定性は不明…。13
Cloud Native Developers JPFin.14