Cloud Deploy でマニフェストを管理する

このページでは、デリバリー パイプライン内の各ターゲットの構成をレンダリングするように Cloud Deploy を構成する方法について説明します。

Cloud Deploy は Skaffold を使用して Kubernetes マニフェストをレンダリングします。このサービスは、未加工のマニフェストと HelmKustomizekpt などの高度なマニフェスト管理ツールのレンダリングをサポートしています。

レンダリング プロセスには 2 つのステージがあります。

  1. マニフェスト管理ツールがマニフェストを生成します。

  2. Skaffold は、マニフェストのイメージ参照を、リリースにデプロイするイメージに置き換えます。

このページでは、Helm と Kustomize を使用した構成の例を示します。

Skaffold を使用して構成を生成する

Skaffold 構成ファイル(skaffold.yaml)がまだない場合は、Skaffold を使用して、リポジトリの内容に基づいて Skaffold を生成できます。

  1. Google Cloud CLI を使用して Skaffold をインストールします。

    gcloud components install skaffold

  2. マニフェストを含むリポジトリで skaffold init を実行します。

    skaffold init --skip-build

このコマンドにより、リポジトリに skaffold.yaml ファイルが作成されます。このファイルは、そのリポジトリのマニフェストを参照します。内容は次のようになります。

apiVersion: skaffold/v4beta7
kind: Config
metadata:
  name: sample-app
manifests:
  rawYaml:
    - k8s-manifests/deployment.yaml
    - k8s-manifests/rbac.yaml
    - k8s-manifests/redis.yaml
    - k8s-manifests/service.yaml

未加工マニフェストのレンダリング

未加工のマニフェストは Helm や Kustomize などのツールによって管理されないマニフェストであるため、ハイドレートやクラスタへのデプロイの前に前処理は不要です。

デフォルトでは、Cloud Deploy は skaffold render を使用して Kubernetes マニフェストをレンダリングし、タグ付けされていないイメージ名を、デプロイするコンテナ イメージのタグ付けされたイメージ名に置き換えます。リリースを昇格すると、Cloud Deploy は skaffold apply を使用してマニフェストを適用し、イメージを Google Kubernetes Engine クラスタにデプロイします。

基本構成の manifests スタンザは次のようになります。

manifests:
  rawYaml:
    - PATH_TO_MANIFEST

ここに渡すことができる値の詳細については、Skaffold のドキュメントをご覧ください。

Helm を使用したレンダリング

Cloud Deploy を使用して Helm チャートをレンダリングできます。これを行うには、Skaffold プロファイルの deploy スタンザに Helm チャートに関する詳細情報を含めます。

各定義は次のようになります。

apiVersion: skaffold/v4beta7
kind: Config
manifests:
  helm:
    releases:
      - name: RELEASE_NAME
        chartPath: PATH_TO_HELM_CHART

ここで

RELEASE_NAME は、このリリースの Helm チャート インスタンスの名前です。

PATH_TO_HELM_CHART は、パッケージ化された Helm チャートまたは解凍された Helm チャート ディレクトリへのローカルパスです。

Skaffold のドキュメントに記載されているように、追加の Helm 構成オプションを使用できます。

Kustomize を使用したレンダリング

Cloud Deploy で Kustomize を使用できます。これを行うには、skaffold.yaml プロファイル構成の deploy スタンザ内から Kustomization ファイルを参照します。

Kustomize を使用するターゲットごとに、skaffold.yaml の対応する profile の下に個別の Kustomize 構成を含めます。

各定義は次のようになります。

apiVersion: skaffold/v4beta7
kind: Config
manifests:
  kustomize:
    paths:
      - PATH_TO_KUSTOMIZE

ここで

PATH_TO_KUSTOMIZE は Kustomization ファイルを指定します。デフォルト値は ["."] です

Skaffold のドキュメントで説明されているように、追加の Kustomize 構成オプションを使用できます。

ターゲットごとに異なるマニフェストの構成

多くの場合、各ターゲットには若干異なる設定が必要です。たとえば、本番環境のデプロイには、ステージング デプロイよりも多くのレプリカがある場合があります。

各バリエーションを異なる Skaffold プロファイルとして指定すると、ターゲットごとに異なるマニフェスト セットをレンダリングできます。

未加工マニフェストを含むプロファイル

未加工のマニフェストを使用する場合は、ターゲットに応じて Cloud Deploy を別のファイルに指すことができます。次のように構成できます。

apiVersion: skaffold/v4beta7
kind: Config
profiles:
  - name: prod
    manifests:
      rawYaml:
        - prod.yaml
  - name: staging
    manifests:
      rawYaml:
        - staging.yaml

Kustomize を使用したプロファイル

Kustomize を使用してステージングと本番環境のプロファイルが異なる skaffold.yaml の例を示します。各プロファイルは異なる Kustomization を指定します。

apiVersion: skaffold/v4beta7
kind: Config
profiles:
  - name: prod
    manifests:
      kustomize:
        paths:
          - environments/prod
  - name: staging
    manifests:
      kustomize:
        paths:
          - environments/staging

デリバリー パイプラインで参照されるプロファイル

skaffold.yaml で定義されている次のプロファイルは、ターゲットごとにデリバリー パイプライン構成で参照されます。

serialPipeline:
  stages:
  - targetId: staging-target
    profiles:
    - staging
  - targetId: prod-target
    profiles:
    - prod

リリースの作成時に特定の画像を置き換える

マニフェストでは、イメージ名のプレースホルダを使用できます。このプレースホルダは、リリースを作成するときに置き換えることができます。

イメージのプレースホルダを含むマニフェストの例を次に示します。

apiVersion: v1
kind: Deployment
metadata:
  name: getting-started
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: my-app-image

リリースを作成するときに、--images= フラグを使用して、デプロイする特定のイメージを指定できます。たとえば、次のコマンドはリリースを作成し、プレースホルダ名に SHA 修飾付きのイメージ名を代入します。

gcloud deploy releases create test-release-001 \
  --project=test-gke-using-deployment \
  --region=us-central1 \
  --delivery-pipeline=my-gke-demo-app-1 \
  --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

レンダリングされたマニフェストには、my-app-image ではなく、指定したイメージへの参照が含まれます。

次のステップ