透過 Cloud Marketplace 提供 Terraform Kubernetes 應用程式

Google Cloud Marketplace 中的 Terraform Kubernetes 應用程式可讓客戶使用 Terraform,在 Google Kubernetes Engine 部署容器化應用程式。使用者使用 Terraform Kubernetes 應用程式時不會產生費用,但使用 Google Cloud 資源時會產生費用。您可以透過私密優惠,向所有 Cloud Marketplace 使用者公開提供 Terraform Kubernetes 應用程式,或私下提供。

透過 Cloud Marketplace 提供的 Terraform Kubernetes 應用程式,會使用您在 Artifact Registry 中代管的 Helm 資訊套件定義設定。設定完成後,您就可以透過 Producer Portal 將應用程式加入 Cloud Marketplace。

使用 Terraform 導入 Kubernetes 應用程式的總覽

如要透過 Cloud Marketplace 提供 Terraform Kubernetes 應用程式,請按照下列步驟操作:

  1. 準備 Cloud Marketplace 適用的 Terraform Kubernetes 應用程式。包括設定 Artifact Registry,以及將應用程式的映像檔推送至該服務。

  2. 在 Producer Portal 中新增應用程式的定價資訊

  3. 在 Producer Portal 中設定應用程式的部署作業,包括 Terraform 模組、Helm 資訊套件和容器映像檔。

  4. 將產品發布至 Cloud Marketplace。 在產品上架過程中,您會提交產品的各個部分以供審查。Cloud Marketplace 團隊會審查每項提交內容,並與您合作解決所有問題,然後再核准。所有提交內容都獲得核准後,你就能在幾分鐘內發布及推出產品。

Terraform Kubernetes 應用程式的規定

透過 Cloud Marketplace 提供的所有產品都必須符合 Cloud Marketplace 產品資訊規定

Terraform Kubernetes 應用程式必須符合下列額外規定:

  • 應用程式必須在採用 x86 處理器的 GKE 節點上執行。
  • 您必須將應用程式的所有 Helm 資訊圖表和容器映像檔上傳至 Artifact Registry 登錄檔,並使用與 Terraform Kubernetes 應用程式相同的存放區和專案。
  • Artifact Registry 登錄檔必須包含 Helm 資訊套件。
  • Terraform 模組必須以 ZIP 檔案的形式,儲存在與 Terraform Kubernetes 應用程式相同的專案中。
  • 您必須為用來代管 Terraform 模組的 Cloud Storage bucket 啟用版本管理功能。
  • 您必須添加使用手冊,針對應用程式逐步說明如何透過指令列部署,以及設定和使用方式。詳情請參閱本文的「使用者指南規定」。
  • 僅採用測試版或正式發佈版的 Kubernetes 資源,保護使用者免於不穩定 API 的威脅。

應用程式圖片規定

應用程式圖片必須符合下列規定:

  • 應用程式的所有映像檔都必須標示測試群組和目前版本。舉例來說,如果您要透過2.0發布2.0版本,所有對應圖片都必須標記為2.02.0.52.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 模組的相關規定

客戶可透過 Infrastructure Manager,使用 Terraform 模組從 Cloud Marketplace 部署您的產品。Terraform 模組會封裝應用程式的 Kubernetes 設定。

範例模組做為起點,並按照合作夥伴指南,建構與應用程式相容的 Terraform 模組。

傳送至應用程式的參數

您的 Terraform 模組必須宣告要在客戶選取應用程式時向他們收集的參數,接著系統會在使用者部署應用程式時將這些參數提供給 Helm 圖表容器。

如要設定這些參數,Terraform 模組必須包含 schema.yaml 檔案。

如要瞭解如何建立 schema.yaml,請參閱 GitHub 上的架構建立指南

GPU 叢集要求

如果應用程式有特定的 GPU 需求,或是需要大量 GPU 資源,可以使用部署工具架構,在叢集中指定 GPU 類型和數量。如果您指定 GPU 需求,系統會關閉輔助叢集建立功能。

應用程式可能會要求使用一般 Nvidia GPU,或特定 Nvidia 平台

應用程式使用手冊的需求

應用程式的使用手冊必須包含下列資訊:

  • 總覽:應用程式的一般總覽,涵蓋基本功能和設定選項。這個區段也必須連結至您在 Cloud Marketplace 發布的應用程式。
  • 一次性設定:包括設定 Helm 和安裝應用程式 CustomResourceDefinition (CRD) 的步驟,以便叢集管理應用程式資源。
  • 安裝:包括下列項目:
  • 基本用法:下列工作的指南:
    • 修改使用者名稱和密碼
    • 連線至管理控制台 (如果適用)
    • 連線至用戶端工具並執行範例指令 (如果有的話)
    • 啟用輸入功能並安裝傳輸層安全標準 (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 的 Pod,Cloud Marketplace 會將此視為三個 GPU。

在每個 vCPU、TPU、GPU 或記憶體系列的 SKU 中,Cloud Marketplace 會將不同的 GKE SKU 視為相同。舉例來說,如果 GPU 設為指標,無論客戶使用 GKE Autopilot T4 GPU Premium、GKE Autopilot L4、GKE 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.")

後續步驟