Skaffold について

1. 目標

Skaffold は、アプリケーションのビルド、push、デプロイのワークフローを処理するツールです。Skaffold を使用すると、簡単にローカルの開発ワークスペースを構成し、内部開発ループを合理化できます。また、KustomizeHelm などの他のツールと統合して Kubernetes マニフェストの管理に役立てることもできます。

このチュートリアルでは、Skaffold のコアコンセプトについて学び、Skaffold を使用して内部開発ループを自動化し、アプリケーションをデプロイします。

次のことを行います。

  • ローカル開発用に Skaffold を構成して有効にする
  • シンプルな golang アプリケーションをビルドして実行する
  • Skaffold を使用してローカル アプリケーションのデプロイを管理する
  • マニフェストをレンダリングしてアプリケーションをデプロイする

2. 始める前に

ワークスペースの準備

  1. 次の URL にアクセスして Cloud Shell エディタを開きます。
https://shell.cloud.google.com

サードパーティ Cookie を許可します。[サイトが機能しない]、[Cookie を許可] の順にクリックします。

7b702066a2135a3d.png

3394f82132eb4fd4.png

  1. まだクローンを作成していない場合は、ターミナル ウィンドウで次のコマンドを使用してアプリケーション ソースのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. クローン作成したリポジトリ ディレクトリに移動します。
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. 次のコマンドを実行して、Cloud Shell ワークスペースを現在のディレクトリに設定します。
cloudshell workspace .

プロジェクトの準備

  1. 次のコマンドを実行して、Google Cloud プロジェクトが正しく設定されていることを確認します。
gcloud config set project {{project-id}}

3. Skaffold のスタートガイド

  1. 次のコマンドを実行して、最上位の 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
  1. IDE ペインで skaffold.yaml ファイルを開きます。これは、Skaffold パイプラインを定義する最上位の構成ファイルです。

Kubernetes のような YAML 形式と、YAML 内の次のセクションに注意してください。

  • build
  • deploy
  • profiles

これらのセクションでは、アプリケーションのビルドとデプロイ方法と、各デプロイ ターゲットのプロファイルを定義します。

Skaffold ステージの詳細については、Skaffold パイプライン ステージのドキュメントをご覧ください。

4. ビルド

build セクションには、アプリケーションのビルド方法を定義する構成が含まれています。この場合、git タグを処理する方法の構成と、アプリケーションを構成するコンテナ イメージを定義する artifacts セクションを確認できます。

また、このセクションには、イメージのビルドに使用する Dockerfile への参照も含まれています。Skaffold は、JibMavenGradle、クラウドネイティブの BuildpacksBazel、カスタム スクリプトなどの他のビルドツールもサポートしています。この構成の詳細については、Skaffold Build のドキュメントをご覧ください。

5. デプロイ

deploy セクションには、アプリケーションのデプロイ方法を定義する構成が含まれています。この例では、Kustomize ツールを使用するように Skaffold を構成するデフォルトのデプロイの例を示します。

Kustomize ツールは、一連の一般的なコンポーネント YAML ファイル(base ディレクトリ内)と、通常は 1 つ以上のデプロイ ターゲット(通常は devteststagingproduction など)に対応する 1 つ以上の「オーバーレイ」を組み合わせて、Kubernetes マニフェストを生成する機能を提供します。

この例では、3 つのターゲット(devstagingprod)に 2 つのオーバーレイがあります。dev オーバーレイはローカル開発時に使用され、staging オーバーレイと prod オーバーレイは Skaffold を使用してデプロイするときに使用されます。

6. プロフィール

profiles セクションには、さまざまなコンテキストのビルド、テスト、デプロイの構成を定義する構成が含まれています。通常、異なるコンテキストは、この例の stagingprod など、アプリケーションのデプロイ パイプラインの異なる環境です。つまり、ボイラープレート構成を繰り返すことなく、ターゲット環境ごとに内容が異なるマニフェストを簡単に管理できます。

profiles セクションの構成では、メイン構成のアイテム(buildtestdeploy セクションなど)を置き換えたり、パッチを適用したりできます。

例として、overlays > prod > deployment.yaml ファイルを開きます。アプリケーションのレプリカ数が 3 に構成され、ベース構成がオーバーライドされていることに注意してください。

  1. IDE ペインで次のファイル app > main.go を開きます。これは、1 秒ごとに stdout に文字列を書き込成するシンプルな golang アプリケーションです。
  2. アプリケーションは、実行中の Kubernetes Pod の名前も出力します。

Dockerfile の表示

  1. IDE ペインでファイル app > Dockerfile を開きます。このファイルには、main.go ファイルのアプリケーション コンテナ イメージをビルドするための一連のディレクティブが含まれており、最上位の skaffold.yaml ファイルで参照されます。

7. Skaffold を使用した開発

Kubernetes 環境の構成

  1. 次のコマンドを実行して、ローカル Kubernetes クラスタが実行され、構成されていることを確認します。
minikube start

数分かかることがあります。クラスタが正常に起動すると、次の出力が表示されます。

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. 次のコマンドを実行して、devstagingprod の Kubernetes Namespace を作成します。
kubectl apply -f namespaces.yaml

次の出力が表示されます。

namespace/dev created
namespace/staging created
namespace/prod created

ローカルでの開発に Skaffold を使用する

  1. 次のコマンドを実行してアプリケーションをビルドし、Cloud Shell で実行されているローカル Kubernetes クラスタにデプロイします。
skaffold dev

アプリケーション コンテナのビルドプロセスが実行されます。これには 1 分ほどかかることがあります。その後、アプリケーションの出力が 1 秒ごとに繰り返されます。

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

実際のポッド名は、上記の一般的な出力とは異なります。

アプリケーションに変更を加える

アプリケーションがローカルの Kubernetes クラスタで実行されているので、コードを変更できます。Skaffold は、アプリケーションを自動的に再ビルドしてクラスタに再デプロイします。

  1. IDE ペインで app > main.go ファイルを開き、出力文字列を変更します。
"Hello world from pod %s!\n"

これを、次のように変更します。

"Hello Skaffold world from pod %s!\n"

変更を加えると、Skaffold によってイメージが再ビルドされてクラスタに再デプロイされ、出力の変更がターミナル ウィンドウに表示されます。

  1. IDE ペインのファイル「app > main.go」でも、次の行を変更します。
time.Sleep(time.Second * 1)

to

time.Sleep(time.Second * 10)

アプリケーションが再ビルドされて再デプロイされ、出力行が 10 秒ごとに表示されます。

Kubernetes 構成の変更

次に、Kubernetes 構成を変更します。これにより、Skaffold が自動的に再デプロイされます。

  1. IDE で base > deployment.yaml ファイルを開き、次の行を変更します。
replicas: 1

to

replicas: 2

アプリケーションが再デプロイされると、2 つの Pod が実行されていることがわかります。それぞれに異なる名前が付けられます。

  1. 次に、ファイル base > deployment.yaml の同じ行を次のように変更します。
replicas: 1

Pod の 1 つが Service から削除され、1 つだけが残っています。

  1. 最後に、ターミナル ウィンドウで Ctrl-C キーを押して、Skaffold のローカル開発を停止します。

リリースのカット

次に、リリース イメージをビルドしてクラスタにデプロイし、リリースを作成します。

  1. 次のコマンドを実行してリリースをビルドします。
skaffold build --file-output artifacts.json

このコマンドは、最終イメージをビルドし(必要に応じて)、リリースの詳細を artifacts.json ファイルに出力します。

Cloud Deploy などのツールを使用してクラスタにデプロイする場合は、このファイルにリリース情報が含まれています。つまり、アーティファクトは公開ルート上で変更できません。

  1. 次のコマンドを実行して、artifacts.json ファイルの内容を表示します。
cat artifacts.json | jq

このファイルには、最終的なデプロイで使用されるイメージへの参照が含まれていることに注意してください。

ステージング環境へのデプロイ

  1. 次のコマンドを実行して、staging プロファイルを使用してリリースをデプロイします。
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

デプロイが完了すると、次のような 2 つの Pod の出力が表示されます。

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. ターミナル ウィンドウで Ctrl+C キーを押して、Skaffold の出力を停止します。
  2. 次のコマンドを実行して、クラスタでアプリケーションが稼働していることを確認します。
kubectl get all --namespace staging

アプリケーションの staging プロファイルでは、デプロイメントに 2 つのレプリカがあることが指定されているため、2 つの異なる Pod 名が表示されます。

本番環境にデプロイする

  1. 次のコマンドを実行して、prod プロファイルを使用してリリースをデプロイします。
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

デプロイが完了すると、次のような 3 つの Pod の出力が表示されます。

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. ターミナル ウィンドウで Ctrl+C キーを押して、Skaffold の出力を停止します。

アプリケーションの prod プロファイルでは、デプロイメントに 3 つのレプリカがあることが指定されているため、3 つの異なる Pod 名が表示されます。

  1. 次のコマンドを実行して、アプリケーションがクラスタ内で稼働していることを確認します。
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 についてさらに学ぶ。

クリーンアップ

  1. 次のコマンドを実行してローカル クラスタをシャットダウンします。
minikube delete