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

Azure CLI Azure 运营商服务管理器 (AOSM) 扩展问题

本文档包含将 Azure CLI AOSM 扩展加入网络功能时的常见问题及其解决方案的列表。

常见问题

发布服务器已存在于区域中

Azure 区域中的发布服务器名称必须是唯一的。 如果看到以下错误,则表示所选的发布服务器名称已被占用:

Message: A private publisher resource with the name 'nginx-publisher' already exists in the provided region.

解决此问题的方法是:

如果你拥有发布服务器,它位于租户中,并且你希望重复使用它:

发布服务器在 AOSM CLI 扩展配置文件中定义。 publisher_namepublisher_resource_group_name 字段必须与现有发布服务器的对应字段匹配,并且必须位于用于此部署的租户中。

更改配置文件中的 publisher_resource_group_name,使其引用现有发布服务器,重新运行相应的 build 命令,然后重新运行 publish 命令。

未拥有现有发布服务器:

使用新的发布服务器名称。

网络服务设计 (NSD) 项目上传失败

在极少数情况下,使用 az aosm nsd publish 命令上传项目可能会失败。 这种情况下的错误输出为

ValueError: Issue retrieving session url: {'errors': [{'code': 'UNAUTHORIZED', 'message': 'authentication required, visit https://aka.ms/acr/authorization for more information.', 'detail': [{'Type': 'repository', 'Name': 'contoso-nsd', 'Action': 'pull'}, {'Type': 'repository', 'Name': 'contoso-nsd', 'Action': 'push'}]}]}

解决此问题的方法是:

选项 1. 确认在要使用的订阅上具有 ContributorAcrPush 角色分配。 如果没有,请分配。 如果无法设置此角色分配,请运行具有 --no-subscription-permissions 参数的 az aosm nsd publish 命令。

选项 2. 如果这些权限不能解决问题,请从 az aosm nsd build 命令创建的 nsd-cli-output/artifacts 文件夹中运行以下命令:

  • 从 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'
oras login <aosm-managed-acr-name>.azurecr.io --username <username> --password <scope map token>
  • 使用 ORAS 将网络功能 ARM 模板上传到 AOSM 管理的 Azure 容器注册表 (ACR)。 <arm-template-version> 项目标记必须为 1.0.0 格式。
oras push <aosm-managed-acr-name>.azurecr.io/Contoso-nsd:<arm-template-version> ./nsd-cli-output/artifacts/<nf-name>.json

跨租户复制失败

Azure CLI AOSM 扩展本机不支持跨租户映像副本。 但是,可以以允许此功能的方式配置 CLI 环境。 进程是将默认 Azure 订阅设置为包含源 ACR 的订阅,登录到源 ACR,然后使用 --subscription 参数运行所有 az aosm 命令,将值设置为目标订阅。 源订阅和目标订阅可以位于不同的租户中。

az account set --subscription <source-acr-subscription>
az acr login --name <source-acr-name> -u <source-acr-username> -p <source-acr-password> --subscription <source-acr-subscription>
az aosm nfd publish --definition-type cnf --subscription <target-subscription>

常见错误配置

当站点和网络服务设计版本 (NSDV) 配置不匹配时,站点网络服务 (SNS) 部署失败

如果站点资源的 nfvi 属性与 NSDV 的 nfvisFromSite 属性不匹配,则 SNS 创建尝试失败。 错误在于

{
"statusMessage": "{\"status\":\"Failed\",\"error\":{\"code\":\"ResourceOperationFailure\",\"message\":\"The resource operation completed with terminal provisioning state 'Failed'.\",\"details\":[{\"code\":\"InvalidRequestContent\",\"message\":\"For NfviAlias = nfvi1, either NfviName = nsd-contoso_NFVI and NfviType = AzureCore does not match with site resource.\"}]}}",
}

在本例中,NSDV nfvisFromSite 属性包含:

    nfvisFromSite: {
      nfvi1: {
        name: 'nsd-contoso_NFVI1'
        type: 'AzureArcKubernetes'
      }

站点资源 nfvi 属性必须与 NSDV 中的名称和类型匹配。

resource site 'Microsoft.HybridNetwork/sites@2023-09-01' = {
  name: 'contoso-site'
  location: 'eastus'
  properties: {
    nfvis : [
      {
        name: 'nsd-contoso_NFVI1'
        nfviType: 'AzureArcKubernetes'
        customLocationReference: {
          id: '<custom-location-arm-id>'
        }
      }
    ]
  }
}

配置组值 (CGV) 中的 nfdvName 与发布的网络功能定义版本 (NFDV) 不匹配

Azure CLI AOSM 扩展生成的配置组架构具有名为 nfdvName 的强制参数。 nfdvname 是 NFDV 的名称,它是 1.0.0 格式的字符串。 它不是网络功能 (NF) 或网络功能定义组 (NFDG) 的名称。 以下示例显示了正确用法。

{
    "nsd-contoso": {
        "nfdvName": "1.0.0",
        "deployParameters": [
            {}
        ],
        "customLocationId": "<custom-location-arm-id>",
        "managedIdentityId": "<managed-id-arm-id>"
    }
}

在配置组架构 (CGS) 中不公开任何参数时,CGV 值属性不正确

Azure CLI AOSM 扩展生成的配置组架构公开了 deployParameters 字段,默认情况下,其是 JSON 对象的数组。 可能希望创建具有空 deployParameters 字段的 CGV 的原因如下:

  • 配置组架构中没有公开配置,所有值都设置在 Helm 图标中的默认 values.yaml 中。
  • 创建了包含默认值的配置组架构,但不想替代它们。

如果创建的 CGV 包含空 deployParameters 字段,那么字段值必须是包含空 JSON 对象的数组。

{
    "nsd-contoso": {
        "nfdv": "1.0.0",
        "deployParameters": [
            {}
        ],
        "customLocationId": "<custom-location-arm-id>",
        "managedIdentityId": "<managed-id-arm-id>"
    }
}

如果 CGV 包含空数组(即 []),而不是包含空对象([{}])的数组,则 AOSM 将返回以下错误消息。

{"code":"BadRequest","message":"NSDV ResourceElementTemplate (name: 'mco-nsdg', type: 'NetworkFunctionDefinition') expects at least one 'networkfunctions' resource in the associated template. Please use the type: 'ArmResourceDefinition' to install generic ARM resources."}

helm 图标中的图像属性与源 ACR 中的位置不匹配

AOSM CLI 要求源注册表中的映像与 helm 图表中所写的存储库结构相同。 例如,helm 图表中作为 core/contoso-a:1.0.0 包含的映像必须在源注册表中以 core/contoso-a:1.0.0 结尾的路径中可用。 无法将映像上传到源注册表中的正确路径会导致 az aosm nfd publish 失败,并出现以下错误。

Code: InvalidParameters
Message: Operation registries-cd9ad97d-f3a3-11ee-a728-6b163569f55a failed. Resource /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ContainerRegistry/registries/contoso Invalid message NotFound Not Found {"errors":[{"code":"MANIFEST_UNKNOWN","message":"manifest tagged by \"0.0.0-9\" is not found","detail":{"Tag":"0.0.0-9"}}]}

提供多种解决方案。

  • 编辑 helm 图表,或在 values.yaml 中输入映像路径,并将映像路径设置为与源注册表中的存储库结构相匹配。
  • 将映像上传到源注册表,使 cnf-input.jsonc 文件中的“image_sources”和 helm 图表中的映像路径的连接与源注册表中的上传位置相匹配。
  • AOSM CLI 存储其在 cnf-cli-output/artifacts/artifacts.json 中发现的映像元数据。 AOSM CLI 在源注册表中搜索的路径是 <registry_name>/<registry_namespace>/<artifact_name>/<artifact_version>。 可以手动编辑此文件,使其值与映像在源 ACR 中的位置相匹配。

当参数的类型为 null 时,CGV 与 CGS 不匹配

目前,AOSM 不支持 null 作为 deployParameters 架构中的默认值,这表示配置组架构中也不允许使用默认值 null。 为解决此问题,AOSM CLI 将 null 类型的参数默认值设置为字符串 "null",这使得 NFDV 可以成功发布。

当使用门户创建 CGV 时,参数会自动填充 "null" 作为其值。 如果不更改此值,门户将显示错误消息,称:“新配置组值与架构不匹配 - 请编辑这些值。”

由于配置组值与配置组架构不匹配而出现错误消息的门户屏幕截图。

要修复此错误,请在 CGV 中将 "null" 更改为 null

例如,最初我们有值 "null"

"serviceAccount_name": "null",

必须将其更改为值 null

"serviceAccount_name": null,