$30 off During Our Annual Pro Sale. View Details »

Jibの話 / about Jib

hhiroshell
March 29, 2019
1.5k

Jibの話 / about Jib

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

hhiroshell

March 29, 2019
Tweet

More Decks by hhiroshell

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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が解決するつらみ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  14. Cloud Native Developers JP
    Fin.
    14

    View Slide