SkaffoldとDraftを比較してみる
動機
私は新卒としてとある会社のエンジニアになったわけですが、同期に「Skaffoldってどうなの?チームで導入する価値ある?」のような質問を受けました。
私の意見としては、必要がない、と答えました。というのも、
*入社した会社が導入していないこと * 継続的デリバリーの(悪い意味ではなく)底辺であり、ローカルからである * シンプルさ故に機能不足
などいくつも理由が挙げられます。もとより、この分野は興味がなかったためSkaffoldやDraft、GitKubeなどしっかりとした調査はしたことがなかったです。
今回はその同期からいただいた質問を発条に、調査していこうと思います。
今回のアジェンダ
今回のアジェンダは以下の通りです。
Productの概要
それぞれのProductについて概要をまとめます。詳細に書くと記事自体が長くなってしまうので、適切に割愛させていただきます。
1. Skaffold
Skaffoldについて解説します。
概要
Skaffoldとは継続的デリバリーを実現するGoogle製のCLIツールです
フロー的には以下のようになっています。
特徴
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のログ集約
があり、シンプルですが多機能です。
公式サイト・リポジトリ
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をしたあと、コンテナの一貫性をチェックするコンテナ構造テストを実行します。
詳しいテスト内容は以下のテストラナーでチェックをしてみてください。
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
Draftについて解説をします。
概要
DraftとはKubernetesへのデプロイをストリームライン化するためのツールです
まだ実験段階であり、プロダクション環境へ導入することは推奨されていません。
特徴
1. 開発をシンプルにする
draft up
とdraft create
の二つのコマンドだけで開発をすることができます。
2. 言語サポート
Draftはアプリケーションの使用言語を検出して、適切なDockerfileとHelm Chartを使います。
現在は.NET, GO, NODE, PHP, JAVA (Maven, Gradle), PYTHONとRUBYのサポートしています。
3. Helmを想定している
Helmを使っていることを想定しているので、現在のアプリケーションとの親和性が必要です。
公式サイト・リポジトリ
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をするとオペレーションが煩雑化するので、やはり大したメリットは感じませんでした。