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 Code と Cloud Code for IntelliJ の IDE 拡張機能は、継続的な開発のために Skaffold を Visual Studio Code と JetBrains IDE に統合します。

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

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

Skaffold を介して、Helm や Kustomize などのサードパーティのマニフェスト管理ツールと統合することもできます。このように 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
    
  • GKE、GKE 接続クラスタ、または Cloud Run の manifests スタンザ。すべての未加工の Kubernetes マニフェストが一覧表示されます(Helm や Kustomize などのマニフェスト管理ツールを使用している場合を除く)。

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

    manifests:
      rawYaml:
      - deployment.yaml
    

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

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

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

    GKE クラスタと GKE 接続クラスタの場合:

    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 ソースのステージング ディレクトリで使用できるようになります。

次のコマンドには、Kubernetes マニフェストを渡す --from-k8s-manifest フラグが含まれています。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 では、他のデプロイツールによるアプリケーションのデプロイはサポートされていません。ただし、レンダリングには Helm や Kustomize などのツールを使用できます。

デプロイツールとして kubectl を使用して Cloud Deploy をデプロイする方法の詳細については、Cloud Deploy Service のアーキテクチャをご覧ください。

Skaffold プロファイルについて

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

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

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 構成には、test、staging、prod ターゲット用の個別のプロファイルがあります。また、ローカル開発用のプロファイルも表示されます。 各プロファイルには、そのターゲットに使用する 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 機能

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

次のステップ

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

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

  • Cloud Deploy で使用するツールのバージョンを選択する方法と、使用されているバージョンを判断する方法を確認する。

  • Helm、Kustomize、kpt などの高度なマニフェスト管理ツールで Skaffold プロファイルを使用する方法を学習する。