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

安全升级做法入门

本文介绍 Azure Operator Service Manager (AOSM) 安全升级做法 (SUP)。 此功能集使能够安全运行托管在 Azure 运营商Nexus上的复杂容器网络功能(CNF)。 这些升级通常符合合作伙伴服务软件升级 (ISSU) 要求。 查找将来发布的文章,以扩展高级 SUP 特性和功能。

安全升级简介

AOSM 支持的给定网络服务由一个或多个 CNF 组成,随着时间的推移,需要软件升级。 对于每个升级,必须以对网络服务影响最小的方式按特定顺序运行一对多 Helm 操作,同时更新相关网络函数应用程序 (nfApp)。 AOSM SUP 表示一组功能,这些功能可实现 Azure 运营商关系上这些操作的安全自动化。

  • SNS 重放支持 - 在网络函数设计版本 (NFDV) 中的所有 nfApp 执行 Helm 升级操作。
  • Nexus 平台 - 在 Nexus 平台目标上支持 SNS 重放操作。
  • 操作超时 - 能够为每个 nfApp 操作设置操作超时。
  • 同步操作 - 能够一次运行一个串行 nfApp 操作。
  • 控制升级顺序 - 定义用于安装和升级的不同 nfApp 序列。
  • 在失败时暂停 - 默认行为是在 nfApp 操作失败后暂停。
  • 失败时回滚 - 可选行为,在失败的 nfApp 之前回滚已完成的 nfApp。
  • 单图表测试验证 - 在创建或更新后运行 Helm 测试操作。
  • 无更改时跳过 nfApp - 无更改结果的情况下跳过 nfApp 处理。
  • 映像预加载 - 能够将映像预加载到边缘存储库。

安全升级方法

若要更新现有的 Azure Operator Service Manager 站点网络服务 (SNS),运营商将针对部署的 SNS 资源执行重放更新请求。 如果 SNS 包含具有多个 nfApp 的 CNF,则请求会散开到网络函数定义版本 (NFDV) 中定义的所有 nfApp 中。 默认情况下,按顺序显示它们,或者(可选)按参数定义 updateDependsOn 的顺序显示。

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

  • 对 nfApp 按照 updateDependsOn 排序或出现顺序进行处理。
  • 跳过参数 applicationEnabled 设置为禁用的 nfApp。
  • 参数 skipUpgrade 设置为 enabled 的 nfApps 如果未检测到任何更改,则会被跳过。
  • 将升级旧 NFDV 和新 NFDV 之间常见的 nfApp。
  • 将仅安装新 NFDV 中的 nfApp。
  • 部署但未由新 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 规划升级时,请先解决以下要求,然后再执行升级,以优化尝试升级所用的时间。

  • 使用发布者和/或设计器工作流加入更新的项目。
    • 在大多数情况下,使用现有发布服务器托管新版本项目。
      • 使用现有发布服务器支持 helm upgrade 将 SNS 更新到其他版本。
      • 使用新发布服务器需要当前 SNS 的 helm delete,然后是新 SNS 版本的 helm install
    • 制品库、网络服务设计组(NSDG)和网络函数设计组(NFDG)是不可变的,无法更改。
      • 更改其中一个资源需要部署新的 SNS。
    • 存储新的图表和图像需要新的项目清单。
      • 有关上传新图表和图像的详细信息,请参阅 载入文档
    • 需要新的 NFDV 和(可选)网络服务设计版本(NSDV)。
      • NFDV 更改可能比较复杂。 本文仅介绍基本更改。
      • 仅当引入新的配置组架构 (CGS) 版本时,才需要新 NSDV。
    • 根据需要新建 CGS。
      • 升级引入新的公开配置参数时必需。

注释

同一 NSDG 和 NFDG 支持具有不同主要版本的 NSDV 和 NFDV

  • 使用运营商工作流创建更新的项目。
    • 根据需要基于新 CGS 创建新的配置组值 (CGV)。
    • 通过确认现有站点和站点网络服务对象来重复使用和创建有效负载。
  • 更新模板,以确保根据对升级和所需失败行为的置信度来设置升级参数。
    • 用于生产的设置可能会抑制失败详细信息,而用于调试或测试的设置可能会选择公开这些详细信息。

安全升级过程

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

  • 创建新的 NFDV 资源
    • 对于新的 NFDV 版本,它必须采用有效的 SemVer 格式。 新版本可以是相对于已部署版本的升级,即具有更高的价值,也可以是降级,即具有较低的价值。 新版本可能因主版本、次要版本或修补程序版本而异。
  • 更新新的 NFDV 参数
    • Helm 图表版本可以更新,也可以根据需要更新或参数化 Helm 值。 还可以添加已部署版本中不存在的新 nfApp。
  • 更新 NFDV 以获取所需的 nfApp 顺序
    • UpdateDependsOn 是一个 NFDV 参数,用于在更新操作期间指定 nfApps 的顺序。 如果未提供 updateDependsOn,则使用 CNF 应用程序在 NFDV 中显示的串行排序。
  • 更新 ARM 模板以执行所需的升级行为
    • 请确保设置任何所需的 CNF 应用程序 timeoutatomic 参数和 rollbackOnTestFailure 参数。 随着时间的推移,更改这些参数可能很有用,因为升级中获得的置信度更高。
  • 发出 SNS 重放
    • 完成加入后,将提交重放操作。 根据 nfApps 的数量、大小和复杂性,reput 操作可能需要一些时间才能完成(可能需要多个小时)。
  • 检查重放结果
    • 如果重放报告成功的结果,则升级完成,用户应验证服务的状态和可用性。 如果重放报告失败,请按照升级失败恢复部分中的步骤继续操作。

安全升级重试过程

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

  • 诊断失败的 nfApp
    • 通过分析日志和其他调试信息来解决 nfApp 失败的根本原因。
  • 手动跳过已完成的图表
    • 修复失败的 nfApp 后,但在尝试升级重试之前,请考虑更改 applicationEnablement 参数以加速重试行为。 可以将此参数设置为 false,在这种情况下应跳过 nfApp。 此参数在 nfApp 不需要升级的情况下非常有用。
  • 发出 SNS 重放重试(重复,直至成功)
    • 默认情况下,重放会按照声明的更新顺序重试 nfApp,除非使用 applicationEnablement 标志跳过它们。

使用 installOptions 和 UpgradeOptions 控制超时

当 SNS 操作启动 helm 安装和 helm 升级时,默认超时值为 27 分钟。 可以在全局 NF 中自定义此值,但我们建议在组件 NF 级别自定义此值,方法是在 NF 有效负载模板中定义重写值。 进一步提升 NF 负载模板中的值,并将其展示为运算符值,从而允许在运行时进行最终定制。 以下示例演示了应用于单个 nfApp 组件的受支持的 installOptions 和 upgradeOptions 参数;

"roleOverrideValues": ["{ 
   "name": "hellotest",
    "deployParametersMappingRuleProfile": {
      "helmMappingRuleProfile": {
       "options": {
        "installOptions": {
         "atomic": true,
         "wait": true,
         "timeout": "1" },
        "upgradeOptions": {
         "atomic": true,
         "wait": true,
         "timeout": "2" }
        } } } }"
    ]

跳过使用 applicationEnablement 的 nfApps

在 NFDV 资源中,位于 deployParametersMappingRuleProfile 下的属性 applicationEnablement 是一个枚举类型,其取值为未知、已启用或禁用。 它可用于在网络函数 (NF) 部署期间手动排除 nfApp 操作。 以下示例演示了一种泛型方法,用于将 applicationEnablement 参数化为 roleOverrideValues 属性中的包含值。

模板更改

虽然不需要任何 NFDV 更改,但发布者可以选择使用 NFDV 设置属性的 applicationEnablement 默认值。 默认值被使用,除非通过roleOverrideValues进行更改。

NFDV 模板

使用 NFDV 模板设置默认值 applicationEnablement。 以下示例将状态设置为 enabled networkfunctionApplication 的 hellotest 默认值。

      "___location":"<___location>", 
      "properties": {
      "networkFunctionTemplate": {
        "networkFunctionApplications": [
            "deployParametersMappingRuleProfile": {
              "applicationEnablement": "Enabled"
            },
            "name": "hellotest"
        ],
        "nfviType": "AzureArcKubernetes"
        },
      }

若要更动态地管理 applicationEnablement 值,作员可以使用 NF 模板 roleOverrideValues 属性传递实时值。 虽然操作员可以直接操作 NF 模板,但转而参数化 roleOverrideValues,以便在运行时通过 CGV 模板传递值。 以下示例展示对 CGS、NF 模板以及最终 CGV 的必要修改。

CGS 模板

必须更新 CGS 模板,以便为每个行包含一个变量声明以在 roleOverrideValues 下参数化。 下面的示例演示了三个替代值。

        "roleOverrideValues0": {
          "type": "string"        
        },    
        "roleOverrideValues1": {
          "type": "string"        
        },        
        "roleOverrideValues2": {
          "type": "string"
        }

NF 有效负载模板

NF 模板必须用三种方式进行更新。 首先,隐式配置参数必须定义为类型对象。 其次,roleOverrideValues0roleOverrideValues1roleOverrideValues2必须声明为变量,并映射到配置参数。 第三,必须按正确的顺序引用roleOverrideValues0roleOverrideValues1roleOverrideValues2 进行替换,且遵循roleOverrideValues下的正确语法。

  "parameters": {
    "config": {
      "type": "object",
      "defaultValue": {}
    }
  }
  "variables": {
    "roleOverrideValues0": "[string(parameters('config').roleOverrideValues1)]",
    "roleOverrideValues1": "[string(parameters('config').roleOverrideValues1)]",
    "roleOverrideValues2": "[string(parameters('config').roleOverrideValues2)]"
  },
  "resources": [
  {
<snip>
     "roleOverrideValues": [
          "[variables('roleOverrideValues0')]",
          "[variables('roleOverrideValues1')]",
          "[variables('roleOverrideValues2')]"
        ]
   }

CGV 模板

CGV 模板现在可以更新,以便在运行时将每个变量的内容替换为 roleOverrideValues 属性。 以下示例将 rollbackEnabled 设置为 true,然后对 hellotesthellotest1 nfApplications 进行覆盖设置。

{
    "roleOverrideValues0": "{\"nfConfiguration\":{\"rollbackEnabled\":true}}",
    "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\"}}"
}

有了此框架,操作员可以通过简单地更新 CGV 来管理任何 roleOverrideValues 操作,然后将该 CGV 附加到所需的 SNS 操作中。

跳过没有更改的 nfApp

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

预检查条件

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

  • nfApplication 预配状态为“成功”。
  • Helm 图表名称或版本没有变化。
  • Helm 值没有更改。

启用或禁用 skipUpgrade 功能

默认情况下,skipUpgrade 功能被禁用。 如果在 roleOverrideValues 下的 upgradeOptions 中没有指定这个可选参数,那么 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 升级。

完整 roleOverrideValues 选项参考

将本文和其他文章中的所有示例组合在一起,以下参考演示了通过 roleOverrideValues 机制当前支持的所有安装和升级选项。

{
  "roleOverrideValues": [
    {
      "nfConfiguration": {
        "rollbackEnabled": "true"
      }
    },
    {
      "name": "nfApplication1",
      "deployParametersMappingRuleProfile": {
        "helmMappingRuleProfile": {
          "options": {
            "installOptions": {
              "atomic": "true",
              "wait": "true",
              "timeout": "1",
              "testOptions": {
                "enable": "true",
                "timeout": "true",
                "rollbackOnTestFailure": "true",
                "filter": [
                  "test1",
                  "test2"
                ]
              }
            },
            "upgradeOptions": {
              "atomic": "true",
              "wait": "true",
              "timeout": "1",
              "skipUpgrade": "true",
              "testOptions": {
                "enable": "true",
                "timeout": "true",
                "rollbackOnTestFailure": "true",
                "filter": [
                  "test1",
                  "test2"
                ]
              }
            }
          }
        }
      }
    },
    {
      "name": "nfApplication2",
      "deployParametersMappingRuleProfile": {
        "helmMappingRuleProfile": {
          "options": {
            "installOptions": {
              "atomic": "true",
              "wait": "true",
              "timeout": "1",
              "testOptions": {
                "enable": "true",
                "timeout": "true",
                "rollbackOnTestFailure": "true",
                "filter": [
                  "test1",
                  "test2"
                ]
              }
            },
            "upgradeOptions": {
              "atomic": "true",
              "wait": "true",
              "timeout": "1",
              "skipUpgrade": "true",
              "testOptions": {
                "enable": "true",
                "timeout": "true",
                "rollbackOnTestFailure": "true",
                "filter": [
                  "test1",
                  "test2"
                ]
              }
            }
          }
        }
      }
    }
  ]
}