準備 Kubernetes 應用程式的 Azure 容器技術資產
本文提供技術資源和建議,協助您在 Azure Marketplace 上為 Kubernetes 應用程式建立容器供應專案。
如需 Kubernetes 應用程式型容器供應專案所需的技術資產完整範例,請參閱 適用於 Kubernetes 的 Azure Marketplace 容器供應專案範例。
基本技術知識
設計、建置和測試這些資產需要一段時間,而且需要 Azure 平臺和用來建置供應專案的技術技術知識。
除了解決方案領域之外,您的工程小組也應該具備下列Microsoft技術的知識:
- 對 Azure 服務的基本 瞭解
- 如何 設計和建構 Azure 應用程式
- Azure Resource Manager 的工作 知識
- JSON 的工作 知識
- Helm 的工作 知識
- createUiDefinition 的工作 知識
- Azure Resource Manager (ARM) 範本的工作 知識
必要條件
您的應用程式必須是 Helm 圖表型。
Helm 圖表不應包含
.tgz
封存盤案;所有檔案都應該解壓縮。如果您有多個圖表,您可以將其他 helm 圖表包含在主要 Helm 圖表之外做為子圖表。
所有影像參考和摘要詳細數據都必須包含在圖表中。 運行時間無法下載其他圖表或影像。
您必須擁有作用中的發佈租用戶或發佈租使用者和合作夥伴中心帳戶的存取權。
您必須已建立屬於上述作用中發行租使用者的 Azure Container Registry (ACR)。 您將將雲端原生應用程式套件組合 (CNAB) 上傳至該套件。 如需詳細資訊,請參閱 建立 Azure Container Registry。
安裝最新版的 Azure CLI。
應用程式必須可部署到Linux環境。
映像必須沒有弱點。 如需指定弱點掃描需求的指引,請參閱 針對容器認證進行疑難解答。 若要瞭解如何掃描弱點,請參閱使用 Microsoft Defender 弱點管理 的 Azure 弱點評估。
如果手動執行封裝工具,則需要安裝本機計算機。 如需詳細資訊,請參閱適用於 Windows 或 Linux 的 Docker 檔上的 WSL 2 後端一節。 只有 Linux/Windows AMD64 機器才支援此功能。
限制
- Container Marketplace 僅支援以 Linux 平台為基礎的 AMD64 映射。
- Container Marketplace 供應項目支援部署至 受控 AKS 和 已啟用 Arc 的 Kubernetes 。 單一供應專案只能以一個叢集類型為目標,例如受控 AKS 或已啟用 Arc 的 Kubernetes。
- 已啟用 Arc 的 Kubernetes 叢集供應專案僅支援預先定義的計費模型。 如需計費模型的詳細資訊,請參閱 規劃 Azure 容器供應專案。
- 不支援單一容器。
- 不支持連結的 Azure Resource Manager 範本。
發佈概觀
在 Azure Marketplace 上發布 Kubernetes 應用程式型容器供應專案的第一個步驟,是將您的應用程式封裝為雲端原生應用程式套件組合(CNAB)。 CNAB 是由您應用程式的成品所組成,會先發佈至私人 Azure Container Registry (ACR),稍後再推送至擁有Microsoft的公用 ACR,並做為您在合作夥伴中心參考的單一成品使用。
從該處執行弱點掃描,以確保映像安全。 最後,Kubernetes 應用程式會註冊為 Azure Kubernetes Service (AKS) 叢集的擴充類型。
發佈供應項目之後,您的應用程式會 利用 AKS 功能的叢集延伸模組來管理 AKS 叢集內的應用程式生命週期。
授與 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/myregistry",
...
接下來,建立角色指派,以授與服務主體使用您稍早取得的值從登錄提取的能力:
若要指派 Azure 角色,您必須具備:
Microsoft.Authorization/roleAssignments/write
許可權,例如 使用者存取系統管理員 或 擁有者
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 圖表之外做為子圖表。 所有相依的 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 底下新增此標籤。
針對 perCore 計費模型,指定 CPU 要求 ,方法是在
resources:requests
容器資源指令清單中包含字段。 每個核心計費模型只需要此步驟。
在部署期間,叢集擴充功能會以擴充功能實例名稱取代計費標識符值。
如需設定為部署 Azure 投票應用程式的範例,請參閱下列各項:
針對 自定義計量 計費模型,請在 helm 範本的 values.yaml 檔案中新增下列欄位
- clientId 應該新增至 global.azure.identity 底下
- planId 密鑰應該新增至 global.azure.marketplace 底下。 planId
- resourceId 應該新增在 global.azure.extension.resrouceId 下
在部署期間,叢集擴充功能會將這些欄位取代為適當的值。 如需範例,請參閱 Azure 投票自定義計量型應用程式。
驗證 Helm 圖表
若要確保 Helm 圖表有效,請測試其可安裝在本機叢集上。 您也可以使用 helm install --generate-name --dry-run --debug
來偵測特定範本產生錯誤。
建立及測試 createUiDefinition
createUiDefinition 是 JSON 檔案,會在部署應用程式時定義 Azure 入口網站 的使用者介面元素。 如需詳細資訊,請參閱
或查看 UI 定義的 範例,其會要求輸入數據以取得新的或現有的叢集選擇,並將參數傳遞至您的應用程式。
為您的應用程式建立createUiDefinition.json檔案之後,您必須測試用戶體驗。 若要簡化測試,請將檔案內容 複製到沙箱環境。 沙箱會以最新的全螢幕入口網站體驗呈現您的使用者介面。 沙箱是預覽使用者介面的建議方式。
建立 Azure Resource Manager (ARM) 範本
ARM 範本會定義要部署的 Azure 資源。 根據預設,您將部署 Azure Marketplace 應用程式的叢集擴充資源。 您可以選擇部署 AKS 叢集。
我們目前只允許下列資源類型:
Microsoft.ContainerService/managedClusters
Microsoft.KubernetesConfiguration/extensions
例如,請參閱此 範例 ARM 範本 ,其設計目的是從先前連結的範例 UI 定義取得結果,並將參數傳遞至您的應用程式。
用戶參數流程
請務必瞭解用戶參數在您建立和封裝的成品中如何流動。 在 Azure 投票應用程式範例中,透過createUiDefinition.json檔案建立 UI 時,一開始會定義參數:
參數會透過 區 outputs
段匯出:
值會從該處傳遞至 Azure Resource Manager 範本,並在部署期間傳播至 Helm 圖表:
最後,值會傳遞至 Helm 圖表 values.yaml
,如下所示。
注意
在此範例中, 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 | 延伸模組安裝的預設範圍。 接受的值為 cluster 或 namespace 。 如果 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 Arc 的 Kubernetes 叢集以驗證應用程式的詳細資訊,請參閱 快速入門:將現有的 Kubernetes 叢集聯機至 Azure Arc。
使用容器封裝工具
新增所有必要的成品之後,請執行封裝工具來 container-package-app
驗證成品、建置套件,並將套件上傳至 Azure Container Registry。
由於 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>
接下來,執行 cpa verify
以逐一查看成品,並逐一驗證它們,並解決任何失敗。 cpa buildbundle
當您準備好封裝並將 CNAB 上傳至 Azure Container Registry 時執行。 此命令 cpa buildbundle
會執行驗證程式、建置套件,並將套件上傳至您的 Azure Container Registry。
cpa verify
cpa buildbundle
注意
只有當您想要覆寫現有的標記時,才使用 cpa buildbundle --force
。 如果您已經將此 CNAB 附加至 Azure Marketplace 供應專案,請改為遞增指令清單檔案中的版本。
整合至 Azure Pipeline
如需如何整合 container-package-app
至 Azure Pipeline 的範例,請參閱 Azure Pipeline 範例