1. 目標
Skaffold は、アプリケーションのビルド、push、デプロイのワークフローを処理するツールです。Skaffold を使用すると、簡単にローカルの開発ワークスペースを構成し、内部開発ループを合理化できます。また、Kustomize や Helm などの他のツールと統合して Kubernetes マニフェストの管理に役立てることもできます。
このチュートリアルでは、Skaffold の基本コンセプトをいくつか学習し、Skaffold を使用して内部開発ループを自動化してから、アプリケーションをデプロイします。
次のことを行います。
- ローカル開発用に Skaffold を構成して有効にする
- シンプルな Golang アプリケーションをビルドして実行する
- Skaffold を使用してローカル アプリケーションのデプロイを管理する
- マニフェストをレンダリングしてアプリケーションをデプロイする
2. 始める前に
ワークスペースの準備
- 次の URL にアクセスして Cloud Shell エディタを開きます。
https://shell.cloud.google.com
サードパーティの Cookie を許可する。[サイトが動作していません] をクリック[Cookie を許可する]を選択します
- まだ行っていない場合は、ターミナル ウィンドウで次のコマンドを使用してアプリケーション ソースのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
- クローンを作成したリポジトリのディレクトリに移動します。
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
- 次のコマンドを実行して、Cloud Shell ワークスペースを現在のディレクトリに設定します。
cloudshell workspace .
プロジェクトの準備
- 次のコマンドを実行して、Google Cloud プロジェクトが正しく設定されていることを確認します。
gcloud config set project {{project-id}}
3. Skaffold のスタートガイド
- 次のコマンドを実行して、最上位の Skaffold 構成ファイル
skaffold.yaml
を作成します。
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
name: getting-started-kustomize
build:
tagPolicy:
gitCommit:
ignoreChanges: true
artifacts:
- image: skaffold-kustomize
context: app
docker:
dockerfile: Dockerfile
deploy:
kustomize:
paths:
- overlays/dev
profiles:
- name: staging
deploy:
kustomize:
paths:
- overlays/staging
- name: prod
deploy:
kustomize:
paths:
- overlays/prod
EOF
- IDE ペインでファイル
skaffold.yaml
を開きます。これは、Skaffold パイプラインを定義する最上位の構成ファイルです。
Kubernetes に似た YAML 形式と、YAML の次のセクションに注目してください。
build
deploy
profiles
これらのセクションでは、アプリケーションをビルドおよびデプロイする方法と、各デプロイ ターゲットのプロファイルを定義します。
Skaffold のステージの完全なリストについては、Skaffold のパイプライン ステージのドキュメントをご覧ください。
4. ビルド
build
セクションには、アプリケーションのビルド方法を定義する構成が含まれています。ここでは、git
タグの処理方法に関する設定と、アプリケーションを構成するコンテナ イメージを定義する artifacts
セクションを確認できます。
このセクションでは、イメージのビルドに使用する Dockerfile
への参照を確認できます。Skaffold は、Jib
、Maven
、Gradle
、クラウドネイティブな Buildpacks
、Bazel
、カスタム スクリプトなどの他のビルドツールもサポートしています。この構成の詳細については、Skaffold ビルドのドキュメントをご覧ください。
5. デプロイ
deploy
セクションには、アプリケーションのデプロイ方法を定義する構成が含まれています。ここでは、Kustomize
ツールを使用するように Skaffold を構成するデフォルトのデプロイの例を示しています。
Kustomize
ツールは、共通のコンポーネントの YAML ファイルのセット(base
ディレクトリの下)を 1 つ以上の「オーバーレイ」と組み合わせることで、Kubernetes マニフェストを生成する機能を提供します。通常は 1 つ以上のデプロイ ターゲット(通常は dev、test、staging、production など)に対応します。
この例では、dev、staging、prod の 3 つのターゲットの 2 つのオーバーレイが表示されています。dev オーバーレイは、ローカルでの開発時には使用され、Skaffold を使用してデプロイ時には staging オーバーレイと prod オーバーレイが使用されます。
6. プロフィール
profiles
セクションには、さまざまなコンテキストのビルド、テスト、デプロイの構成を定義する構成が含まれています。さまざまなコンテキストは、通常、この例の staging
や prod
のように、アプリケーション デプロイ パイプラインのさまざまな環境です。つまり、ボイラープレート構成を繰り返すことなく、ターゲット環境ごとに内容が異なるマニフェストを簡単に管理できます。
profiles
セクションの構成では、メインの構成の任意の項目(build
、test
、deploy
セクションなど)の置き換えやパッチ適用が可能です。
この例では、ファイル overlays > prod > deployment.yaml
を開きます。ここでは、アプリケーションのレプリカ数が 3 つに構成されており、基本構成をオーバーライドしています。
アプリケーションのソースコードを操作する。
- IDE ペインで次のファイル
app > main.go
を開きます。これは、文字列を 1 秒ごとにstdout
に書き込むシンプルな Golang アプリケーションです。 - このアプリケーションは、実行中の Kubernetes Pod の名前も出力します。
Dockerfile の表示
- IDE ペインでファイル
app > Dockerfile
を開きます。このファイルには、main.go
ファイルのアプリケーション コンテナ イメージをビルドするための一連のディレクティブが含まれ、最上位のskaffold.yaml
ファイルで参照されます。
7. Skaffold を使用した開発
Kubernetes 環境の構成
- 次のコマンドを実行して、ローカルの Kubernetes クラスタが実行され、構成されていることを確認します。
minikube start
これには数分かかることがあります。クラスタが正常に起動した場合は、次の出力が表示されます。
Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
- 次のコマンドを実行して、
dev
、staging
、prod
の Kubernetes Namespace を作成します。
kubectl apply -f namespaces.yaml
次の出力が表示されます。
namespace/dev created namespace/staging created namespace/prod created
ローカルでの開発に Skaffold を使用する
- 次のコマンドを実行してアプリケーションをビルドし、Cloud Shell で実行されているローカルの Kubernetes クラスタにデプロイします。
skaffold dev
アプリケーション コンテナのビルドプロセスが実行され(場合によっては 1 分ほど)、アプリケーションの出力が 1 秒ごとに繰り返されます。
[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx
正確な Pod 名は、上記の一般的な出力とは異なります。
アプリケーションに変更を加える
アプリケーションがローカルの Kubernetes クラスタで実行されるようになったので、コードに変更を加えると、Skaffold によってアプリケーションが自動的に再ビルドされてクラスタに再デプロイされます。
- IDE ペインでファイル
app > main.go
を開き、出力文字列を変更します。
"Hello world from pod %s!\n"
これを、次のように変更します。
"Hello Skaffold world from pod %s!\n"
変更を加えると、Skaffold によってイメージが再ビルドされてクラスタに再デプロイされ、出力の変更がターミナル ウィンドウに表示されます。
- 次に、ファイル「app >main.go"[IDE] ペインで、次の行を変更します。
time.Sleep(time.Second * 1)
たとえば
time.Sleep(time.Second * 10)
再びアプリケーションが再ビルドされて再デプロイされ、10 秒ごとに出力行が表示されます。
Kubernetes 構成の変更
次に、Kubernetes 構成に変更を加えると、もう一度 Skaffold が自動的に再デプロイされます。
- IDE でファイル
base > deployment.yaml
を開き、次の行を変更します。
replicas: 1
たとえば
replicas: 2
アプリケーションが再デプロイされると、名前が異なる 2 つの Pod が実行されていることがわかります。
- 次に、
base > deployment.yaml
ファイルの同じ行を次のように変更します。
replicas: 1
Pod の 1 つが Service から削除され、1 つだけが残っています。
- 最後に、ターミナル ウィンドウで
Ctrl-C
を押して、Skaffold のローカル開発を停止します。
リリースのカット
次に、リリース イメージをビルドしてクラスタにデプロイし、リリースを作成します。
- 次のコマンドを実行して、リリースをビルドします。
skaffold build --file-output artifacts.json
このコマンドは、(必要に応じて)最終イメージをビルドし、リリースの詳細を artifacts.json
ファイルに出力します。
Cloud Deploy などのツールを使用してクラスタにデプロイする場合、このファイルにはリリース情報が含まれています。これは、アーティファクトは、存続するルート上で変更できないことを意味します。
- 次のコマンドを実行して、
artifacts.json
ファイルの内容を表示します。
cat artifacts.json | jq
このファイルには、最終的なデプロイで使用されるイメージへの参照が含まれていることに注意してください。
ステージング環境へのデプロイ
- 次のコマンドを実行して、
staging
プロファイルを使用してリリースをデプロイします。
skaffold deploy --profile staging --build-artifacts artifacts.json --tail
デプロイが完了すると、2 つの Pod から次のような出力が表示されます。
[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
- ターミナル ウィンドウで Ctrl+C キーを押して、Skaffold の出力を停止します。
- 次のコマンドを実行して、アプリケーションがクラスタ内で稼働していることを確認します。
kubectl get all --namespace staging
アプリケーションの staging
プロファイルで Deployment に 2 つのレプリカが必要であると指定されているため、2 つの異なる Pod 名が表示されます。
本番環境にデプロイする
- 次のコマンドを実行して、
prod
プロファイルを使用してリリースをデプロイします。
skaffold deploy --profile prod --build-artifacts artifacts.json --tail
デプロイが完了すると、3 つの Pod から次のような出力が表示されます。
[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
- ターミナル ウィンドウで Ctrl+C キーを押して、Skaffold の出力を停止します。
アプリケーションの prod
プロファイルで Deployment に 3 つのレプリカが必要であると指定されているため、3 つの異なる Pod 名が表示されます。
- 次のコマンドを実行して、アプリケーションがクラスタ内で稼働していることを確認します。
kubectl get all --namespace prod
本番環境のデプロイを示す次のような行を含む出力が表示されます。
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/skaffold-kustomize-prod 3/3 3 3 16m
また、3 つのアプリケーション Pod が実行されていることがわかります。
NAME READY STATUS RESTARTS AGE pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx 1/1 Running 0 10m pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx 1/1 Running 0 10m pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx 1/1 Running 0 10m
8. 完了
これで、これで Understanding Skaffold
ラボは終了です。ローカル開発とアプリケーション デプロイのために Skaffold を構成して使用する方法を学習しました。
次のステップ:
Skaffold についてさらに学習する:
クリーンアップ
- 次のコマンドを実行して、ローカル クラスタをシャットダウンします。
minikube delete