Cloud Deploy で Skaffold を使ってみる

このドキュメントでは、Cloud Deploy の一部として Skaffold を使用する方法について説明します。内容は次のとおりです。

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

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
    
  • manifests スタンザ。GKE、GKE Enterprise、Cloud Run で、すべての未加工の Kubernetes マニフェストを一覧表示します(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: {}
    

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

    Cloud Run ターゲットの場合:

    deploy:
      cloudrun: {}
    

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

カスタム ターゲットを使用している場合、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 にも使用できます。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 Service のアーキテクチャをご覧ください。

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

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

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 プロファイルを使用する方法を学習する