はじめに
DevOpsエンジニアとして走り出して1カ月。右も左も分からないところから学んだことを、自分なりにまとめています。これからクラウドやDevOpsを学びたい方に、「あ、ここ分かる!」と思ってもらえたら嬉しいです。
ひとことで「Skaffoldとは」
Google社が開発した、Kubernetesアプリケーションのビルドからデプロイまでの開発サイクルを自動化するツール
※ Kubernetesだけでなく、DockerやGoogle Cloud Runにも対応しています。
※ Kubetenetesのことを知らない方は以下の記事を参考にしてください。
“Skaffold” の語源は scaffold(足場)。
開発者が Kubernetes や Cloud Run へ “安全に・繰り返し・安定して” デプロイできるよう、開発の足場を作るツール というコンセプトから名付けられています。
Skaffoldがあると何が便利になるの?
その1. コマンド入力回数を減らしてくれる
Skaffoldがないと、アプリケーションを更新する度に以下のようなコマンドを打つ必要があります。イメージ名の指定など、毎度入力する必要があります。
docker build -t my-app:latest .
docker push my-app:latest
kubectl apply -f k8s/
Skaffoldがあると、以下のコマンドを最初に1回度だけで、イメージに修正があるとビルド、プッシュ、デプロイが完了します。
skaffold dev
その2 ステージごとに簡単に切り替えができる
開発、テスト、本番、とそれぞれ異なる設定を定義できる上、コマンドも以下のように単純明快で分かりやすいものとなっています。
skaffold run -p prod # 本番環境用
skaffold dev -p dev # 開発環境用
Skaffoldの書き方
最もシンプルな構造
以下のSkaffoldではCloud Runへのビルド・デプロイを非常にシンプルな構成で記載しています。
- apiVersion
これはyamlファイルでお決まりのおまじないです。ここに利用するサービスとバージョンを記載します。 - buildセクション
imageはビルド後のイメージパス、contextはDocker Buildを実施する場所、dockerfileには利用するDockerfileの名前を記載します。 - deployセクション
ここではCloud Runへのデプロイを実施するので、cloud runを指定した内容を記載しています。cloud runのデプロイ内容(region、メモリ、CPUなど)も記載できます。
apiVersion: skaffold/v4beta7
kind: Config
metadata:
name: my-app
build:
artifacts:
- image: gcr.io/PROJECT_ID/app
context: .
docker:
dockerfile: Dockerfile
deploy:
cloudrun:
region: asia-northeast1
profilesで環境ごとに分ける
環境ごとに設定はprofilesで定義できます。例えば以下では、開発環境と本番環境でプロジェクトとリージョンに差異がある場合を想定しています。
apiVersion: skaffold/v4beta7
kind: Config
metadata:
name: my-app
profiles:
- name: dev
build:
googleCloudBuild:
projectId: dev-project
deploy:
cloudrun:
region: asia-northeast1
- name: prod
build:
googleCloudBuild:
projectId: prod-project
deploy:
cloudrun:
region: uscentral
実際にデプロイしてみた
今回は以下のGitにあるファイルを使って、デプロイ作業をしていきます。
非常に簡易なPythonファイルと、それをDockerコンテナアプリケーションとして定義するためのDockerfile、そしてskaffold.yamlファイル、skaffold.yamlファイルが読みに行くservice-[環境名].yamlから構成されています。
コードを修正しながらアプリケーションの挙動を見たい場合
skaffoldには、コード修正したものを即座にアプリケーションに反映できる「ホットリロード」機能があり、それがskaffold devコマンドによって実現できます。
skaffold dev -p dev
コンソール画面を開くと、確かにデプロイされていることが分かります。

次に、アプリケーションを修正してみます。
修正後Ctrl+Sで保存すると、skaffoldはそれを検知し、自動でビルドとデプロイをやり直してくれます。

画像だと分かりにくいですが、コンソール画面上でもアプリケーションが更新されたことが分かります。

最後に、ループを終わらせるため、Ctrl+Cを入力します。
^CCleaning up...
すると、コンソール画面からもアプリケーションがクリーニングされたことが分かります。

本番(開発・検証)環境に一発でデプロイしたい場合
多くの場合はこのパターンになると思います。
まずは開発環境向けにデプロイします。
skaffold run -p dev
そうすると、デプロイが即座に開始し、CLI上でもデプロイが完了する様子を見ることができます。

コンソール画面でも、開発環境向けのアプリケーションがデプロイされたことが分かります。

次に本番環境にデプロイします。
skaffold run -p prod
コンソール画面でも、本番環境向けのアプリケーションがデプロイされたことが分かります。

まとめ
skaffoldによってビルドとデプロイ作業が非常に簡単になることが分かりました。yamlファイルですべて定義できるので、管理やデプロイ時のチェックが簡単になるな、と個人的に思いました。CI/CDパイプラインを構築するためのサービス、Cloud Deployでも利用されており、ファイルの記述方法はもっと研究してみたいです。
参考
- Skaffold公式サイト

