Cloud Marketplace で Terraform Kubernetes アプリを提供する

Google Cloud Marketplace の Terraform Kubernetes アプリを使用すると、お客様は Terraform を使用して、コンテナ化されたアプリを Google Kubernetes Engine にデプロイできます。Terraform Kubernetes アプリは、すべての Cloud Marketplace ユーザーに一般公開するか、Private Offers を使用して非公開で提供できます。また、無料で提供することも、選択した指標に基づいて使用料金を請求することもできます。アプリが無料の場合、ユーザーには Google Cloud リソースの使用量に対してのみ課金されます。

Cloud Marketplace で提供する Terraform Kubernetes アプリは、Artifact Registry でホストする Helm チャートを使用して構成を定義します。設定が完了したら、Producer Portal を介してアプリを Cloud Marketplace にオンボーディングします。

Terraform Kubernetes アプリのオンボーディングの概要

Cloud Marketplace で Terraform Kubernetes アプリを提供する手順は次のとおりです。

  1. Cloud Marketplace 用に Terraform Kubernetes アプリを準備します。これには、Artifact Registry の設定と、アプリのイメージの push が含まれます。

  2. Producer Portal でアプリの料金情報を追加します。

  3. Terraform モジュール、Helm チャート、コンテナ イメージなど、Producer Portal でアプリのデプロイを構成します。

  4. Cloud Marketplace にプロダクトを公開します。プロダクトをオンボーディングする際に、審査を受けるためにプロダクトのさまざまな部分を送信します。Cloud Marketplace チームが送信内容を審査し、問題がある場合は承認前に問題の解決をサポートします。すべての送信内容が承認されると、数分内にプロダクトを公開、開始できます。

Terraform Kubernetes アプリの要件

Cloud Marketplace で提供するすべてのプロダクトは、Cloud Marketplace のリスティング要件に準拠する必要があります。

Terraform Kubernetes アプリは、次の追加要件を満たす必要があります。

  • アプリは、x86 プロセッサを使用する GKE ノードで実行する必要があります。
  • アプリのすべての Helm チャートとコンテナ イメージを、Terraform Kubernetes アプリで使用しているのと同じリポジトリとプロジェクトの Artifact Registry レジストリにアップロードする必要があります。
  • Artifact Registry レジストリに Helm チャートが含まれている必要があります。
  • Terraform モジュールは、Terraform Kubernetes アプリで使用しているプロジェクトにある Cloud Storage バケットに ZIP ファイルとしてホストする必要があります。
  • Terraform モジュールのホストに使用する Cloud Storage バケットでバージョニングを有効にする必要があります。
  • コマンドラインからアプリをデプロイする手順、アプリを構成する手順、アプリを使用する手順を記載したユーザーガイドを含める必要があります。詳しくは、このドキュメントのユーザーガイドの要件をご覧ください。
  • 不安定な API からユーザーを保護するために、ベータ版または一般利用可能な Kubernetes リソースのみを使用します。

アプリ画像の要件

アプリの画像は次の要件を満たしている必要があります。

  • アプリのイメージはすべて、リリース トラックと現在のバージョンでタグ付けする必要があります。たとえば、2.0 リリース トラックでバージョン 2.0.5 をリリースする場合、対応するすべてのイメージに 2.02.0.5 のタグ付けをする必要があります。詳しくは、リリースを体系化するをご覧ください。
  • アプリのすべてのイメージのイメージ マニフェストに、次のアノテーションを含める必要があります。

    com.googleapis.cloudmarketplace.product.service.name=services/SERVICE_NAME
    

    SERVICE_NAME は、サービスの名前に置き換えます。サービス名を確認するには、Producer Portal の [概要] ページにあるプロダクトの表をご覧ください。アノテーションの詳細については、GitHub の Open Container Initiative のアノテーションのドキュメントをご覧ください。

Artifact Registry リポジトリの要件

アプリの Helm チャートとコンテナ イメージは、単一の Artifact Registry リポジトリの一部である必要があります。

たとえば、Artifact Registry リポジトリが us-docker.pkg.dev/exampleproject の場合、アプリの Helm チャートとコンテナ イメージは次のようになります。

  • us-docker.pkg.dev/exampleproject/exampleapp/chart
  • us-docker.pkg.dev/exampleproject/exampleapp/image1
  • us-docker.pkg.dev/exampleproject/exampleapp/image2

Terraform モジュールの要件

お客様は、Terraform モジュールを使用して、Infrastructure Manager を介して Cloud Marketplace からプロダクトをデプロイします。Terraform モジュールは、アプリの Kubernetes 構成をパッケージ化します。

サンプル モジュールを起点として、パートナー ガイドに沿って、アプリと互換性のある Terraform モジュールを構築します。

アプリに渡されるパラメータ

Terraform モジュールでは、お客様がアプリを選択するときに収集する必要があるパラメータを宣言しなければなりません。これらのパラメータは、ユーザーがアプリをデプロイするときに Helm チャート コンテナに渡されます。

これらのパラメータを構成するには、Terraform モジュールに schema.yaml ファイルを含める必要があります。

schema.yaml の作成方法については、GitHub のスキーマ作成ガイドをご覧ください。

GPU クラスタ リクエスト

アプリで特定の GPU が必要な場合、または GPU が多用される場合は、deployer スキーマを使用して、クラスタ内の GPU のタイプと数を指定できます。GPU のニーズを指定すると、支援されるクラスタの作成が無効になります。

アプリで汎用 Nvidia GPU または特定の Nvidia プラットフォームをリクエストできます。

アプリのユーザーガイドの要件

アプリのユーザーガイドには、次の情報を含める必要があります。

  • 概要: 基本機能と構成オプションを含む、アプリの一般的な概要。このセクションは、Cloud Marketplace で公開されているアプリにリンクする必要もあります。
  • 1 回限りの設定: これには、クラスタでアプリケーション リソースを管理できるように、Helm を構成してアプリケーション CustomResourceDefinition(CRD)をインストールする手順が含まれます。
  • インストール: 以下が含まれます。
    • アプリをデプロイするためのコマンド
    • UI 構成で使用できるパラメータを渡す
    • 不変ダイジェストにイメージ参照を固定する
    • Terraform モジュールに追加したカスタム入力フィールドに関する情報(該当する場合)。Terraform モジュールに入力フィールドを追加する手順をご覧ください。
  • 基本的な使用法: 次のタスクのガイド:
    • ユーザー名とパスワードを変更する
    • 管理コンソールへの接続(該当する場合)
    • クライアント ツールに接続し、サンプル コマンドを実行する方法(該当する場合)
    • 該当する場合は、Ingress を有効にして TLS 証明書をインストールする
  • バックアップと復元: アプリの状態をバックアップし、バックアップからアプリの状態を復元する方法に関する情報。
  • イメージの更新: パッチまたはマイナー アップデート用のアプリイメージを更新する方法に関する情報。
  • スケーリング: アプリのスケーリングに関する情報(該当する場合)。
  • 削除: アプリを削除し、PersistentVolumeClaims など、残っている可能性のあるリソースをクリーンアップするためのガイド。

Terraform Kubernetes アプリの料金モデル

アプリの料金モデルとして、次のいずれかを選択できます。

  • 無料: お客様は、使用した Google Cloud リソースの料金のみを支払います。
  • 従量制: お客様は、コンテナ数や保存時間など、貴社が選択した測定値(指標)に基づいてアプリの料金を支払います。従量制料金モデルを選択する場合は、アプリで使用状況情報を測定して Google に報告する必要があります。

使用量ベースの料金で Terraform Kubernetes アプリを公開した後、アプリの料金を更新できます。アプリの料金を更新するには、アプリを公開してから、または最後に料金を更新してから 30 日以上経過している必要があります。

従量制料金

Google Cloud Marketplace は、Kubernetes Pod のアノテーションを使用して、使用状況を追跡し、Cloud Marketplace アプリのデプロイに対してお客様に請求します。Cloud Marketplace は、請求と測定を Pod レベルで追跡し、プロダクト リスティング レベルで集計します。

同じマシン(vCPU、GPU、TPU、メモリ)に複数の Pod をデプロイすると、マシンにデプロイされたすべての Pod で発生した累積使用量が各 Pod に割り当てられます。たとえば、同じ GPU を共有する 3 つの Pod がある場合、Cloud Marketplace では 3 つの GPU としてカウントされます。

Cloud Marketplace では、各 vCPU、TPU、GPU、メモリの SKU ファミリー内の異なる GKE SKU は同一として扱われます。たとえば、GPU が指標として設定されている場合、顧客が GKE Autopilot T4 GPU Premium、GKE Autopilot L4GKE Autopilot H100 GPU Premium、GKE Autopilot A100 40 GiB GPU、GKE Autopilot A100 80 GiB GPU、GKE Autopilot H100 GPU Premium のいずれを使用しているかに関係なく、構成された価格が適用されます。

正確な顧客請求を保証するために、ビジネス ロジックを Cloud Marketplace アプリに統合することを強くおすすめします。ラベル アノテーションが誤って削除された場合の影響を軽減するには、ラベル アノテーションがまだ存在することを確認するようアプリを定期的に設計することをおすすめします。アノテーションがない場合、アプリはラベルが復元されるまで機能を制限する必要があります。Python での例については、次の例をご覧ください。

pod_name = os.environ.get("HOSTNAME")
namespace = open(
      "/var/run/secrets/kubernetes.io/serviceaccount/namespace"
).read()
# Load in-cluster config
config.load_incluster_config()
v1 = client.CoreV1Api()
# Get the Pod object
pod = v1.read_namespaced_pod(name=pod_name, namespace=namespace)
annotations = pod.metadata.annotations
if annotations:
print("Annotations for this pod:")
for key, value in annotations.items():
      print(f"  {key}: {value}")
else:
print("No annotations found on this pod.")

次のステップ