共用方式為


準備 Kubernetes 應用程式的 Azure 容器技術資產

本文提供技術資源和建議,協助您在 Azure Marketplace 上為 Kubernetes 應用程式建立容器供應專案。

如需 Kubernetes 應用程式型容器供應專案所需的技術資產完整範例,請參閱 適用於 Kubernetes 的 Azure Marketplace 容器供應專案範例。

基本技術知識

設計、建置和測試這些資產需要一段時間,而且需要 Azure 平臺和用來建置供應專案的技術技術知識。

除了解決方案領域之外,您的工程小組也應該具備下列Microsoft技術的知識:

必要條件

  • 您的應用程式必須是 Helm 圖表型。

  • 如果您有多個圖表,您可以將其他 helm 圖表包含在主要 Helm 圖表之外做為子圖表。

  • 所有影像參考和摘要詳細數據都必須包含在圖表中。 運行時間無法下載其他圖表或影像。

  • 您必須擁有作用中的發佈租用戶或發佈租使用者和合作夥伴中心帳戶的存取權。

  • 您必須已建立屬於上述作用中發行租使用者的 Azure Container Registry (ACR)。 您將將雲端原生應用程式套件組合 (CNAB) 上傳至該套件。 如需詳細資訊,請參閱 建立 Azure Container Registry

  • 安裝最新版的 Azure CLI。

  • 應用程式必須可部署到Linux環境。

  • 映像必須沒有弱點。 若要瞭解如何掃描弱點,請參閱使用 Microsoft Defender 弱點管理 的 Azure 弱點評估。

  • 如果手動執行封裝工具,則需要安裝本機計算機。 如需詳細資訊,請參閱適用於 WindowsLinux 的 Docker 檔上的 WSL 2 後端一節。 只有 Linux/Windows AMD64 機器才支援此功能。

限制

  • Container Marketplace 僅支援以 Linux 平台為基礎的 AMD64 映射。
  • 僅限受控 AKS。
  • 不支援單一容器。
  • 不支持連結的 Azure Resource Manager 範本。

發佈概觀

在 Azure Marketplace 上發布 Kubernetes 應用程式型容器供應專案的第一個步驟,是將您的應用程式封裝為雲端原生應用程式套件組合(CNAB)。 CNAB 是由您應用程式的成品所組成,會先發佈至私人 Azure Container Registry (ACR),稍後再推送至擁有Microsoft的公用 ACR,並做為您在合作夥伴中心參考的單一成品使用。

從該處執行弱點掃描,以確保映像安全。 最後,Kubernetes 應用程式會註冊為 Azure Kubernetes Service (AKS) 叢集的擴充類型。

發佈供應項目之後,您的應用程式會 利用 AKS 功能的叢集延伸模組來管理 AKS 叢集內的應用程式生命週期。

此圖顯示套件組合處理的三個階段,從「將套件組合複製到Microsoft擁有的登錄」到「弱點掃描」到「延伸模塊類型註冊」。

授與 Azure Container Registry 的存取權

作為發佈程式的一部分,Microsoft將 CNAB 從 ACR 深層複製到Microsoft擁有的 Azure Marketplace 特定 ACR。 映射會上傳至可供所有人存取的公用登錄。 此步驟會要求您授與登錄Microsoft存取權。 ACR 必須位於連結至合作夥伴中心帳戶的相同Microsoft Entra 租使用者中。

Microsoft具有第一方應用程式,負責使用 id 32597670-3e15-4def-8851-614ff48c1efa的 來處理此程式。 若要開始,請根據應用程式建立服務主體:

注意

如果您的帳戶沒有建立服務主體的許可權, az ad sp create 則傳回包含「許可權不足而無法完成作業」的錯誤訊息。 請連絡您的Microsoft Entra 系統管理員以建立服務主體。

az login

確認應用程式是否已存在服務主體:

az ad sp show --id 32597670-3e15-4def-8851-614ff48c1efa 

如果上一個命令未傳回任何結果,請建立新的服務主體:

az ad sp create --id 32597670-3e15-4def-8851-614ff48c1efa

請記下服務主體的標識碼,以在下列步驟中使用。

接下來,取得登錄的完整標識碼:

az acr show --name <registry-name> --query "id" --output tsv

輸出應該如下列顯示:

...
},
"id": "/subscriptions/ffffffff-ff6d-ff22-77ff-ffffffffffff/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/myregistry",
...

接下來,建立角色指派,以授與服務主體使用您稍早取得的值從登錄提取的能力:

若要指派 Azure 角色,您必須具備:

az role assignment create --assignee <sp-id> --scope <registry-id> --role acrpull

最後,在用來建立 Azure Container Registry 的相同訂用帳戶上註冊 Microsoft.PartnerCenterIngestion 資源提供者:

az provider register --namespace Microsoft.PartnerCenterIngestion --subscription <subscription-id> --wait

監視註冊並確認它已完成,然後再繼續:

az provider show -n Microsoft.PartnerCenterIngestion --subscription <subscription-id>

收集成品以符合套件格式需求

每個 CNAB 都由下列成品組成:

  • Helm 圖表
  • CreateUiDefinition
  • ARM 範本
  • 資訊清單檔

更新 Helm 圖表

確定 Helm 圖表遵守下列規則:

  • 所有映像名稱和參考都會參數化,並以 global.azure.images 參考表示 values.yaml 。 更新 Helm 圖表範本檔案 deployment.yaml 以指向這些影像。 這可確保可以更新映像區塊,以參考 Azure Marketplace 的 ACR 映射。 顯示擴充新增標籤支援參考範例的螢幕快照。顯示新增影像參考的螢幕快照。

  • 如果您有多個圖表,您可以將其他 helm 圖表包含在主要 Helm 圖表之外做為子圖表。 然後更新每個相依影像參考,以指向主圖表 values.yaml中包含的影像。

  • 參考影像時,您可以使用標記或摘要。 不過,請務必注意映像會在內部重新標記,以指向Microsoft擁有的 Azure Container Registry (ACR)。 當您更新標籤時,必須將新版本的 CNAB 提交至 Azure Marketplace。 這可讓變更反映在客戶部署中。

    顯示新增標籤支持參考範例的螢幕快照。

可用的計費模型

如需所有可用的計費模型,請參閱 Azure Kubernetes 應用程式的授權選項。

根據您的計費模型進行更新

閱可用的計費模型之後,請選取適合使用案例的計費模型,然後完成下列步驟:

完成下列步驟,以在 [每個核心]、[每個 Pod]、[每個節點計費模型] 中新增標識符:

  • 將計費標識符標籤azure-extensions-usage-release-identifier新增至工作負載 yaml 檔案中的 Pod 規格。

    • 如果工作負載指定為 Deployments 或 Replicasets 或 Statefulsets 或 Daemonsets 規格,請在 .spec.template.metadata.label 底下新增此卷標。

    • 如果工作負載直接指定為 Pod 規格,請在 .metadata.label 底下新增此標籤。

      deployment.yaml 檔案中正確格式化計費標識符標籤的螢幕快照。內容類似於本文中連結的範例 depoyment.yaml 檔案。

      statefulsets.yaml 檔案中正確格式化計費標識符卷標的螢幕快照。內容類似於本文中連結的範例 statefulsets.yaml 檔案。

      精靈sets.yaml 檔案中 CPU 資源要求的螢幕快照。內容類似於本文中連結的範例 daemonsets.yaml 檔案。

      pods.yaml 檔案中 CPU 資源要求的螢幕快照。內容類似於本文中連結的範例 pods.yaml 檔案。

  • 針對 perCore 計費模型,指定 CPU 要求 ,方法是在 resources:requests 容器資源指令清單中包含字段。 每個核心計費模型只需要此步驟。

    pods.yaml 檔案中 CPU 資源要求的螢幕快照。內容類似於本文中連結的每個核心計費模型檔案範例。

在部署期間,叢集擴充功能會以擴充功能實例名稱取代計費標識符值。

如需設定為部署 Azure 投票應用程式的範例,請參閱下列各項:

針對 自定義計量 計費模型,請在 helm 範本的 values.yaml 檔案中新增下列欄位

  • clientId 應該新增至 global.azure.identity 底下
  • planId 密鑰應該新增至 global.azure.marketplace 底下。 planId
  • resourceId 應該新增在 global.azure.extension.resrouceId 下

自訂計量計費的螢幕快照。

在部署期間,叢集擴充功能會將這些欄位取代為適當的值。 如需範例,請參閱 Azure 投票自定義計量型應用程式

建立測試參數檔案

測試參數檔案是 JSON,用來與 ARM 範本搭配使用,以將資源部署至 Azure。 對於可部署到受控叢集的應用程式或延伸模組(AKS),我們需要指定參數檔案以進行部署驗證。 測試參數檔案應該包含可允許成功測試部署的值。

注意

並非所有參數都必須包含在參數檔案中,只是沒有預設值的參數。 如需指引,請參閱 這裡

以下是範例測試參數檔案:

範例測試參數檔案。 建立測試參數檔案之後,請將它新增至指令清單檔案:

已建立的測試參數檔案範例。

注意

針對測試參數檔案不適用於您的應用程式的情況(例如:應用程式需要秘密來部署,例如 API 金鑰或應用程式部署在連線叢集上),則會提供skipdeployment旗標,讓您略過部署測試。

驗證 Helm 圖表

若要確保 Helm 圖表有效,請測試其可安裝在本機叢集上。 您也可以使用 helm install --generate-name --dry-run --debug 來偵測特定範本產生錯誤。

建立及測試 createUiDefinition

createUiDefinition 是 JSON 檔案,會在部署應用程式時定義 Azure 入口網站 的使用者介面元素。 如需詳細資訊,請參閱

為您的應用程式建立createUiDefinition.json檔案之後,您必須測試用戶體驗。 若要簡化測試,請將檔案內容 複製到沙箱環境。 沙箱會以最新的全螢幕入口網站體驗呈現您的使用者介面。 沙箱是預覽使用者介面的建議方式。

建立 Azure Resource Manager (ARM) 範本

ARM 範本會定義要部署的 Azure 資源。 根據預設,您將部署 Azure Marketplace 應用程式的叢集擴充資源。 您可以選擇部署 AKS 叢集。

我們目前只允許下列資源類型:

  • Microsoft.ContainerService/managedClusters
  • Microsoft.KubernetesConfiguration/extensions

例如,請參閱此 範例 ARM 範本 ,其設計目的是從先前連結的範例 UI 定義取得結果,並將參數傳遞至您的應用程式。

用戶參數流程

請務必瞭解用戶參數在您建立和封裝的成品中如何流動。 在 Azure 投票應用程式範例,透過createUiDefinition.json檔案建立 UI 時,一開始會定義參數:

本文所連結 createUiDefinition 範例的螢幕快照。會顯示 『value1』 和 'value2' 的定義。

參數會透過 區 outputs 段匯出:

本文所連結 createUiDefinition 範例的螢幕快照。會顯示應用程式標題、'value1' 和 'value2' 的輸出行。

值會從該處傳遞至 Azure Resource Manager 範本,並在部署期間傳播至 Helm 圖表:

本文中連結的 Azure Resource Manager 範例螢幕快照。在 'configurationSettings' 下,會顯示應用程式標題 、'value1' 和 'value2' 的參數。

最後,值會傳遞至 Helm 圖表 values.yaml ,如下所示。

本文中連結之 Helm 圖表範例的螢幕快照。會顯示應用程式標題、'value1' 和 'value2' 的值。

注意

在此範例中, extensionResourceName 也會參數化並傳遞至叢集擴充資源。 同樣地,其他擴充屬性也可以參數化,例如啟用次要版本的自動升級。 如需叢集擴充屬性的詳細資訊,請參閱 選擇性參數

建立指令清單檔案

套件指令清單是一個 yaml 檔案,描述套件及其內容,並告知封裝工具找出相依成品的位置。

指令清單中使用的欄位如下所示:

名稱 資料類型 描述
applicationName String 應用程式的名稱
publisher String 發行者的名稱
description String 套件的簡短描述
version 格式的 #.#.# 字串 描述應用程式套件版本的版本字串,可能或可能不符合內部二進位檔的版本。
helmChart String 可相對於此找到 Helm 圖表的本機目錄 manifest.yaml
clusterARMTemplate String 您可以在找到 ARM 範本描述符合限制欄位中需求的 AKS 叢集的本機路徑
uiDefinition String 您可以在其中找到描述 Azure 入口網站 建立體驗的 JSON 檔案的本機路徑
registryServer String 應推送最終 CNAB 組合的 ACR
extensionRegistrationParameters 集合 延伸模組註冊參數的規格。 至少 defaultScope 包含和 作為參數。
defaultScope String 延伸模組安裝的預設範圍。 接受的值為 clusternamespace。 如果 cluster 已設定 scope,則每個叢集只允許一個擴充實例。 如果 namespace 選取範圍,則每個命名空間只允許一個實例。 Kubernetes 叢集可以有多個命名空間,擴充功能的多個實例可以存在。
命名空間 String (選擇性)指定延伸模組安裝的命名空間。 當 defaultScope 設為 cluster 時需要此屬性。 如需命名空間命名限制,請參閱 命名空間和 DNS
supportedClusterTypes 集合 (選擇性)指定應用程式支援的叢集類型。 允許的類型包括 :“managedClusters”、“connectedClusters”。 “managedClusters” 是指 Azure Kubernetes Service (AKS) 叢集。 “connectedClusters” 是指已啟用 Azure Arc 的 Kubernetes 叢集。 如果未提供 supportedClusterTypes,預設會支援 'managedClusters' 的所有散發。 如果提供 supportedClusterTypes,且未提供指定的最上層叢集類型,則該叢集類型的所有散發套件和 Kubernetes 版本都會被視為不受支援。 針對每個叢集類型,指定一或多個具有下列屬性的散發套件清單:
-分配
- distributionSupported
- unsupportedVersions
distribution 清單​​ 對應至叢集類型的散發數位。 提供特定散發套件的名稱。 將值設定為 [“All”] 以指出支援所有散發套件。
distributionSupported 布林值 布爾值,表示是否支援指定的散發。 如果為 false,則提供 UnsupportedVersions 會造成錯誤。
unsupportedVersions 清單​​ 不支援之指定散發套件的版本清單。 支援的運算子:
- 不支援 「=」 指定的版本。 例如,“=1.2.12”
>- 不支援大於指定版本的所有版本。 例如,“>1.1.13”
<- 不支援小於指定版本的所有版本。 例如,“<1.3.14”
- "..."不支援範圍中的所有版本。 例如,「1.1.2...1.1.15」 (包含右側值並排除左側值)

如需針對投票應用程式設定的範例,請參閱下列 指令清單檔案範例

建構您的應用程式

將 createUiDefinition、ARM 範本和指令清單檔案放在應用程式的 Helm 圖表旁邊。

如需正確結構化目錄的範例,請參閱 Azure 投票範例

如需支援已啟用 Azure Arc 的 Kubernetes 叢集的投票應用程式範例,請參閱 僅限 ConnectedCluster 的範例

如需支援 Azure Kubernetes Service (AKS) 叢集和已啟用 Azure Arc 的 Kubernetes 叢集的投票應用程式範例,請參閱 連線和受控叢集範例

如需如何設定已啟用 Azure Arc 的 Kubernetes 叢集以驗證應用程式的詳細資訊,請參閱 快速入門:將現有的 Kubernetes 叢集聯機至 Azure Arc

使用容器封裝工具

新增所有必要的成品之後,請執行封裝工具 container-package-app

由於 CNAB 是新的格式,而且具有學習曲線,因此我們已使用啟動載入環境和成功執行封裝工具所需的工具建立 Docker 映像 container-package-app

您有兩個選項可以使用封裝工具。 您可以手動使用它,或將其整合到部署管線中。

手動執行封裝工具

您可以從 提取 mcr.microsoft.com/container-package-app:latest封裝工具的最新影像。

下列 Docker 命令會提取最新的封裝工具映像,並掛接目錄。

假設 ~\<path-to-content> 是包含要封裝內容的目錄,下列 docker 命令會在 ~/<path-to-content> 容器中掛接至 /data 。 請務必將 取代 ~/<path-to-content> 為您自己的應用程式位置。

docker pull mcr.microsoft.com/container-package-app:latest

docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v ~/<path-to-content>:/data --entrypoint "/bin/bash" mcr.microsoft.com/container-package-app:latest 

container-package-app 容器殼層中執行下列命令。 請務必以 ACR 的名稱取代 <registry-name>

export REGISTRY_NAME=<registry-name>

az login 

az acr login -n $REGISTRY_NAME 

cd /data/<path-to-content>

若要驗證 ACR,有兩個選項。 其中一個選項是使用 az login 如先前所示,而第二個選項是透過docker 執行 docker login 'yourACRname'.azurecr.io。 輸入您的使用者名稱和密碼(使用者名稱應該是您的 ACR 名稱,密碼是 Azure 入口網站 中提供的金鑰並執行。

docker login <yourACRname.azurecr.io>

CLI 中 Docker 登入命令的螢幕快照。

接下來,執行 cpa verify 以逐一查看成品,並逐一驗證它們。 解決任何失敗,並在準備好封裝並將 CNAB 上傳至 Azure Container Registry 時執行 cpa buildbundle 。 命令 cpa buildbundle 也會在建置之前執行驗證程式

cpa verify

CLI 中 cpa verify 命令的螢幕快照。

cpa buildbundle 

注意

只有當您想要覆寫現有的標記時,才使用 cpa buildbundle --force 。 如果您已經將此 CNAB 附加至 Azure Marketplace 供應專案,請改為遞增指令清單檔案中的版本。

整合至 Azure Pipeline

如需如何整合 container-package-app 至 Azure Pipeline 的範例,請參閱 Azure Pipeline 範例

疑難排解