Slide 1

Slide 1 text

Cloud Native Developers JP Jibの話 @hhiroshell 1

Slide 2

Slide 2 text

Cloud Native Developers JP • 早川 博(はやかわ ひろし) • 日本オラクル所属 – Cloud Nativeな技術スタック担当のSA – Microservices / DevOps • Cloud Native Developers JP オーガナイザー 自己紹介 @hhiroshell 2 ※ 遊舎工房さんの店舗はこちら

Slide 3

Slide 3 text

Cloud Native Developers JP Jibとは • Java/JVM言語アプリケーションのコンテナイメージ作成を省力化し てくれるツール – https://github.com/GoogleContainerTools/jib • GoogleContainerTools配下のOSSプロジェクト – Apache License 2.0 3

Slide 4

Slide 4 text

Cloud Native Developers JP 4 https://github.com/GoogleContainerTools

Slide 5

Slide 5 text

Cloud Native Developers JP JVMアプリケーション on Kubernetesの開発作業 • コンテナ/Kubernetes上のアプリを開発するのは手間がかかる 1. アプリケーションのコードを編集 2. ローカルでビルド、自動テスト (Maven/Gradleなどのビルドツールを利用) 3. Dockerfileを編集 (必要な場合) 4. docker build / push 5. 開発用のKubernetesクラスターにデプロイ 6. 動作確認 (→ 1. に戻ってくりかえし) 5 アプリケーション開発者のつらみ Jibが解決するつらみ

Slide 6

Slide 6 text

Cloud Native Developers JP アプリケーション開発者の悩み • Dockerfileを書くの難しい。ちゃんと 書けなかったら怒られそう (死にたいぐらい恥ずかしいデート) • docker build は結構時間がかかる。 せっかくゾーンに入ってたのに作業 中断… 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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 ファイルの記述例 →

Slide 9

Slide 9 text

Cloud Native Developers JP Demo 動いているところをちょっとだけ 見てみよう 9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Cloud Native Developers JP まとめと考察 • ローカル開発がかなり快適に。Skaffoldと組み合わせるとなおよい • アプリ開発者/インフラエンジニア分担問題への解になるか…? – Dockerfile作成までがアプリ開発者 → Jib(Maven/Gradleプラグイン)で代用 – アプリ開発者にとっては受け入れやすい • とはいえ、あくまでJVM言語用(しかたない) • 使い込めてないので、安定性は不明…。 13

Slide 14

Slide 14 text

Cloud Native Developers JP Fin. 14