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 Build のドキュメントをご覧ください。
5. デプロイ
deploy
セクションには、アプリケーションのデプロイ方法を定義する構成が含まれています。この例では、Kustomize
ツールを使用するように Skaffold を構成するデフォルトのデプロイの例を示します。
Kustomize
ツールは、一連の一般的なコンポーネント YAML ファイル(base
ディレクトリ内)と、通常は 1 つ以上のデプロイ ターゲット(通常は dev、test、staging、production など)に対応する 1 つ以上の「オーバーレイ」を組み合わせて、Kubernetes マニフェストを生成する機能を提供します。
この例では、3 つのターゲット(dev、staging、prod)に 2 つのオーバーレイがあります。dev オーバーレイはローカル開発時に使用され、staging オーバーレイと prod オーバーレイは Skaffold を使用してデプロイするときに使用されます。
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
実際のポッド名は、上記の一般的な出力とは異なります。
アプリケーションに変更を加える
アプリケーションがローカルの Kubernetes クラスタで実行されているので、コードを変更できます。Skaffold は、アプリケーションを自動的に再ビルドしてクラスタに再デプロイします。
- IDE ペインで
app > main.go
ファイルを開き、出力文字列を変更します。
"Hello world from pod %s!\n"
これを、次のように変更します。
"Hello Skaffold world from pod %s!\n"
変更を加えると、Skaffold によってイメージが再ビルドされてクラスタに再デプロイされ、出力の変更がターミナル ウィンドウに表示されます。
- IDE ペインのファイル「app > main.go」でも、次の行を変更します。
time.Sleep(time.Second * 1)
to
time.Sleep(time.Second * 10)
アプリケーションが再ビルドされて再デプロイされ、出力行が 10 秒ごとに表示されます。
Kubernetes 構成の変更
次に、Kubernetes 構成を変更します。これにより、Skaffold が自動的に再デプロイされます。
- IDE で
base > deployment.yaml
ファイルを開き、次の行を変更します。
replicas: 1
to
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
プロファイルでは、デプロイメントに 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
プロファイルでは、デプロイメントに 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