Kekeの日記

エンジニア、読書なんでも

SkaffoldとDraftを比較してみる

f:id:bobchan1915:20190519191238p:plain

動機

私は新卒としてとある会社のエンジニアになったわけですが、同期に「Skaffoldってどうなの?チームで導入する価値ある?」のような質問を受けました。

私の意見としては、必要がない、と答えました。というのも、

*入社した会社が導入していないこと * 継続的デリバリーの(悪い意味ではなく)底辺であり、ローカルからである * シンプルさ故に機能不足

などいくつも理由が挙げられます。もとより、この分野は興味がなかったためSkaffoldやDraft、GitKubeなどしっかりとした調査はしたことがなかったです。

今回はその同期からいただいた質問を発条に、調査していこうと思います。

今回のアジェンダ

今回のアジェンダは以下の通りです。

Productの概要

それぞれのProductについて概要をまとめます。詳細に書くと記事自体が長くなってしまうので、適切に割愛させていただきます。

1. Skaffold

f:id:bobchan1915:20190519191419p:plain

Skaffoldについて解説します。

概要

Skaffoldとは継続的デリバリーを実現するGoogle製のCLIツールです

フロー的には以下のようになっています。

f:id:bobchan1915:20190518044023p:plain
Skaffoldのワークフロー

特徴

1. サーバー側にコンポーネントが必要がないのでオーバーヘッドがない

便利なツールでもサーバーサイドにコンポーネントを必要とするものがあります。

  • Single クラスタで運用するSpinnaker
  • HelmでいうTiller

などがあります。しかしながらSkaffoldはローカルサイドで継続的デリバリーを実現するため、クラスタ自体のリソースを使うことはありません。

2. 簡単にアプリケーションを構築できる

例えばアプリケーションを配布したい場合、

  • git clone
  • skaffold run

をするだけでよくなります。

3. 差し込みできるのでHelmなども使える

Helmを使っているからといって、今までのリソースファイルを書き直す必要はありません。

以下の機能をサポートしています。

  • ビルド
    • ローカルでDockerfileをビルド
    • Kanikoを使ってクラスタ内でDockerfileをビルド
    • Google Cloud Buildを使ってDockerfileをビルド
    • ローカルでBazelでビルド
    • ローカルでJib Maven/Gradleでビルド
  • テスト
    • コンテナ構造テスト
  • デプロイ
    • kubectlを使ったデプロイ
    • Helm
    • kustomize
  • Tag
    • コミットによってtagをつける
    • 現在時刻でtagをつける
    • テンプレートに基づく環境変数でtagをつける
    • ソースのchecksumでtagをつける
  • Push
    • ローカルデーモンで管理し、Pushをしないこと
    • レジストリにPushをする

これ以外にも機能があって

  • kubectl port-forwardによるポート転送
  • デプロイされたPodのログ集約

があり、シンプルですが多機能です。

公式サイト・リポジトリ

github.com

skaffold-latest.firebaseapp.com

Demo

Demoをします。このページを見ればすぐにわかります。

skaffold-latest.firebaseapp.com

1. skaffold.yamlを書く

最初は以下のようにファイルを生成します。

skaffold init

そして必要なskaffold.yamlを簡単に書きます。

1.1 build

bulidはローカルファイルで行うので

build:
  artifacts:
  - image: gcr.io/keke-test/go-api
  local: {}
1.2 Test

buildをしたあと、コンテナの一貫性をチェックするコンテナ構造テストを実行します。

詳しいテスト内容は以下のテストラナーでチェックをしてみてください。

github.com

1.3 deploy

今回はHelmを使ってやっていきます。

deploy:
  helm:
    releases:
    - name: go-api
      chartPath: helm/go-api
      namespace: prod
      values:
        image: gcr.io/keke-test/go-api

deploy.helm.releases[].valuesはHelmチャートの設定値です。

2. オペレーション

以下のコマンドを使って実行します。

skaffold dev

別のコマンドでdevというコマンドがあるので、簡単に解説します。

  • skaffold dev: ソースを監視して、ビルドからデプロイまで実行する
  • skaffold run: 手動でワークフローを実行する

3. その他の設定値

その他に設定できるフィールドがあります。重要な分だけ載せておきます。

フィールド 概要
apiVersion Skaffoldのバージョンです。現在はskaffold/v1beta10になっています。
kind リソースの種類です。必ずConfigです。

2. Draft

f:id:bobchan1915:20190519191401p:plain

Draftについて解説をします。

概要

DraftとはKubernetesへのデプロイをストリームライン化するためのツールです

まだ実験段階であり、プロダクション環境へ導入することは推奨されていません。

特徴

1. 開発をシンプルにする

f:id:bobchan1915:20190519033654p:plain

draft updraft createの二つのコマンドだけで開発をすることができます。

2. 言語サポート

f:id:bobchan1915:20190519033749p:plain

Draftはアプリケーションの使用言語を検出して、適切なDockerfileとHelm Chartを使います。

現在は.NET, GO, NODE, PHP, JAVA (Maven, Gradle), PYTHONとRUBYのサポートしています。

3. Helmを想定している

Helmを使っていることを想定しているので、現在のアプリケーションとの親和性が必要です。

公式サイト・リポジトリ

github.com

draft.sh

Demo

Demoをします。まず、最初にパッケージを入れるために

draft init

をしましょう。Happy Sailing!と出たら、開始できます。

あとコンテナイメージを格納する場所の設定が必要です。

draft config set registry gcr.io/$(gcloud config get-value project)

1. アーティファクトの作成

リポジトリのルートディレクトリで以下のコマンドを実行します。

draft create

すると三つのファイルが生成されます。

  • .draftignore
  • draft.toml
  • .draft-tasks.toml

2. デプロイする

以下のようにしてKubernetesクラスタへデプロイをします。

draft up

まとめ

Skaffold と Draftを比較して、大きさ差異としては

  • DraftではHelmを使っていることが想定されている
  • SkaffoldはGoogleが開発、DraftはMicrosoft
  • SkaffoldはTag機能が便利

ぐらいだと思いました。個人的にはSkaffoldの方が使いやすい上に、Skaffoldの方がGithub Starが倍程度あります(Draftは約3800)。しかしながら、ローカルで継続的デリバリーをしつつ、リモートでもCI/CDをするとオペレーションが煩雑化するので、やはり大したメリットは感じませんでした。

参考記事

medium.com