你当前正在访问 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 的领域知识外,还需要几种技术的技术知识
- Helm 的实践知识
- Kubernetes 和 kubectl 命令的实践知识
- 将项目拉取和推送到 Azure 容器注册表的实践知识
- 需要在包含 AOSM 管理的项目存储的资源组上分配
Contributor
个角色 - 合适的 IDE,如 Visual Studio Code
- ORAS CLI
重要
强烈建议在尝试使用 AOSM 进行部署之前,在目标 Arc 连接的 Kubernetes 环境中测试 Helm 包的 helm install
是否成功。
替代单一 helm 图表 NF 的 --atomic
本节介绍如何替代由单一 helm 图表组成的 NF 的 --atomic
。
定位并编辑 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 模板中的
nfResource
属性,编辑模板以替代默认的 helm 安装--atomic
选项: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 模板并将其上传到项目存储
导航到
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'
登录 AOSM 管理的 ACR。 AOSM 管理的 ACR 名称可以在 Azure 门户项目存储资源概述中找到。 用户名和密码可以在上一步的输出中找到。
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
格式。<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-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
参数。 此为示例 NF BICEP 模板,它为 Contoso-one
和 Contoso-two
替代 --atomic
到 false
,但为 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 安装失败的工具包。