共用方式為


使用 Helm 選項參數防止在安裝失敗時刪除

網站網路服務 (SNS) 部署可能會失敗,因為基礎網路功能 (NF) 部署無法正確安裝。 Azure 操作員服務管理員 (AOSM) 預設會從目標 Kubernetes 叢集移除失敗的部署,以保留資源。 Helm install 失敗通常需要資源保存在叢集上,以允許偵錯失敗。 本操作說明文章將 參數設定 helm install --atomic 為 false,說明如何編輯 NF ARM 範本以覆寫此行為。

必要條件

  • 您必須已使用 Az CLI AOSM 擴充功能將 NF 上線至 AOSM。 本文參考 CLI 所輸出的資料夾結構和檔案,並提供以 CLI 為基礎的範例
  • Helm 安裝失敗可能相當複雜。 除了對 NF 的領域知識之外,偵錯還需要數個技術的技術知識
  • 您需要資源 Contributor 群組上包含 AOSM 受控成品存放區的角色指派
  • 適當的 IDE,例如 Visual Studio Code
  • ORAS CLI

重要

強烈建議您在嘗試使用 AOSM 進行部署之前,先測試 helm install Helm 套件在目標 Arc 連線的 Kubernetes 環境上成功。

單一 Helm 圖表 NF 的覆寫--atomic

本節說明如何覆寫 --atomic 由單一 Helm 圖表組成的 NF。

找出並編輯 NF BICEP 範本

  1. 流覽至 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)
      }
    }]
    
  2. 流覽至 cnf-cli-output 目錄、開啟 nfDefinition 目錄,以及從資源中 networkFunctionApplications 陣列 nfdv 中唯一的專案複製值,以尋找網路函式應用程式名稱。 藉由比較下列虛構的 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'
    
  3. 將下列組態新增至 nfResource NF ARM 範本中的屬性,以編輯範本以覆寫預設 helm 安裝--atomic選項:

    roleOverrideValues: ['{"name": "Contoso-one", "deployParametersMappingRuleProfile": {"applicationEnablement": "Enabled", "helmMappingRuleProfile": {"options": {"installOptions": {"atomic": "false"}},{"upgradeOptions": {"atomic": "false"}}}}}']
    
  4. 藉由比較 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 範本,並將其上傳至成品存放區

  1. 流覽至 命令所az aosm nsd build建立的目錄,nsd-cli-output/artifacts並從 CLI 產生的 BICEP 檔案建置網路函式 ARM 範本。

    bicep build <nf-name>.bicep
    
  2. 從命令中 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'
    
  3. 登入 AOSM 受控 ACR。 您可以在 Azure 入口網站 成品存放區資源概觀中找到 AOSM 受控 ACR 名稱。 您可以在上一個步驟的輸出中找到使用者名稱和密碼。

    oras login <aosm-managed-acr-name>.azurecr.io --username <username> --password <scope map token>
    
  4. 使用 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 圖表一個。

除了對 ARM 範本所做的編輯之外,多 helm NF 的覆寫 --atomic 程式與單一 helm NF 的程式相同。

虛構的多 helm NF,Contoso-multi-helm,由三個 helm 圖表組成。 其 NFDV 有三個網路功能應用程式。 一個網路函式應用程式會對應至一個 helm 圖表。 這些網路函式應用程式的名稱屬性分別設定為 Contoso-oneContoso-twoContoso-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您可以個別覆寫每個網路函式應用程式的 參數。 以下是覆寫 --atomicContoso-one falseContoso-two的範例 NF BICEP 範本,但針對 Contoso-three設定atomic為 true。

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,並在操作員快速入門之後重新部署,並以網路函式的參數取代快速入門 NF 參數。 部署至 Kubernetes 叢集的 Helm 版本將不會在失敗時移除。 如何偵錯 SNS 部署失敗 描述工具組,以偵錯常見的 Helm 安裝失敗。