Cloud Deploy で Skaffold を使ってみる

このドキュメントでは、以下を含む Cloud Deploy の一部として Skaffold の使用を開始する方法について説明します。

  • Cloud Deploy デリバリー パイプラインで使用する Skaffold の構成する
  • Helm や Kustomize などのサードパーティのレンダリング ツールで、Skaffold と Cloud Deploy を使用する
  • 必要に応じて、ローカル開発に Skaffold を使用する
  • 必要に応じて、Skaffold を使用して継続的インテグレーションと継続的デプロイ(CI/CD)を実現

Skaffold が必要な理由

Cloud Deploy で Skaffold を使用する理由と、Skaffold 構成の管理が必要な理由については、しっかりと確認しておきましょう。

CI/CD の経験がありますが、現在 Skaffold は使用していません

Skaffold は、デベロッパーの生産性を向上させるオープンソースのコマンドライン ツールです。継続的開発、継続的インテグレーション(CI)、継続的デリバリー(CD)をオーケストレートします。

Skaffold は、プラグイン対応アーキテクチャを使用して宣言型のポータブル構成を提供するため、レンダリング フェーズでさまざまなツールを使用できます。

リリースが作成されると、Cloud Deploy は Skaffold を呼び出してマニフェストをレンダリングします。Cloud Deploy では、デプロイ時に Skaffold を再度呼び出し、これらのマニフェストを適用して進行中の各ターゲットにアプリケーションをデプロイします。デプロイ後、Skaffold はヘルスチェックを実行して、ターゲット ランタイムをモニタリングしてデプロイの成功を確認します。

継続的開発のための Skaffold

継続的な開発に Skaffold を使用する場合、コードを変更すると、イメージがビルド、テストされ、クラスタ(または Minikube)にデプロイされます。Cloud Code for VS CodeCloud Code for IntelliJ の IDE 拡張機能は、Skaffold を Visual Studio Code と JetBrains IDE に統合して、継続的な開発を行います。

継続的なデリバリーのための Skaffold

ビルド、デプロイ、レンダリング、適用の各ステップで継続的なデリバリーのために Skaffold を使用することもできます。Cloud Deploy では、Skaffold のレンダリングと適用機能を使用します。Cloud Deploy を使用するには、少なくとも有効な skaffold.yaml 構成ファイルが必要です

Skaffold を使用すると、HelmKustomize などのサードパーティのマニフェスト管理ツールと統合することもできます。このように Skaffold を使用すると、これらのツールの機能を使用してマニフェストをレンダリングできます。kubectl は、これらのマニフェストのデプロイツールを保持します。

Kubernetes へのデプロイが初めての場合

Skaffold を使用すると、すべてのデプロイの基本マニフェスト セットを構成できます。次に、Cloud Deploy を介して Skaffold のレンダリング エンジンを使用し、これらの基本マニフェストの 1 つから、デプロイ固有の各マニフェストをレンダリングしてデプロイできます。

Helm や Kustomize などの一般的なマニフェスト テンプレート ツールで Skaffold や Cloud Deploy を使用する例など、マニフェストの管理の詳細をご覧ください。

Cloud Deploy を機能させるには何が必要ですか?

基本的な Cloud Deploy デリバリー パイプラインを使用するには、skaffold.yaml 構成ファイルに少なくとも次の構成が必要です。

  • すべての skaffold.yaml 構成に必要なヘッダー情報:

    apiVersion: skaffold/v4beta7
    kind: Config
    
  • すべての未加工の Kubernetes マニフェストを一覧表示する GKE、GKE Enterprise、または Cloud Run 用の manifests スタンザ(Helm や Kustomize などのマニフェスト管理ツールを使用している場合を除く)。

    未加工の Kubernetes マニフェストを使用した例を次に示します。

    manifests:
      rawYaml:
      - deployment.yaml
    

    レンダラ(Helm や Kustomize など)を使用してマニフェストをレンダリングする場合は、これらのツールを使用するように Skaffold を構成する方法について、skaffold.yaml への Helm サポートの追加skaffold.yaml への Kustomize サポートの追加をご覧ください。

    Helm と Kustomize の例については、マニフェストの管理をご覧ください。

  • GKE または GKE Enterprise にデプロイするための deploy.kubectl、または Cloud Run にデプロイするための deploy.cloudrun を持つ deploy スタンザ。

    GKE ターゲットと GKE Enterprise ターゲットの場合:

    deploy:
      kubectl: {}
    

    デプロイ スタンザは、マニフェスト スタンザで指定されたアプリケーション マニフェストをデプロイします。

    Cloud Run ターゲットの場合:

    deploy:
      cloudrun: {}
    

    デプロイ スタンザは、マニフェスト スタンザで指定されたアプリケーション マニフェストをデプロイします。

カスタム ターゲットを使用している場合、skaffold.yaml にはヘッダー(apiVersion および kind:)と、カスタム ターゲット タイプがまだリモート Skaffold 構成を参照していない場合にカスタム ターゲットが使用するカスタム アクションが必要です。

skaffold.yaml ファイルを作成する

Cloud Deploy では、アプリケーションのレンダリングとデプロイに Skaffold を使用します。

リリースごとに、使用するマニフェストを識別する skaffold.yaml ファイルを少なくとも 1 つ指定する必要があります。このファイルに何を含める必要があるかについては、前のセクションをご覧ください。

Cloud Deploy で skaffold.yaml を生成する

skaffold.yaml ファイルがなく、Kubernetes マニフェストまたは Cloud Run サービス定義ファイルが 1 つある場合、Cloud Deploy は skaffold.yaml ファイルを生成できます。

生成された Skaffold ファイルは、リリースが完了すると Cloud Storage ソースのステージング ディレクトリで使用可能になります。

次のコマンドには、--from-k8s-manifest フラグが含まれており、Kubernetes マニフェストが渡されます。Cloud Deploy では、マニフェストの情報を使用して skaffold.yaml を生成し、リリースに使用します。

gcloud deploy releases create  RELEASE_NAME --delivery-pipeline=PIPELINE_NAME --from-k8s-manifest=MANIFEST --region=REGION

Cloud Run サービスの YAML から skaffold.yaml を生成するには、同じコマンドを使用しますが、--from-k8s-manifest の代わりに --from-run-manifest を使用します。

これらのフラグのいずれかを --skaffold-file フラグまたは --source フラグとともに使用すると、エラーが発生します。

生成された skaffold.yaml ファイルの使用

生成された skaffold.yaml は、Cloud Deploy のオンボーディング、学習、デモに適しています。Cloud Deploy に慣れた後、本番環境のワークロードについては、Skaffold プロファイルを使用するターゲット間で区別する Skaffold 構成が必要になることがあります。

生成された skaffold.yaml ファイルを出発点として使用して独自の区別する Skaffold 構成を作成する場合、レンダリングされたファイルではなく、レンダリング ソース アーカイブでこのファイルを使用してください。レンダリング ソースは、[リリースの詳細] ページの [アーティファクト] タブからダウンロードできます。

  • この生成された skaffold.yaml は、Cloud Storage バケットに格納されているレンダリング ソースに含まれています。

    このファイルを表示するには、.tar.gz ファイルをダウンロードして抽出します。

  • レンダリングされた skaffold.yaml は、ターゲット アーティファクトで使用できます。

    [ターゲットのアーティファクト] セクションで、[アーティファクトを表示] をクリックします。

    レンダリング ソースとターゲットのアーティファクトを表示するリリースの詳細ページ

ローカル開発での Skaffold の使用

Skaffold の強みの 1 つは、ローカル開発と CI/CD に使用できることです。 dev モードの場合、Skaffold はソースファイルを監視し、変更を検出すると、イメージを再ビルドして再テストし、ローカルマシンの Minikube クラスタなどにコンテナを再デプロイします。

このように Skaffold を使用する場合は、リモート デプロイと同じコマンドをローカルで使用できます。

ローカル開発に Skaffold を使用する場合は、ターゲットに個別の Skaffold プロファイルとローカル開発用のデフォルトのデプロイ スタンザを定義できます。

dev モードを停止すると、Skaffold はデプロイされたアーティファクトをクラスタからクリーンアップします。

CI/CD での Skaffold の使用

ローカルでの継続的なビルドとデプロイに Skaffold を使用できますが、CI/CD には Skaffold を使用できます。Cloud Deploy は、Skaffold の CI/CD 機能を使用してマニフェストをレンダリングして適用し、定義済みのターゲットにアプリケーションをデプロイします。ただし、Cloud Build などの CI ツールと Artifact Registry などのイメージ レジストリを使用してコンテナ イメージをビルドする必要があります。

レンダリング、デプロイ、適用

Skaffold は、マニフェスト レンダリング プロセスをデプロイから分離します。 Cloud Deploy は skaffold render を呼び出してマニフェストをレンダリングし、skaffold apply を呼び出してターゲットに適用します。

レンダリングと適用の分離により、アプリケーションの完全な宣言状態を構成でキャプチャできるため、アプリケーションを安全に(たとえば、ロールバック用に)繰り返し適用できます。この手法でも承認が容易になります。マニフェストは最初のロールアウト前にすべてのターゲットに対してレンダリングされるため、各ターゲットに適用されるレンダリングされた YAML を確認できます。

Cloud Deploy では、他のデプロイツールによるアプリケーションのデプロイはサポートされていません。ただし、HelmKustomize などのツールを使用してレンダリングを行うことができます。

デプロイ担当者として kubectl を使用して Cloud Deploy をデプロイする方法については、Cloud Deploy サービス アーキテクチャをご覧ください。

Skaffold プロファイルについて

profiles: スタンザで、skaffold.yaml で識別される個別の Skaffold プロファイルを作成できます。

Cloud Deploy で Skaffold プロファイルを使用する場合は、すべてまたは一部のターゲットに対して個別のプロファイルを作成できます。たとえば、devstagingprod の各プロファイルは異なります。

Cloud Deploy では Skaffold を使用するためにプロファイルは必要ありませんが、ターゲット間で異なる Kustomize kustomization.yaml ファイルを使用するなど、ターゲット間でマニフェストのカスタマイズを定義する場合に便利です。

Kustomize サポート skaffold.yaml に追加する

Kustomize 構成を Cloud Deploy/Skaffold 構成と統合する場合は、次の作業を行います。

  1. 構成ファイルの間に kustomization.yaml ファイルを含めます。

    構成ファイルは、ローカル ディレクトリまたは Cloud Storage バケットに格納できます。

  2. skaffold.yaml ファイルで、プロファイルごとに deploy スタンザを作成します。

    プロファイルを使用していない場合、またはプロファイルに関連付けられていないデフォルトのデプロイ構成の場合は、定義されたプロファイルの外側に deploy スタンザを置くこともできます。

    以下に、プロファイルごとに deploy スタンザを表示し、my-app という架空のサンプルアプリを使用する Skaffold 構成の例を示します。

    apiVersion: skaffold/v4beta7
    kind: Config
    build:
      artifacts:
        - image: my-app-web-profiles
          context: my-app-web-profiles
        - image: my-app-application-profiles
          context: my-app-application-profiles
      googleCloudBuild:
        projectId: ${PROJECT_ID}
    profiles:
    - name: local
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/local
    - name: test
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/test
    - name: staging
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/staging
    - name: prod
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/prod
    deploy:
      kubectl: {}
    

    ここに示す Skaffold 構成には、teststagingprod のターゲット用の個別のプロファイルがあります。また、ローカル開発用のプロファイルも表示されます。 各プロファイルには、ターゲットに使用する Kustomization の場所を指すパスを持つ deploy.kustomize スタンザがあります。

skaffold.yaml に Helm サポートを追加する

Helm を使用して、マニフェストをレンダリングできます。Cloud Deploy は、アプリケーションのデプロイに Helm は使用せず、デプロイツールとして kubectl のみをサポートします。

Helm を使用するには、Helm チャートまたはチャートが skaffold.yaml 内から参照できる任意の場所に保存されている必要があります。この場所は、ファイル システム、リポジトリ、場合によっては skaffold.yaml とともに、あるいは Open Container Initiative(OCI)リポジトリにあります。

Helm チャートを使用するには、helm スタンザを skaffold.yaml ファイルに追加します。

apiVersion: skaffold/v4beta7
kind: Config
build:
  artifacts:
  - image: skaffold-helm-image
manifests:
  helm:
    releases:
    - name: skaffold-helm-image
      chartPath: charts
deploy:
  kubectl: {}

skaffold.yaml リファレンスに、この helm スタンザに必要なものが示されています。

サポートされていない Skaffold の機能

次の Skaffold の機能は Cloud Deploy では使用できません。

次のステップ

  • Skaffold のサイトにアクセスして、この仕組みと何ができるかをご確認ください。

  • Kustomize プロファイルと Skaffold プロファイルで Cloud Deploy を使用して実践する。

  • Cloud Deploy で使用する Skaffold のバージョンを選択する方法、Skaffold のバージョンがいつ変更されるか、使用されているバージョンを判断する方法を確認する

  • Helm、Kustomize、kpt などの高度なマニフェスト管理ツールで Skaffold プロファイルを使用する方法については、こちらをご覧ください。