Skaffoldとは?
Skaffold(https://skaffold.dev)は、Kubernetesアプリケーションの継続的開発を促進するコマンドラインツールです。SkaffoldはGoogleによって設計されたオープンソースのツールです。Skaffoldを利用する目的は、ローカル開発のワークフローの高速化するところにあります。Skaffoldがアプリケーションのソースコードの変更を検知して、自動的にコンテナの再作成を行います。コンテナの再作成後、SkaffoldがローカルやリモートのKubernetes環境へプッシュ、デプロイを行ってくれます。Skaffoldを利用することで、ローカル開発環境でのビルドからデプロイまでの手間を省くことができるので、アプリケーション開発者は開発に集中することができます。
本記事では、Skaffoldの概要とローカル環境での基本的な使い方の紹介を行います。
Skaffoldの特徴は?
Skaffoldの特徴を紹介します。
ローカルでのKubernetesアプリケーション開発の高速化
アプリケーションのソースコードの変更をSkaffoldが自動で検知し、コンテナのビルド、プッシュ、デプロイを自動で行います。アプリケーションの開発者が docker build
や kubectl apply
コマンドを実行する手間がなくなります。
どこでも動作できる
作成したSkaffoldプロジェクトは簡単に共有をすることができます。コンテキスト(環境)ごとの設定変更も、プロファイルなどの切り替えで簡単に行うことができます。
軽量である
Skaffoldはクライアント側のコンポーネントだけで、Kubernetesクラスタ側の設定や管理は不要です。またパイプラインも必要最低限の機能に絞り込むことで、簡単で分かりやすいパイプラインを維持できます。
Skaffoldは何をしてくれるの?
Skaffoldの動作はとても簡単で分かりやすく、たった一つのコマンド skaffold dev
を実行するだけです。 skaffold dev
コマンドは、以下の操作を順番に実行します。

1. ソースコードの変更を監視する。
Skaffoldはデフォルトで1秒間隔でソースファイルの変更を監視します。監視の間隔は、 --watch-pool-interval
オプションで変更が可能です。
2. 開発者が同期対象(sync)としているものである場合、Podに直接同期する。
Skaffoldは、コンテナの再作成やPodの再起動を避けるために、ファイルのコピーだけでアプリケーションに反映できるものは、Podに直接コピーを行うことができます。skaffold.yaml
ファイルのsync
セクションで対象のファイルもしくはディレクトリを指定することで、設定を行います。この機能はファイルの更新かつローカルのソースファイルのみを対象とするなどの制限があります。また、2019年5月17日時点ではアルファ版としてのリリースとなっています。
3. ソースコードからビルドを行う。
指定したツールを利用してDockerイメージをビルドします。サポートしているビルドツールは以下の通りです。
- ローカルのDockerfile
- Google Cloud BuildのリモートDockerfile
- Kanikoのクラスタ内Dockerfile
- ローカルのBazel
- ローカルのMavenもしくはGradleを用いたJib
- Google Cloud BuildのリモートJib
- ローカルのカスタムビルドスクリプト
4. ビルドしたイメージのテストを行う。
container-structure-test(https://github.com/GoogleContainerTools/container-structure-test)を利用して、ビルドしたコンテナのテストを行います。テストを行うには、container-structure-testのバイナリファイルをインストールしておく必要があります。
5. タグ付けを行う。
コンテナのタグ付けを行います。サポートしているタグ付けポリシーは、以下の通りです。
- gitCommit
Git Commit IDをタグに利用します。 - sha256
コンテンツのsha256ハッシュをタグに利用します。 - envTemplate
環境変数の値をタグに利用します。 - dateTime
日時をタグに利用します。
6. プッシュを行う。
コンテナイメージをリポジトリにプッシュします。ローカル開発でリポジトリへのプッシュが不要な場合は、プッシュをスキップさせることもできます。コンテキスト名が以下に該当する場合、ローカルクラスタと判定され、プッシュはスキップされます。
- docker-for-desktop
- docker-desktop
- minikube
7. デプロイを行う。
Kubernetesクラスタへのデプロイを行います。サポートしているデプロイ方法は以下の通りです。
- kubectl
- helm
- kustomize
デプロイの完了後、ソースコードの変更がKubernetes上に反映され、修正したアプリケーションの確認ができるようになります。
8. ソースコードの変更監視をつづける。
デプロイの完了後、"1. ソースコードの変更を監視する。"の処理に戻り、ソースコードの変更監視を続けます。
Skaffoldを終了(Ctrl + C)した場合、デプロイの跡片付けを行う。
起動したSkaffoldはターミナル上でCtrl + C
を押すことで終了することができます。Skaffoldが終了するタイミングで、Kubernetes上にデプロイされたアプリケーションも削除されます。
なお、ソースコードの変更監視やSkaffold終了後のデプロイ削除を行いたくない場合は、skaffold run
コマンドを実行します。
Skaffoldのインストール(Windows WSL編)
WindowsのWSL for Ubuntu18.04にSkaffoldをインストールしてみます。
事前準備
Dockerとkubectlが必要になるので、利用する環境にあわせてインストールを行ってください。
- Docker(https://www.docker.com/get-started)
- kubectl(https://kubernetes.io/docs/tasks/tools/install-kubectl/)
kubectlはSkaffoldのデプロイ対象のKubernetesクラスタに接続できるように設定をしておいてください。ここでは、WSLのUbuntu18.04環境にkubectlのインストールと設定を行う方法を紹介します。
Docker for DesktopのKubernetesの有効化
Docker for Desktopのインストーラーを起動し、Dockerのインストールを完了させておいてください。インストール完了後、Dockerの設定画面を開き、Kubernetesを有効化してください。
※Settings -> Kubernetes -> Enable Kubernetesのチェックボックスをオン

Windowsの再起動後、Dockerの設定画面の左下で"Kubernetes is running"が表示されていれば、Kubernetesが起動しています。
kubectlのインストール
WSLのターミナルからkubectl
のインストールを行います。
kube configのコピー
Docker for Desktopのkube config
ファイルをWSLのホームディレクトリにコピーします。
kubectlの実行確認
kubectl
の実行確認を行います。Client、Serverのバージョンが取得できれば成功です。
Skaffoldのインストール
公式ページのインストール手順(https://skaffold.dev/docs/getting-started/)に従って、Skaffoldのインストールを行います。ここではWSLのUbuntu18.04環境にSkaffoldをインストールをしてみます。
WSLのターミナルから以下のコマンドを実行します。
skaffold
コマンドでバージョンを表示して、インストールの成功を確認します。
kubectl
コマンドで現在のコンテキストも確認しておきましょう。
現在のコンテキストは"docker-for-desktop"になっています。
Dockerクライアントの設定
WSLからDocker for Desktopのデーモンを利用できるようにします。はじめにWSL上のUbuntu18.04にDockerクライアントのインストールを行います。
docker
コマンドを実行してDockerクライアントの動作確認を行います。
最後のメッセージはWSL上にDockerデーモンが動作していないので出力されるエラーです。現時点ではこのメッセージが表示されていても問題ありません。
Docker for Desktopの設定
Dockerの設定画面からlocalhost:2375
を利用できるようにチェックをいれます。
※Settings -> General -> Expose daemon on tcp://localhost:2375 without TLSのチェックボックスをオン

Dockerクライアントを利用するWSLユーザのDOCKER_HOST
環境変数を設定します。
再度、dockerのバージョンを取得してみます。
今度は正常にServerのバージョンも取得できました。
サンプルアプリケーションの実行
Skaffoldの公式ページで提供されているサンプルのGoアプリケーションでSkaffoldの動作を確認してみます。このサンプルアプリケーションで、Skaffoldの以下の機能を体験してみましょう。
- Skaffoldでソースコードの変更検知を行う
- Skaffoldが自動でコンテナイメージのビルドを行う
- Skaffoldが自動でコンテナイメージをKubernetesにデプロイする
それでは、以下の手順にしたがってSkaffoldの世界を体験してみてください。
サンプルアプリケーションのリポジトリをcloneする
サンプルアプリケーションのGitリポジトリをcloneします。
skaffold devの実行
サンプルアプリケーションのディレクトリに移動し、skaffold dev
コマンドを実行してみます。
起動に成功するとターミナル上に1秒ごとに[getting-started] Hello world!
が表示されます。KubernetesのPodを見てみましょう。
Kubernetes上で正常にPodが起動しています。続いて、ソースコードの編集をしてみます。編集するファイルはSkaffoldを起動したディレクトリにあるmain.go
ファイルです。
fmt.Println("Hello world!")
の部分を適当な文言に修正して、保存をしてください。以下の例では"Hello Hello!"という文言に変更してみました。
保存が完了すると、Skaffoldがソースコードの変更を検知し、再度ビルドからデプロイまでのフローが実行されます。ターミナル上には修正した文言が新たに表示されることが確認できます。
サンプルアプリケーションの停止
サンプルアプリケーションをCtrl + c
で停止します。skaffold dev
で実行したアプリケーションを停止した場合、skaffoldのクリーニング処理が実行され、対象のリソースが削除されます。
Kubernetes上のPodが削除されか確認をしてみましょう。
Podも削除されました。
さいごに
Skaffoldを利用することで、ローカルでのKubernetesアプリケーション開発を楽にすることができます。ソースコードの変更をトリガーとしてコンテナのビルドからデプロイが自動化されるので、ビルドやデプロイのミスもなくすことができます。
ローカルでのビルドやデプロイなど、何度も繰り返し行う作業は可能な限り自動化して、手間やミスの削減につなげていきましょう。
投稿者プロフィール
最新の投稿
AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
セキュリティ2021年7月14日ゼロデイ攻撃とは
セキュリティ2021年7月14日マルウェアとは
WAF2021年7月13日クロスサイトスクリプティングとは?