kpackによるコンテナイメージのビルド
VMware DevOps Meetup #6
2020/10/21
本日の内容
kpackを使ってKubernetes環境でコンテナイメージを作成する方法を紹介します
1. コンテナイメージのビルド方法
2. Cloud Native Buildpacks
3. kpack
4. デモ
● 参考
○ Dockerfileかきたくないでござる
○ Getting Started with VMware Tanzu Build Service 1.0
○ Tanzu Build Service を触ってみる
○ Buildpacksのビルダーをスクラッチから作ってみる
コンテナイメージのビルド方法
● ホスト上でコンテナイメージをビルド
○ docker : Dockerfileからコンテナイメージを作成
○ buildah : デーモンを利用せずに Dockerfileからコンテナイメージを作成
○ pack : Cloud Native Buildpacksを利用してコンテナイメージを作成
● Kubernetes上でコンテナイメージをビルド
○ kaniko : Kubernetes上でDockerfileからコンテナイメージを作成
○ Source-to-Image (S2I) : OpenShiftの機能でコンテナイメージを作成
○ kpack : Kubernetes上でCloud Native Buildpacksを利用してコンテナイメージを作成
● クラウドサービス
○ Google Cloud Build : Cloud Native Buildpacksに対応 (2020/10/10)
○ AWS CodeBuild
○ Azure Container Registry Tasks
Cloud Native Buildpacks(CNB) ?
● BuildpackはPaaSであるCloud FoundryやHerokuで利用されているアプリケー
ション実行環境を作成する仕組み。
○ ソースコードからアプリケーションのフレームワークを認識し、アプリケーションをビルドし、実行可能
なイメージ(Droplet/Slug)を作成する。
● Cloud Native BuildpacksはDockerやKubernetes等でBuildpackの仕組みを活用
してOCI準拠のコンテナイメージを作成する事を可能にする。
○ CNBはCNCFのSandboxプロジェクト。
○ CNBの実装
■ Paketo Buildpacks : Cloud Foundry Foundationのプロジェクト
■ Heroku Buildpacks : Heroku向けのBuildpack
■ Google Cloud Buildpacks : Google Cloudのコンテナプラットフォームに最適化
https://buildpacks.io/
CNBのコンポーネント
● Builder : ビルドに利用するコンテナイメージ。Buildpackとビルドに利用するBuild/Runイメー
ジ(Stack)で構成される。
● Buildpack : ソースコードの検出、アプリケーションのビルドや実行方法を定義
● Stack : Builderがイメージ作成時に利用する、ビルド用・実行用のイメージ
● Lifecycle : Buildpackの実行をオーケストレーションし、アプリケーションイメージを組み立て
る。
● Platform : OCIイメージを作成するために利用されるプラットフォーム(pack cli、kpack、
tekton等)
https://buildpacks.io/docs/concepts/components/
pack : Buildpack CLI
● Dockerとpackコマンドによりコンテナイメージを作
成
● Builderイメージを指定して、Dockerfileを利用せ
ずにアプリケーションソースコードから、アプリケー
ションを自動検出してコンテナイメージを作成
● ビルドしたコンテナイメージをレジストリにプッシュ
することも可能。(--publish)
● リベースによりベースイメージだけ変更することも
可能。(pack rebase)
# git clone https://github.com/buildpacks/samples
# cd samples
# ls apps/
aspnet bash-script batch-script java-maven kotlin-gradle README.md ruby-bundler
# ls java-maven/
mvnw mvnw.cmd pom.xml src
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# pack build -p apps/java-maven --builder cnbs/sample-builder:bionic sample-app
===> DETECTING
[detector] samples/java-maven 0.0.1
===> ANALYZING
===> RESTORING
===> BUILDING
[builder] ---> Java buildpack
[builder] ---> Installing JDK
===> EXPORTING
[exporter] Adding layer 'samples/java-maven:jdk'
[exporter] Adding 1/1 app layer(s)
[exporter] Adding layer 'launcher'
[exporter] Adding layer 'config'
[exporter] Adding layer 'process-types'
[exporter] Adding label 'io.buildpacks.lifecycle.metadata'
[exporter] Adding label 'io.buildpacks.build.metadata'
[exporter] Adding label 'io.buildpacks.project.metadata'
[exporter] Setting default process type 'web'
[exporter] *** Images (68472453e67b):
[exporter] sample-app
[exporter] Reusing cache layer 'samples/java-maven:jdk'
[exporter] Adding cache layer 'samples/java-maven:maven_m2'
Successfully built image sample-app
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cnbs/sample-stack-run bionic d57edd2cacb1 3 weeks ago 70.3MB
cnbs/sample-builder bionic a1fff020741a 40 years ago 180MB
sample-app latest 68472453e67b 40 years ago 300MB
buildpacksio/lifecycle 0.9.1 1a8d17b1a7a7 40 years ago 15.1MB
https://buildpacks.io/docs/app-journey/
base-1
Java
App
base-2
Java
App
rebase
kpack
● Kubernetes Native Container Build Service
● Kubernetesを拡張して、Kubernetes上でCNBを利用するための仕組み
○ コンテナイメージのビルドは Kubernetes上のPod内で行われる
○ builderやstack、作成されるimage等がKubernetesのCRD(Custom Resource Definition)として管
理される。
● VMware(旧Pivotal)が中心となって開発
○ Tanzu Build Service(TBS)はkpackをVMwareがサポートするもの (2020/8 GA v1.0.2)
○ TBSではStackやBuilder等が事前定義されていて、 kpack向けのCustom Resourceを直接操作せ
ずにkpコマンドを利用して簡単に利用可能
● Cloud Foundry for Kubernetes(cf-for-k8s)のコンポーネントとしても利用されてい
る。(cf pushされたソースコードからコンテナイメージをビルド)
https://github.com/pivotal/kpack
kpackのインストール
● kpack Tutorial : https://github.com/pivotal/kpack/blob/master/docs/tutorial.md
# kubectl get pods -n kpack
NAME READY STATUS RESTARTS AGE
kpack-controller-6f57d5f7d-zzrf7 1/1 Running 0 10m
kpack-webhook-5cf99c5cd7-tf87m 1/1 Running 0 10m
# kubectl get crd | grep kpack
builders.kpack.io 2020-10-14T05:54:54Z
builds.kpack.io 2020-10-14T05:54:54Z
clusterbuilders.kpack.io 2020-10-14T05:54:54Z
clusterstacks.kpack.io 2020-10-14T05:54:54Z
clusterstores.kpack.io 2020-10-14T05:54:54Z
images.kpack.io 2020-10-14T05:54:54Z
sourceresolvers.kpack.io 2020-10-14T05:54:54Z
kpackではbuilderをCRにより構成。
Builder = Store + Stack
apiVersion: kpack.io/v1alpha1
kind: ClusterStore
metadata:
name: default
spec:
sources:
- image: gcr.io/paketo-buildpacks/go
- image: gcr.io/paketo-buildpacks/java
- image: gcr.io/paketo-buildpacks/nodejs
apiVersion: kpack.io/v1alpha1
kind: ClusterStack
metadata:
name: full
spec:
id: "io.buildpacks.stacks.bionic"
buildImage:
image: "paketobuildpacks/build:full-cnb"
runImage:
image: "paketobuildpacks/run:full-cnb"
apiVersion: kpack.io/v1alpha1
kind: Builder
metadata:
name: my-builder
spec:
tag: masanara/my-builder
serviceAccount: kpack-service-account
stack:
name: full
kind: ClusterStack
store:
name: default
kind: ClusterStore
order:
- group:
- id: paketo-buildpacks/go
- group:
- id: paketo-buildpacks/java
- group:
- id: paketo-buildpacks/nodejs
Imageの作成
作成するコンテナイメージのレジストリ/タグ、ビルドに利用するBuilder、ビルドに利用す
るソースコードのリポジトリを指定。
apiVersion: kpack.io/v1alpha1
kind: Image
metadata:
name: go-demoweb
namespace: demo
spec:
tag: harbor.example.com/project/go-demoweb-kpack
serviceAccount: tutorial-service-account
builder:
name: tiny-builder
kind: Builder
source:
git:
url: https://github.com/user/go-demoweb
revision: master
デモ
デモにはTanzu Build Service / kpコマンドを利用しています
Container
Registry
1. イメージの作成
build-1image
$ kp image create go-helloworld 
--tag harbor.examle.com/app-image/go-helloworld 
--git https://github.com/user/go-helloworld.git 
--git-revision master
Builder
(default)
Stack
(full)
Store
(Buildpacks)
Container
Registry
2. イメージの更新
imageimage’ build-1
build-2
masterブランチ
にコミット
Builder
(default)
Stack
(full)
Store
(Buildpacks)
Container
Registry
3. ベースイメージの更新 (リベース)
image build-1
build-2
image’’
build-3
Builder
(default)
Stack
(full)
Store
(Buildpacks)
Builder
(tiny)
Stack
(tiny)
Store
(Buildpacks)
$ kp image patch go-demoweb --cluster-builder tiny
kpackをつかうと
● Dockerfileを書かずにコンテナイメージを作成できる
● Kubernertesクラスター内でコンテナイメージを作成することが可能
● ベースイメージに脆弱性が発見された場合もリベースにより対応が簡単
● kpackだけでgitリポジトリのコミットをトリガーにしてコンテナイメージのビルドを自動
化できる

kpackによるコンテナイメージのビルド

  • 1.
  • 2.
    本日の内容 kpackを使ってKubernetes環境でコンテナイメージを作成する方法を紹介します 1. コンテナイメージのビルド方法 2. CloudNative Buildpacks 3. kpack 4. デモ ● 参考 ○ Dockerfileかきたくないでござる ○ Getting Started with VMware Tanzu Build Service 1.0 ○ Tanzu Build Service を触ってみる ○ Buildpacksのビルダーをスクラッチから作ってみる
  • 3.
    コンテナイメージのビルド方法 ● ホスト上でコンテナイメージをビルド ○ docker: Dockerfileからコンテナイメージを作成 ○ buildah : デーモンを利用せずに Dockerfileからコンテナイメージを作成 ○ pack : Cloud Native Buildpacksを利用してコンテナイメージを作成 ● Kubernetes上でコンテナイメージをビルド ○ kaniko : Kubernetes上でDockerfileからコンテナイメージを作成 ○ Source-to-Image (S2I) : OpenShiftの機能でコンテナイメージを作成 ○ kpack : Kubernetes上でCloud Native Buildpacksを利用してコンテナイメージを作成 ● クラウドサービス ○ Google Cloud Build : Cloud Native Buildpacksに対応 (2020/10/10) ○ AWS CodeBuild ○ Azure Container Registry Tasks
  • 4.
    Cloud Native Buildpacks(CNB)? ● BuildpackはPaaSであるCloud FoundryやHerokuで利用されているアプリケー ション実行環境を作成する仕組み。 ○ ソースコードからアプリケーションのフレームワークを認識し、アプリケーションをビルドし、実行可能 なイメージ(Droplet/Slug)を作成する。 ● Cloud Native BuildpacksはDockerやKubernetes等でBuildpackの仕組みを活用 してOCI準拠のコンテナイメージを作成する事を可能にする。 ○ CNBはCNCFのSandboxプロジェクト。 ○ CNBの実装 ■ Paketo Buildpacks : Cloud Foundry Foundationのプロジェクト ■ Heroku Buildpacks : Heroku向けのBuildpack ■ Google Cloud Buildpacks : Google Cloudのコンテナプラットフォームに最適化 https://buildpacks.io/
  • 5.
    CNBのコンポーネント ● Builder :ビルドに利用するコンテナイメージ。Buildpackとビルドに利用するBuild/Runイメー ジ(Stack)で構成される。 ● Buildpack : ソースコードの検出、アプリケーションのビルドや実行方法を定義 ● Stack : Builderがイメージ作成時に利用する、ビルド用・実行用のイメージ ● Lifecycle : Buildpackの実行をオーケストレーションし、アプリケーションイメージを組み立て る。 ● Platform : OCIイメージを作成するために利用されるプラットフォーム(pack cli、kpack、 tekton等) https://buildpacks.io/docs/concepts/components/
  • 6.
    pack : BuildpackCLI ● Dockerとpackコマンドによりコンテナイメージを作 成 ● Builderイメージを指定して、Dockerfileを利用せ ずにアプリケーションソースコードから、アプリケー ションを自動検出してコンテナイメージを作成 ● ビルドしたコンテナイメージをレジストリにプッシュ することも可能。(--publish) ● リベースによりベースイメージだけ変更することも 可能。(pack rebase) # git clone https://github.com/buildpacks/samples # cd samples # ls apps/ aspnet bash-script batch-script java-maven kotlin-gradle README.md ruby-bundler # ls java-maven/ mvnw mvnw.cmd pom.xml src # docker images REPOSITORY TAG IMAGE ID CREATED SIZE # pack build -p apps/java-maven --builder cnbs/sample-builder:bionic sample-app ===> DETECTING [detector] samples/java-maven 0.0.1 ===> ANALYZING ===> RESTORING ===> BUILDING [builder] ---> Java buildpack [builder] ---> Installing JDK ===> EXPORTING [exporter] Adding layer 'samples/java-maven:jdk' [exporter] Adding 1/1 app layer(s) [exporter] Adding layer 'launcher' [exporter] Adding layer 'config' [exporter] Adding layer 'process-types' [exporter] Adding label 'io.buildpacks.lifecycle.metadata' [exporter] Adding label 'io.buildpacks.build.metadata' [exporter] Adding label 'io.buildpacks.project.metadata' [exporter] Setting default process type 'web' [exporter] *** Images (68472453e67b): [exporter] sample-app [exporter] Reusing cache layer 'samples/java-maven:jdk' [exporter] Adding cache layer 'samples/java-maven:maven_m2' Successfully built image sample-app # docker images REPOSITORY TAG IMAGE ID CREATED SIZE cnbs/sample-stack-run bionic d57edd2cacb1 3 weeks ago 70.3MB cnbs/sample-builder bionic a1fff020741a 40 years ago 180MB sample-app latest 68472453e67b 40 years ago 300MB buildpacksio/lifecycle 0.9.1 1a8d17b1a7a7 40 years ago 15.1MB https://buildpacks.io/docs/app-journey/ base-1 Java App base-2 Java App rebase
  • 7.
    kpack ● Kubernetes NativeContainer Build Service ● Kubernetesを拡張して、Kubernetes上でCNBを利用するための仕組み ○ コンテナイメージのビルドは Kubernetes上のPod内で行われる ○ builderやstack、作成されるimage等がKubernetesのCRD(Custom Resource Definition)として管 理される。 ● VMware(旧Pivotal)が中心となって開発 ○ Tanzu Build Service(TBS)はkpackをVMwareがサポートするもの (2020/8 GA v1.0.2) ○ TBSではStackやBuilder等が事前定義されていて、 kpack向けのCustom Resourceを直接操作せ ずにkpコマンドを利用して簡単に利用可能 ● Cloud Foundry for Kubernetes(cf-for-k8s)のコンポーネントとしても利用されてい る。(cf pushされたソースコードからコンテナイメージをビルド) https://github.com/pivotal/kpack
  • 8.
    kpackのインストール ● kpack Tutorial: https://github.com/pivotal/kpack/blob/master/docs/tutorial.md # kubectl get pods -n kpack NAME READY STATUS RESTARTS AGE kpack-controller-6f57d5f7d-zzrf7 1/1 Running 0 10m kpack-webhook-5cf99c5cd7-tf87m 1/1 Running 0 10m # kubectl get crd | grep kpack builders.kpack.io 2020-10-14T05:54:54Z builds.kpack.io 2020-10-14T05:54:54Z clusterbuilders.kpack.io 2020-10-14T05:54:54Z clusterstacks.kpack.io 2020-10-14T05:54:54Z clusterstores.kpack.io 2020-10-14T05:54:54Z images.kpack.io 2020-10-14T05:54:54Z sourceresolvers.kpack.io 2020-10-14T05:54:54Z
  • 9.
    kpackではbuilderをCRにより構成。 Builder = Store+ Stack apiVersion: kpack.io/v1alpha1 kind: ClusterStore metadata: name: default spec: sources: - image: gcr.io/paketo-buildpacks/go - image: gcr.io/paketo-buildpacks/java - image: gcr.io/paketo-buildpacks/nodejs apiVersion: kpack.io/v1alpha1 kind: ClusterStack metadata: name: full spec: id: "io.buildpacks.stacks.bionic" buildImage: image: "paketobuildpacks/build:full-cnb" runImage: image: "paketobuildpacks/run:full-cnb" apiVersion: kpack.io/v1alpha1 kind: Builder metadata: name: my-builder spec: tag: masanara/my-builder serviceAccount: kpack-service-account stack: name: full kind: ClusterStack store: name: default kind: ClusterStore order: - group: - id: paketo-buildpacks/go - group: - id: paketo-buildpacks/java - group: - id: paketo-buildpacks/nodejs
  • 10.
    Imageの作成 作成するコンテナイメージのレジストリ/タグ、ビルドに利用するBuilder、ビルドに利用す るソースコードのリポジトリを指定。 apiVersion: kpack.io/v1alpha1 kind: Image metadata: name:go-demoweb namespace: demo spec: tag: harbor.example.com/project/go-demoweb-kpack serviceAccount: tutorial-service-account builder: name: tiny-builder kind: Builder source: git: url: https://github.com/user/go-demoweb revision: master
  • 11.
    デモ デモにはTanzu Build Service/ kpコマンドを利用しています
  • 12.
    Container Registry 1. イメージの作成 build-1image $ kpimage create go-helloworld --tag harbor.examle.com/app-image/go-helloworld --git https://github.com/user/go-helloworld.git --git-revision master Builder (default) Stack (full) Store (Buildpacks)
  • 13.
  • 14.
    Container Registry 3. ベースイメージの更新 (リベース) imagebuild-1 build-2 image’’ build-3 Builder (default) Stack (full) Store (Buildpacks) Builder (tiny) Stack (tiny) Store (Buildpacks) $ kp image patch go-demoweb --cluster-builder tiny
  • 15.
    kpackをつかうと ● Dockerfileを書かずにコンテナイメージを作成できる ● Kubernertesクラスター内でコンテナイメージを作成することが可能 ●ベースイメージに脆弱性が発見された場合もリベースにより対応が簡単 ● kpackだけでgitリポジトリのコミットをトリガーにしてコンテナイメージのビルドを自動 化できる