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 ビルドのドキュメントをご覧ください。

5. デプロイ

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

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

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

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

正確な Pod 名は、上記の一般的な出力とは異なります。

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

アプリケーションがローカルの Kubernetes クラスタで実行されるようになったので、コードに変更を加えると、Skaffold によってアプリケーションが自動的に再ビルドされてクラスタに再デプロイされます。

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

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

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

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

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

たとえば

time.Sleep(time.Second * 10)

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

Kubernetes 構成の変更

次に、Kubernetes 構成に変更を加えると、もう一度 Skaffold が自動的に再デプロイされます。

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

たとえば

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 プロファイルで Deployment に 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 プロファイルで Deployment に 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