Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SkaffoldでKubernetesネイティブな開発環境を作ってみた

 SkaffoldでKubernetesネイティブな開発環境を作ってみた

2018/06/01 Cloud Native MeetUp Tokyo #2での発表資料です。

hhiroshell

June 01, 2018
Tweet

More Decks by hhiroshell

Other Decks in Technology

Transcript

  1. Cloud Native Developers JP
    SkaffoldでKubernetesネイティブな
    開発環境を作ってみた
    @hhiroshell
    1

    View Slide

  2. Cloud Native Developers JP
    • 早川 博(はやかわ ひろし)
    • 日本オラクル所属
    – ソリューション・アーキテクト的な人
    – Containers, Microservices, DevOps
    • Ergodoxユーザー
    2
    自己紹介
    @hhiroshell

    View Slide

  3. Cloud Native Developers JP
    Skaffoldの概要
    3

    View Slide

  4. Cloud Native Developers JP
    Skaffoldとは
    • Kubernetesに乗せるアプリケーションの開発作業を省力化してくれ
    るコマンドラインツール
    – https://github.com/GoogleContainerTools/skaffold
    • Googleのエンジニアを中心に開発されているOSS
    (GoogleContainerTools配下のプロジェクト)
    – Apache License 2.0
    • 2018年3月発表。最新バージョンはv0.6.1(2018/06/01現在)
    • 類似のツールに、Draft、keelというものがあるらしい
    4

    View Slide

  5. Cloud Native Developers JP 5
    ★ 3,797(最多)

    View Slide

  6. Cloud Native Developers JP 6
    動作確認するだけでも結構手間がかかる…。
    Kubernetesにのせるアプリを開発するときの作業
    1
    アプリの
    コードを編集
    2
    コンテナ
    イメージの
    Build
    3
    コンテナ
    レジストリへ
    Push
    4
    Kubernetesへ
    Deploy
    くりかえし

    View Slide

  7. Cloud Native Developers JP 7
    動作確認するだけでも結構手間がかかる…。
    Kubernetesにのせるアプリを開発するときの作業
    1
    アプリの
    コードを編集
    2
    コンテナ
    イメージの
    Build
    3
    コンテナ
    レジストリへ
    Push
    4
    Kubernetesへ
    Deploy
    くりかえし
    K8sであるが故に必要な作業(面倒くさい)

    View Slide

  8. Cloud Native Developers JP
    2
    Build
    3
    Push
    4
    Deploy
    Skaffold Pipeline
    • Build, Push, Deployの各フェーズで、必要なコマンドを順次自動実
    行してくれるイメージ
    • らくちん!
    8
    面倒なBuild, Push, DeployをSkaffoldで自動化
    > docker build > docker push > kubectl apply

    View Slide

  9. Cloud Native Developers JP
    2
    Build
    3
    Push
    4
    Deploy
    Skaffoldのプラグインアーキテクチャ
    • dockerコマンドとkubectlを自動化する使い方
    9
    各フェーズの実態をプラグイン的に変更できる
    > docker build > docker push > kubectl apply
    Google Container
    Builder
    Google Container
    Registry
    > helm install

    View Slide

  10. Cloud Native Developers JP
    > docker build > docker push > kubectl apply
    Google Container
    Builder
    Google Container
    Registry
    > helm install
    Skaffoldのプラグインアーキテクチャ
    • GKEとhelmの場合
    10
    各フェーズの実態をプラグイン的に変更できる
    2
    Build
    3
    Push
    4
    Deploy

    View Slide

  11. Cloud Native Developers JP
    2
    Build
    3
    Push
    4
    Deploy
    Skaffoldのプラグインアーキテクチャ
    • PushなしでKubernetesにデプロイ。ローカル開発で便利
    11
    各フェーズの実態をプラグイン的に変更できる
    > docker build > docker push > kubectl apply
    Google Container
    Builder
    Google Container
    Registry
    > helm install

    View Slide

  12. Cloud Native Developers JP
    skaffold dev と skaffold run
    • > skaffold dev
    – コンソールのフォアグラウンドに常駐
    – コンテナイメージの依存ファイルに対する変更を検知して、Skaffold Pipeline
    を自動で実行してくれる
    – 開発中のコンテナの標準出力を自動でtailする
    • > skaffold run

    – Skaffold Pipelineを一度だけ実行して終わる
    – CI/CDの中で使うときや、アプリ開発が一段落した後のサニティチェックと
    して
    12
    ローカル開発ではdevの方を積極的に活用しよう

    View Slide

  13. Cloud Native Developers JP
    skaffold.yaml
    ① imageNameでイメージ名を指
    定(タグは自動で付与)
    ② デフォルトではworkspace直下
    のDockerfileをビルド
    ③ skipPosh: trueによりコンテナ
    レジストリへのプッシュ不要で
    直接k8sにデプロイ
    ④ デプロイ時は、manifestsに指
    定したファイルを kubectl
    apply してくれる
    13
    Pipelineの定義ファイル
    1 apiVersion: skaffold/v1alpha2
    2 kind: Config
    3 build:
    4 artifacts:
    5 - imageName: gcr.io/k8s-skaffold/skaffold-example
    6 workspace: .
    7 local:
    8 skipPush: true
    9 deploy:
    10 kubectl:
    11 manifests:
    12 - k8s-*
    13 profiles:
    14 - name: gcb
    15 build:
    16 googleCloudBuild:
    17 projectId: k8s-skaffold
    … ①
    … ②
    … ③
    … ④

    View Slide

  14. Cloud Native Developers JP
    skaffold.yaml
    ⑤ profileによって複数の
    Pipelineを切替えられる
    – この例ではGoogle Container
    Builderでk8s-skaffoldプロジェ
    クトをビルド
    – > scaffold run -p gcb
    14
    Pipelineの定義ファイル
    1 apiVersion: skaffold/v1alpha2
    2 kind: Config
    3 build:
    4 artifacts:
    5 - imageName: gcr.io/k8s-skaffold/skaffold-example
    6 workspace: .
    7 local:
    8 skipPush: true
    9 deploy:
    10 kubectl:
    11 manifests:
    12 - k8s-*
    13 profiles:
    14 - name: gcb
    15 build:
    16 googleCloudBuild:
    17 projectId: k8s-skaffold
    … ⑤

    View Slide

  15. Cloud Native Developers JP
    Demo(基本編)
    ローカル開発で使う
    15

    View Slide

  16. Cloud Native Developers JP
    2
    Build
    3
    Push
    4
    Deploy
    16
    Helmと組み合わせると強力
    Demoで紹介するSkaffold Pipeline
    > docker build > docker push > kubectl apply
    Google Container
    Builder
    Google Container
    Registry
    > helm install

    View Slide

  17. Cloud Native Developers JP
    SkaffoldとHelmの組み合わせでできること
    • ProfileでHelmのパラメータのセットを切り替えてデプロイする
    17
    複数の構成パターンを切り替えつつmanifestを共通化
    4
    Deploy
    chart profile:dev
    chart profile:it
    AP
    svc:NodePort
    namespace: dev
    namespace: it
    AP
    AP
    redis
    redis
    Ingress

    View Slide

  18. Cloud Native Developers JP
    最近追加された機能
    • bazel対応
    – skaffoldのビルドフェーズでbazelが呼べる
    • kaniko対応
    – kaniko: Kubernetesクラスター内のPodでコンテナのビルドを行うツール
    • 特別な権限をつけなくてもビルドが実行できる
    • gVisor上でビルドすることでさらに安全にすることも可
    • skaffoldのBuildフェーズで利用する
    18
    bazel / kaniko対応

    View Slide

  19. Cloud Native Developers JP
    Qiitaに書きました(https://qiita.com/hhiroshell/items/4e3183d3890629f13dec)
    Demo(やってみた編)
    Jnekinsと組合せて使う
    19

    View Slide

  20. Cloud Native Developers JP
    CI/CDツールと組み合わせてみる
    • KubernetesでJenkinsが可動している状態
    20
    Jenkins on Kubernetesの場合の動作イメージ
    Jenkins

    View Slide

  21. Cloud Native Developers JP
    CI/CDツールと組み合わせてみる
    • SlaveがPodととして立ち上がり、そこでパイプラインが実行される
    21
    Jenkins on Kubernetesの場合の動作イメージ
    Jenkins
    Jenkins
    Slave
    Build Push Deploy

    View Slide

  22. Cloud Native Developers JP
    CI/CDツールと組み合わせてみる
    • パイプラインでSkaffoldが実行されアプリがデプロイされる
    22
    Jenkins on Kubernetesの場合の動作イメージ
    Jenkins
    Jenkins
    Slave
    AP
    AP
    redis
    Ingress
    namespace: it

    View Slide

  23. Cloud Native Developers JP
    CI/CDツールと組み合わせてみる
    • パイプラインが終了したらSlaveが消える
    23
    Jenkins on Kubernetesの場合の動作イメージ
    Jenkins AP
    AP
    redis
    Ingress
    namespace: it

    View Slide

  24. Cloud Native Developers JP 24
    Jenkinsfile で定義

    View Slide

  25. Cloud Native Developers JP 25
    1 podTemplate(
    2 label: 'skaffold',
    3 containers: [containerTemplate(
    image: 'hhayakaw/skaffold-insider:v1.0.0', ttyEnabled: true, command: 'cat')],
    4 volumes: [hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')]
    5 ) {
    6 node('skaffold') {
    7 …
    8 stage('Info') {…}
    9 stage('Test skaffold') {
    10 git 'https://github.com/hhiroshell/cowweb.git'
    11 container('skaffold-insider') {
    12 sh """
    13 docker login --username=$DOCKER_ID_USR --password=$DOCKER_ID_PSW
    14 skaffold run -p release
    15 """
    16 }
    17 …
    docker, kubectl, skaffoldをインストールしたコンテナ
    を作っておき、パイプラインで利用
    Docker in Docker…
    (ビルド環境がコンテナ化されているため)

    View Slide

  26. Cloud Native Developers JP 26
    1 podTemplate(
    2 label: 'skaffold',
    3 containers: [containerTemplate(
    image: 'hhayakaw/skaffold-insider:v1.0.0', ttyEnabled: true, command: 'cat')],
    4 volumes: [hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')]
    5 ) {
    6 node('skaffold') {
    7 …
    8 stage('Info') {…}
    9 stage('Test skaffold') {
    10 git 'https://github.com/hhiroshell/cowweb.git'
    11 container('skaffold-insider') {
    12 sh """
    13 docker login --username=$DOCKER_ID_USR --password=$DOCKER_ID_PSW
    14 skaffold run -p release
    15 """
    16 }
    17 …
    profileを指定してskaffoldを使う

    View Slide

  27. Cloud Native Developers JP
    まとめ
    27

    View Slide

  28. Cloud Native Developers JP
    使ってみた感想 - いいところ
    • 安定しているとは言えない
    – かなり頻繁にアップデートされている(発表から3ヶ月で v0.1.0 → v0.6.1)
    – 約1週間使い込んだところ、バグと思しき挙動に2つ遭遇
    – v0.xだからか、マイナーバージョンアップでも仕様が変わることがある
    • とはいえ一度動かしきればメリットは大きい
    – チーム開発に影響しない範囲で、個人として導入するには賛成
    – コーディングが実に捗る
    • Helmとの相性が良い
    – 複数のパラメータのセットを切り替えてデプロイする時に便利
    – skaffold devなら自動でchartのアンインストールまでしてくれる
    28
    ローカル開発で積極的に使っていきたい

    View Slide

  29. Cloud Native Developers JP
    使ってみた感想 – いまいちなところ
    • ひとつのコマンドでいろいろやってくれるのが逆に不便?
    – Build/Push/Deployがひとつのコマンドに集約されており、別々に実行する手段がな
    さそう
    – パイプラインが失敗したときに、どこで問題が起きているのかが見通しが悪い
    • 怪しげなテクニックに依存しがち(Jenkins on k8sの場合)
    – Docker in Docker →kanikoが解決策になるか?
    – クラスター内のPodからkubectlやhelmを使うときの権限周り
    • manifestやHelm chartにこれば凝るほどDevとOpsの境が曖昧に…
    – 「DockerファイルまでがDevです」のような運用を超えてくる
    29
    CI/CDツールと組み合わせるのはまだ難あり

    View Slide

  30. Cloud Native Developers JP
    使ってみた感想 - おまけ
    • Draft、keel
    • 参考: 「SkaffoldとDraftを比べてみた」
    https://qiita.com/watawuwu/items/7f5e287c91e5eab30419
    30
    他のツールもチェックしてみるとよいかも

    View Slide

  31. Cloud Native Developers JP
    Fin.
    31

    View Slide