網站網路服務 (SNS) 部署可能會失敗,因為基礎網路功能 (NF) 部署無法正確安裝。 Azure作員服務管理員 (AOSM) 預設會從目標 Kubernetes 叢集移除失敗的部署,以保留資源。
Helm install 失敗通常需要資源持續保留在叢集上,以便能夠進行偵錯。 本 How-To 文章涵蓋如何編輯 NF ARM 範本,以透過將 helm install --atomic 參數設為 false 來覆寫此行為。
先決條件
- 您必須已使用 Az CLI AOSM 擴充功能將 NF 上線至 AOSM。 本文參考 CLI 所輸出的資料夾結構和檔案,並提供以 CLI 為基礎的範例
- 安裝 Helm 過程中的失敗可能相當複雜。 除了對 NF 的領域知識之外,偵錯還需要具備多種技術的專業知識。
- 具備對 Helm 的基礎工作知識
- Kubernetes 和 kubectl 命令的工作知識
- 熟悉將工件提取和推送至 Azure Container Registry 的操作知識
- 您需要在包含 AOSM 受管成品存放區的資源群組上獲得
Contributor角色分配 - 適當的 IDE,例如 Visual Studio Code
- ORAS CLI
這很重要
強烈建議您在嘗試使用 AOSM 進行部署之前,先測試 helm install Helm 套件在目標 Arc 連線的 Kubernetes 環境上成功。
單一 Helm 圖表 NF 的覆寫--atomic
本節說明如何覆寫 --atomic 由單一 Helm 圖表組成的 NF。
找出並編輯 NF Bicep 檔案
流覽至
nsd-cli-output目錄、開啟artifacts目錄,然後開啟<nf-arm-template>.bicep檔案。<nf-arm-template>已在 Az AOSM CLI 延伸模組 NSD 輸入檔中設定。 您可以針對虛構的 Contoso 容器化網路函式(CNF),與下列範例範本進行比較,以確認您有正確的檔案。@secure() param configObject object var resourceGroupId = resourceGroup().id var identityObject = (configObject.managedIdentityId == '') ? { type: 'SystemAssigned' } : { type: 'UserAssigned' userAssignedIdentities: { '${configObject.managedIdentityId}': {} } } var nfdvSymbolicName = '${configObject.publisherName}/${configObject.nfdgName}/${configObject.nfdv}' resource nfdv 'Microsoft.Hybridnetwork/publishers/networkfunctiondefinitiongroups/networkfunctiondefinitionversions@2023-09-01' existing = { name: nfdvSymbolicName scope: resourceGroup(configObject.publisherResourceGroup) } resource nfResource 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = [for (values, i) in configObject.deployParameters: { name: '${configObject.nfdgName}${i}' location: configObject.location identity: identityObject properties: { networkFunctionDefinitionVersionResourceReference: { id: nfdv.id idType: 'Open' } nfviType: 'AzureArcKubernetes' nfviId: (configObject.customLocationId == '') ? resourceGroupId : configObject.customLocationId allowSoftwareUpdate: true configurationType: 'Open' deploymentValues: string(values) } }]流覽至
cnf-cli-output目錄,開啟nfDefinition目錄,然後在nfdv資源中的 networkFunctionApplications 陣列中複製唯一項目的值,以尋找網路函式應用程式名稱。 藉由將您的值與以下虛構的 Contoso 範例 Bicep 代碼段進行比較,確認您擁有正確的值。 在這裡情況下,網路函式應用程式名稱稱為Contoso。resource nfdv 'Microsoft.Hybridnetwork/publishers/networkfunctiondefinitiongroups/networkfunctiondefinitionversions@2023-09-01' = { parent: nfdg name: nfDefinitionVersion location: location properties: { deployParameters: string(loadJsonContent('deployParameters.json')) networkFunctionType: 'ContainerizedNetworkFunction' networkFunctionTemplate: { nfviType: 'AzureArcKubernetes' networkFunctionApplications: [ { artifactType: 'HelmPackage' name: 'Contoso'將下列設定新增至 NF ARM 模板的
--atomic屬性中,以編輯模板覆寫預設的 helm 安裝nfResource選項:roleOverrideValues: ['{"name": "Contoso-one", "deployParametersMappingRuleProfile": {"applicationEnablement": "Enabled", "helmMappingRuleProfile": {"options": {"installOptions": {"atomic": "false"}},{"upgradeOptions": {"atomic": "false"}}}}}']透過比較 Contoso 範例 NF 中的以下片段,確認您已正確地進行此編輯。
resource nfResource 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = [for (values, i) in configObject.deployParameters: {
name: '${configObject.nfdgName}${i}'
location: configObject.location
identity: identityObject
properties: {
networkFunctionDefinitionVersionResourceReference: {
id: nfdv.id
idType: 'Open'
}
nfviType: 'AzureArcKubernetes'
nfviId: (configObject.customLocationId == '') ? resourceGroupId : configObject.customLocationId
allowSoftwareUpdate: true
configurationType: 'Open'
deploymentValues: string(values)
roleOverrideValues: [
'{"name":"Contoso-one","deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"injectArtifactStoreDetails":"true", "atomic": "false"},"upgradeOptions":{"injectArtifactStoreDetails":"true","atomic": "false"}}}}}'
]}}]
建置已編輯的 ARM 範本,並將其上傳至成品存放區
流覽至
nsd-cli-output/artifacts目錄,該目錄是由az aosm nsd build命令建立的,然後從 CLI 生成的 Bicep 檔案中建置網路功能 ARM 範本。bicep build <nf-name>.bicep從
az aosm nsd publish命令建立的成品資訊清單產生範圍對應權杖認證。這很重要
您必須使用
az aosm nsd publish命令建立的成品資訊清單。 NF ARM 範本只會在該資訊清單中宣告,因此只有此資訊清單所產生的範圍對應權杖可讓您將 NF ARM 範本推送 (或提取) 至成品存放區。az rest --method POST --url 'https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.HybridNetwork/publishers/<publisher>/artifactStores/<artifact-store>/artifactManifests/<artifactManifest>/listCredential?api-version=2023-09-01'登入 AOSM 管理下的 ACR。 您可以在 Azure 入口網站 Artifact Store 資源概觀中找到 AOSM 受控 ACR 名稱。 您可以在上一個步驟的輸出中找到使用者名稱和密碼。
oras login <aosm-managed-acr-name>.azurecr.io --username <username> --password <scope map token>使用 ORAS 將網路功能 ARM 範本上傳至 AOSM 受控 Azure Container Registry (ACR)。
<arm-template-version>成品標籤必須採用1.0.0格式。 和<arm-template-name><arm-template-version>必須符合 命令中所az aosm nsd publish建立成品指令清單中的值。
多重 Helm 圖表 NF 的覆寫--atomic
許多複雜的 NF 都是從多個 Helm 圖表建置的。 這些 NF 會以具有多個網路功能應用的網路功能定義版本(NFDV)表示,並且會隨多個 helm install 命令進行安裝 - 每個 helm chart 各用一個命令。
除了對 ARM 範本所做的編輯之外,多 helm NF 的覆寫 --atomic 程式與單一 helm NF 的程式相同。
虛擬的多重 helm NF,Contoso-multi-helm,由三個 helm 圖表組成。 其 NFDV 有三個網路功能應用程式。 一個網路函式應用程式會對應至一個 helm 圖表。 這些網路函式應用程式的名稱屬性分別設定為 Contoso-one、 Contoso-two和 Contoso-three 。 以下是定義此網路函式的NFDV範例代碼段。
resource nfdv 'Microsoft.Hybridnetwork/publishers/networkfunctiondefinitiongroups/networkfunctiondefinitionversions@2023-09-01' = {
parent: nfdg
name: nfDefinitionVersion
location: location
properties: {
deployParameters: string(loadJsonContent('deployParameters.json'))
networkFunctionType: 'ContainerizedNetworkFunction'
networkFunctionTemplate: {
nfviType: 'AzureArcKubernetes'
networkFunctionApplications: [
{
artifactType: 'HelmPackage'
name: 'Contoso-one'
...
},
{
artifactType: 'HelmPackage'
name: 'Contoso-two'
...
},
{
artifactType: 'HelmPackage'
name: 'Contoso-three'
...
}]
}
}
}
您可以針對每個網路函式應用程式獨立覆寫--atomic參數。 以下是將 --atomic 覆寫為 false ,對 Contoso-one 和 Contoso-two的範例 NF Bicep 檔案,但將 atomic 設定為 true 針對 Contoso-three。
resource nfResource 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = [for (values, i) in configObject.deployParameters: {
name: '${configObject.nfdgName}${i}'
location: configObject.location
identity: identityObject
properties: {
networkFunctionDefinitionVersionResourceReference: {
id: nfdv.id
idType: 'Open'
}
nfviType: 'AzureArcKubernetes'
nfviId: (configObject.customLocationId == '') ? resourceGroupId : configObject.customLocationId
allowSoftwareUpdate: true
configurationType: 'Open'
deploymentValues: string(values)
roleOverrideValues: [
'{"name":"Contoso-one","deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"injectArtifactStoreDetails":"true", "atomic": "false"},"upgradeOptions":{"injectArtifactStoreDetails":"true","atomic": "false"}}}}}'
'{"name":"Contoso-two","deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"injectArtifactStoreDetails":"true", "atomic": "false"},"upgradeOptions":{"injectArtifactStoreDetails":"true","atomic": "false"}}}}}'
'{"name":"Contoso-three","deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"injectArtifactStoreDetails":"true", "atomic": "false"},"upgradeOptions":{"injectArtifactStoreDetails":"true","atomic": "false"}}}}}'
]}}]
後續步驟
您現在可以重新嘗試 SNS 部署。 您可以透過ARM、Bicep或 AOSM REST API 再次提交部署。 您也可以透過 Azure 入口網站的 SNS 概覽刪除失敗的 SNS,然後依照 Operator 快速入門 重新部署,將快速入門 NF 參數替換為您的網路函式的參數。 部署至 Kubernetes 叢集的 Helm 發行版在失敗時將不會被移除。 如何偵錯 SNS 部署失敗 描述工具組,以偵錯常見的 Helm 安裝失敗。