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

安全升级做法入门

本文介绍 Azure Operator Service Manager (AOSM) 安全升级做法 (SUP)。 此功能集使最终用户能够安全地执行 Azure 运营商关系上托管的容器网络功能 (CNF) 工作负载的复杂升级,并在适用的情况下符合合作伙伴的服务中软件升级 (ISSU) 要求。 在这些服务中查找将来发布的文章,以扩展 SUP 特性和功能。

安全升级简介

Azure Operator Service Manager 支持的给定网络服务将由一对多基于容器的网络功能 (CNF) 组成,随着时间的推移,这些功能将需要软件更新。 对于每个更新,必须以对网络服务影响最小的方式按特定顺序运行一对多 Helm 操作,同时升级相关网络功能应用程序 (NfApp)。 在 Azure Operator Service Manager 中,安全升级做法表示一组功能,这些功能可以自动执行更新 Azure 运营商关系上的网络服务所需的 CNF 操作。

  • SNS 重放更新 - 跨 NFDV 中的所有 NfApp 执行 Helm 升级操作。
  • Nexus 平台 - 在 Nexus 平台目标上支持 SNS 重放操作。
  • 操作超时 - 能够为每个 NfApp 操作设置操作超时。
  • 同步操作 - 能够一次运行一个串行 NfApp 操作。
  • 在失败时暂停 - 根据标志,将失败行为设置为仅回滚上次 NfApp 操作。
  • 单图表测试验证 - 在创建或更新后运行 Helm 测试操作。
  • 重构的 SNS 重放 - 改进的方法,添加了更新顺序和清理检查。
  • 改进升级选项控件 - 更有效地公开参数。
  • 无更改时跳过 NfApp - 无更改结果的情况下跳过 NfApp 处理。
  • 失败时执行 NF 级别回滚 - 根据标志,在失败时回滚所有已完成的 NfApp。
  • 映像预加载 - 能够将映像预加载到边缘存储库。

安全升级方法

若要更新现有的 Azure Operator Service Manager 站点网络服务 (SNS),运营商将针对部署的 SNS 资源执行重放更新请求。 如果 SNS 包含具有多个 NfApp 的 CNF,则请求会散开到网络功能定义版本 (NFDV) 中定义的所有 NfApp 中。 默认采用显示顺序,或者也可以采用 UpdateDependsOn 参数定义的顺序。

对于每个 NfApp,重放更新请求支持增加 Helm 图表版本、添加/删除 Helm 值和/或添加/删除任何 NfApp。 根据已知的允许运行时间,可以为每个 NfApp 设置超时,但 NfApp 只能按顺序逐一处理。 重放更新实现以下处理逻辑:

  • 对 NfApp 按照 updateDependsOn 排序或出现顺序进行处理。
  • 跳过参数 applicationEnabled 设置为禁用的 NfApps。
  • 如果未检测到任何更改,则会跳过参数 skipUpgrade 设置为启用的 NfApps。
  • 将升级旧 NFDV 和新 NFDV 之间常见的 NFApps。
  • 将仅安装新 NFDV 中的 NFApps。
  • 已部署但未由新 NFDV 引用的 NFApps 将被删除。

为了确保结果,支持使用 Helm 进行 NfApp 测试,Helm 升级前/后测试或独立 Helm 测试均可。 对于前/后测试失败,将采用 atomic 参数。 使用 atomic/true 时,失败的图表会回滚。 使用 atomic/false 时,不执行任何回滚。 有关独立 helm 测试的详细信息,请参阅以下文章:安装或升级后运行测试

服务内升级注意事项

Azure Operator Service Manager 在通常情况下支持服务中升级,这是一种推进部署版本但不中断运行中服务的升级方法。 在 ISSU 作期间,需要注意一些注意事项,以确保 AOSM 的正常运行。

  • 如果 AOSM 针对一组有序的多个 nfApp 执行升级,则 AOSM 会首先升级或创建所有新的 nfApps,然后删除所有旧的 nfApps。 此方法可确保在所有新的 nfApps 准备就绪之前,服务不会受到影响,但需要额外的平台容量来暂时托管旧版和新版 nfApps。
  • 如果 AOSM 升级具有多个副本的 NfApp,则 AOSM 会遵循用于滚动或重新创建选项的部署配置文件设置。 在使用滚动时,暴露值 maxUnavailablemaxSurge 作为 CGS 参数,然后可以通过运算符 CGV 在运行时设置这些参数。

最终,给定服务在不中断的情况下升级的能力是服务本身的一项功能。 请与服务发布者进一步咨询以了解服务内升级功能,并确保它们与适当的 AOSM 行为选项保持一致。

安全升级先决条件

使用 Azure Operator Service Manager 规划升级时,请先解决以下要求,然后再执行升级,以优化尝试升级所用的时间。

  • 使用发布者和/或设计器工作流加入更新的项目。

    • 发布者、存储、网络服务设计 (NSDg) 和网络功能设计组 (NFDg) 是静态的,不需要更改。
      • 存储新的图表和图像需要新的项目清单。 有关详细信息,请参阅加入文档,了解有关上传新图表和图像的详细信息。
    • 现有 NFDg 和 NSDg 下需要新的 NFDV 和网络服务设计版本 (NSDV)。
      • 我们将在分步部分中介绍对 NFDV 的基本更改。
      • 仅当引入新的配置组架构 (CGS) 版本时,才需要新 NSDV。
    • 根据需要新建 CGS。
      • 升级引入新的公开配置参数时必需。
  • 使用运营商工作流创建更新的项目。

    • 根据需要基于新 CGS 创建新的配置组值 (CGV)。
    • 通过确认现有站点和站点网络服务对象来重复使用和创建有效负载。
  • 更新模板,以确保根据对升级和所需失败行为的置信度来设置升级参数。

    • 用于生产的设置可能会抑制失败详细信息,而用于调试或测试的设置可能会选择公开这些详细信息。

安全升级过程

按照以下过程使用 Azure Operator Service Manager 触发升级。

创建新的 NFDV 资源

对于新的 NFDV 版本,它必须采用有效的 SemVer 格式,其中只允许修补程序和次要版本更新的更高递增值。 不允许更低的 NFDV 版本。 假如 CNF 是使用 NFDV 2.0.0 部署的,则新 NFDV 的版本可以是 2.0.1 或 2.1.0,但不能是 1.0.0 或 3.0.0。

更新新的 NFDV 参数

Helm 图表版本可以更新,也可以根据需要更新或参数化 Helm 值。 还可以添加已部署版本中不存在的新 NfApp。

更新 NFDV 以获取所需的 NfApp 顺序

UpdateDependsOn 是一个 NFDV 参数,用于在更新操作期间指定 NfApps 的排序。 如果未提供 UpdateDependsOn,则使用 CNF 应用程序在 NFDV 中显示的串行排序。

更新 NFDV 以获取所需的升级行为

确保设置任何所需的 CNF 应用超时、atomic 参数和 rollbackOnTestFailure 参数。 随着时间的推移,更改这些参数可能很有用,因为升级中获得的置信度更高。

发出 SNS 重放

完成加入后,将提交重放操作。 根据 NfApp 的数量、大小和复杂性,重放操作可能需要一些时间才能完成(几个小时)。

检查重放结果

如果重放报告成功的结果,则升级完成,用户应验证服务的状态和可用性。 如果重放报告失败,请按照升级失败恢复部分中的步骤继续操作。

安全升级重试过程

如果重放更新失败,可以按照以下过程重试该操作。

诊断失败的 NfApp

通过分析日志和其他调试信息来解决 NfApp 失败的根本原因。

手动跳过已完成的图表

修复失败的 NfApp 后、但在尝试升级重试之前,请考虑更改 applicationEnablement 参数以加速重试行为。 可以将此参数设置为 false,此时应跳过 NfApp。 此参数在 NfApp 不需要升级的情况下非常有用。

发出 SNS 重放重试(重复,直至成功)

默认情况下,重放会以声明的更新顺序重试 NfApp,除非使用 applicationEnablement 标志跳过它们。

跳过使用 applicationEnablement 的 nfApps

在 NFDV 资源中,deployParametersMappingRuleProfile 下存在枚举类型的 applicationEnablement 属性,其采用以下值:Unknown、Enabled 或 disabled。 它可用于在网络功能 (NF) 部署期间排除 NfApp 操作。

发布者更改

对于 applicationEnablement 属性,发布者有两个选项:提供默认值或对其进行参数化。

示例 NFDV

发布者使用 NFDV 设置 applicationEnablement 的默认值。

{ 
      "location":"<location>", 
      "properties": {
      "networkFunctionTemplate": {
        "networkFunctionApplications": [
          {
            "artifactProfile": {
              "helmArtifactProfile": { 
                "var":"var"
              },
              "artifactStore": {
                "id": "<artifactStore id>"
              }
            },
            "deployParametersMappingRuleProfile": {
              "helmMappingRuleProfile": {
                "releaseNamespace": "{deployParameters.role1releasenamespace}",
                "releaseName": "{deployParameters.role1releasename}"
              },
              "applicationEnablement": "Enabled"
            },
            "artifactType": "HelmPackage",
            "dependsOnProfile": "null",
            "name": "hellotest"
          },
          {
            "artifactProfile": {
              "helmArtifactProfile": {
                 "var":"var"
              },
              "artifactStore": {
                "id": "<artifactStore id>"
              }
            },
            "deployParametersMappingRuleProfile": {
              "helmMappingRuleProfile": {
                "releaseNamespace": "{deployParameters.role2releasenamespace}",
                "releaseName": "{deployParameters.role2releasename}"
              },
              "applicationEnablement": "Enabled"
            },
            "artifactType": "HelmPackage",
            "dependsOnProfile": "null",
            "name": "hellotest1"
          }
        ],
        "nfviType": "AzureArcKubernetes"
      },
      "description": "null",
      "deployParameters": {"type":"object","properties":{"role1releasenamespace":{"type":"string"},"role1releasename":{"type":"string"},"role2releasenamespace":{"type":"string"},"role2releasename":{"type":"string"}},"required":["role1releasenamespace","role1releasename","role2releasenamespace","role2releasename"]},
      "networkFunctionType": "ContainerizedNetworkFunction"
    }
}

示例配置组架构 (CGS) 资源

发布者使用 CGS 要求操作员在运行时间提供 roleOverrideValues 变量。 RoleOverrideValues 可以包括 applicationEnablement 的非默认设置。

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string"
    },
    "nfviType": {
      "type": "string"
    },
    "nfdvId": {
      "type": "string"
    },
    "helloworld-cnf-config": {
      "type": "object",
      "properties": {
        "role1releasenamespace": {
          "type": "string"
        },
        "role1releasename": {
          "type": "string"
        },
        "role2releasenamespace": {
          "type": "string"
        },
        "role2releasename": {
          "type": "string"
        },
        "roleOverrideValues1": {
          "type": "string"
        },
        "roleOverrideValues2": {
          "type": "string"
        }
      },
      "required": [
        "role1releasenamespace",
        "role1releasename",
        "role2releasenamespace",
        "role2releasename",
        "roleOverrideValues1",
        "roleOverrideValues2"
      ]
    }
  },
  "required": [
    "nfviType",
    "nfdvId",
    "location",
    "helloworld-cnf-config"
  ]
}

运营商更改

操作员根据 NFDV 的定义继承默认的 applicationEnablement 值。 如果 applicationEnablement 在 CGS 中进行了参数化,则必须在运行时通过 deploymentValues 属性传递它。

示例配置组值 (CGV) 资源

操作员使用 CGV 在运行时间设置 roleOverrideValues 变量。 RoleOverrideValues 包括 applicationEnablement 的非默认设置。

{
  "location": "<location>",
  "nfviType": "AzureArcKubernetes",
  "nfdvId": "<nfdv_id>",
  "helloworld-cnf-config": {
    "role1releasenamespace": "hello-test-releasens",
    "role1releasename": "hello-test-release",
    "role2releasenamespace": "hello-test-2-releasens",
    "role2releasename": "hello-test-2-release",
    "roleOverrideValues1": "{\"name\":\"hellotest\",\"deployParametersMappingRuleProfile\":{\"applicationEnablement\":\"Enabled\",\"helmMappingRuleProfile\":{\"releaseName\":\"override-release\",\"releaseNamespace\":\"override-namespace\",\"helmPackageVersion\":\"1.0.0\",\"values\":\"\",\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"30\",\"injectArtifactStoreDetails\":\"true\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"30\",\"injectArtifactStoreDetails\":\"true\"}}}}}",
    "roleOverrideValues2": "{\"name\":\"hellotest1\",\"deployParametersMappingRuleProfile\":{\"applicationEnablement\" : \"Enabled\"}}"
  }
}

示例 NF ARM 模板

操作者使用 NF ARM 模板将 CGV 设置的 roleOverrideValues 变量提交到资源提供程序 (RP)。 操作者可以根据需要更改 CGV 中的 applicationEnablement 设置,并重新提交相同的 NF ARM 模板,以更改迭代之间的行为。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "nameValue": {
      "type": "string",
      "defaultValue": "HelloWorld"
    },
    "locationValue": {
      "type": "string",
      "defaultValue": "eastus"
    },
    "nfviTypeValue": {
      "type": "string",
      "defaultValue": "AzureArcKubernetes"
    },
    "nfviIdValue": {
      "type": "string"
    },
    "config": {
      "type": "object",
      "defaultValue": {}
    },
    "nfdvId": {
      "type": "string"
    }
  },
  "variables": {
    "deploymentValuesValue": "[string(createObject('role1releasenamespace', parameters('config').role1releasenamespace, 'role1releasename',parameters('config').role1releasename, 'role2releasenamespace', parameters('config').role2releasenamespace, 'role2releasename',parameters('config').role2releasename))]",
    "nfName": "[concat(parameters('nameValue'), '-CNF')]",
    "roleOverrideValues1": "[string(parameters('config').roleOverrideValues1)]",
    "roleOverrideValues2": "[string(parameters('config').roleOverrideValues2)]"
  },
  "resources": [
    {
      "type": "Microsoft.HybridNetwork/networkFunctions",
      "apiVersion": "2023-09-01",
      "name": "[variables('nfName')]",
      "location": "[parameters('locationValue')]",
      "properties": {
        "networkFunctionDefinitionVersionResourceReference": {
          "id": "[parameters('nfdvId')]",
          "idType": "Open"
        },
        "nfviType": "[parameters('nfviTypeValue')]",
        "nfviId": "[parameters('nfviIdValue')]",
        "allowSoftwareUpdate": true,
        "configurationType": "Open",
        "deploymentValues": "[string(variables('deploymentValuesValue'))]",
        "roleOverrideValues": [
          "[variables('roleOverrideValues1')]",
          "[variables('roleOverrideValues2')]"
        ]
      }
    }
  ]
}

跳过没有更改的 NfApp

skipUpgrade 功能旨在优化 CNF 升级所需的时间。 当发布者在 upgradeOptions 下的 roleOverrideValues 中启用此标志时,AOSM 服务层会执行某些预检查,以确定是否可以跳过特定 nFApplication 的升级。 如果符合所有预检查条件,则跳过该应用的升级。 否则,将在群集级别执行升级。

预检查条件

如果符合以下所有条件,则可以跳过升级:

  1. nfApplication 预配状态为“成功”。
  2. Helm 图表名称或版本没有更改。
  3. Helm 值没有更改。

启用或禁用 skipUpgrade 功能

默认情况下,skipUpgrade 功能被禁用。 如果未在 upgradeOptions 下的 roleOverrideValues 中指定此可选参数,则 CNF 升级将以传统方式进行,其中 nfApplications 在群集级别进行升级。

启用网络功能资源中的 SkipUpgrade

要通过 roleOverrideValues 启用 SkipUpgrade 功能,请参阅以下示例。

{
    "location": "eastus2euap",
    "properties": {
        "publisherName": "xyAzureArcRunnerPublisher",
        "publisherScope": "Private",
        "networkFunctionDefinitionGroupName": "AzureArcRunnerNFDGroup",
        "networkFunctionDefinitionVersion": "1.0.0",
        "networkFunctionDefinitionOfferingLocation": "eastus2euap",
        "nfviType": "AzureArcKubernetes",
        "nfviId": "/subscriptions/4a0479c0-b795-4d0f-96fd-c7edd2a2928f/resourcegroups/ashutosh_test_rg/providers/microsoft.extendedlocation/customlocations/ashutosh_test_cl",
        "deploymentValues": "",
        "roleOverrideValues": [
            "{\"name\":\"hellotest\",\"deployParametersMappingRuleProfile\":{\"helmMappingRuleProfile\":{\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"1\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"4\",\"skipUpgrade\":\"true\"}}}}}",
            "{\"name\":\"runnerTest\",\"deployParametersMappingRuleProfile\":{\"helmMappingRuleProfile\":{\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"5\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"5\"}}}}}"
        ]
    }
}

示例说明

  • NfApplication:hellotest
    • 已启用 skipUpgrade 标志。 如果 hellotest 的升级请求满足预检查条件,则会跳过升级。
  • NfApplication:runnerTest
    • 未指定 skipUpgrade 标志。 因此,即使符合预检查条件,runnerTest 也会在群集级别执行传统 Helm 升级。