你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Helm 选项参数防止安装失败时删除

站点网络服务 (SNS) 部署可能会失败,因为基础网络功能 (NF) 部署无法正确进行 helm 安装。 Azure 运营商服务管理器 (AOSM) 默认从目标 Kubernetes 群集中删除失败的部署以保留资源。 Helm install 失败通常需要在群集上保留资源,以便调试失败。 这篇操作文章介绍了如何编辑 NF ARM 模板,通过将 helm install --atomic 参数设置为 false 来替代此行为。

先决条件

  • 必须已使用 Az CLI AOSM 扩展将 NF 登录到 AOSM。 本文参考了 CLI 输出的文件夹结构和文件,并给出了 CLI 型示例
  • Helm 安装失败可能很复杂。 调试除了需要 NF 的领域知识外,还需要几种技术的技术知识
  • 需要在包含 AOSM 管理的项目存储的资源组上分配 Contributor 个角色
  • 合适的 IDE,如 Visual Studio Code
  • ORAS CLI

重要

强烈建议在尝试使用 AOSM 进行部署之前,在目标 Arc 连接的 Kubernetes 环境中测试 Helm 包的 helm install 是否成功。

替代单一 helm 图表 NF 的 --atomic

本节介绍如何替代由单一 helm 图表组成的 NF 的 --atomic

定位并编辑 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 目录,然后从 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'
    
  3. 通过将以下配置添加到 NF ARM 模板中的 nfResource 属性,编辑模板以替代默认的 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。 AOSM 管理的 ACR 名称可以在 Azure 门户项目存储资源概述中找到。 用户名和密码可以在上一步的输出中找到。

    oras login <aosm-managed-acr-name>.azurecr.io --username <username> --password <scope map token>
    
  4. 使用 ORAS 将网络功能 ARM 模板上传到 AOSM 管理的 Azure 容器注册表 (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 与单一 helm NF 替代 --atomic 的进程相同。

虚构的多 helm NF,Contoso 多 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 参数。 此为示例 NF BICEP 模板,它为 Contoso-oneContoso-two 替代 --atomicfalse,但为 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、BIEP 或 AOSM REST API 再次提交部署。 也可以通过 Azure 门户 SNS 概述删除失败的 SNS,并按照运营商快速启动进行重新部署,将快速启动 NF 参数替换为网络功能的参数。 部署到 Kubernetes 群集的 helm 版本不会在失败时删除。 如何调试 SNS 部署失败描述了用于调试常见 helm 安装失败的工具包。