你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
控制升级失败行为
概述
本指南介绍 Azure Operator Service Manager (AOSM) 面向容器网络函数 (CNF) 的升级失败行为功能。 这些功能作为 AOSM 安全升级实践计划的一部分,提供更快的重试、失败时暂停和返回到起点以及失败回滚之间的选择。
失败时暂停
使用 AOSM 的任何升级都从站点网络服务 (SNS) 信誉操作开始。 信誉操作处理在网络函数设计版本 (NFDV) 中找到的网络函数应用程序 (NfApp)。 信誉操作实现以下默认逻辑:
- 对 NfApp 按照 updateDependsOn 排序或出现顺序进行处理。
- 跳过参数“applicationEnabled”设置为禁用的 NfApp。
- 存在但未被新的 NFDV 引用的NFApps 将被删除。
- 如果任何 NfApp 升级失败并考虑回滚,则会暂停执行序列。
- 失败使 NF 资源处于失败状态。
失败时暂停后,AOSM 仅通过 testOptions、installOptions 或 upgradeOptions 参数回滚失败的 NfApp。 对任何继续失败的 NfApp 的 NfApp 不执行任何操作。 此方法允许最终用户对失败的 NfApp 进行故障排除,然后从该点向前重启升级。 作为默认行为,此方法是最高效的方法,但在混合版本状态下可能会导致网络函数 (NF) 不一致。
失败时回滚
为了解决 NfApp 版本不匹配的风险,AOSM 现在支持 NF 级别的失败时回滚。 启用此选项后,如果 NfApp 操作失败,则失败的 NfApp 和所有之前完成的 NfApp 都可以回滚到初始版本状态。 此方法最大程度地减少或消除 NF 暴露给 NfApp 版本不匹配的时间。 可选的失败时回滚功能如下所示:
- 用户启动 sSNS 信誉操作,并启用失败时回滚。
- 捕获并存储当前 NfApp 版本的快照。
- 快照用于确定为成功完成的撤消操作而采取的单个 NfApp 操作。
- 已删除组件上的“helm 安装”操作,
- 已升级组件上的“helm 回滚”操作,
- 新安装的组件的“helm 删除”操作
- 发生 NfApp 失败,AOSM 在升级之前将 NfApps 还原到快照版本状态,并首先还原最新的操作。
注意
- 如果用户未启用失败时回滚,AOSM 不会创建快照。
- 失败时回滚仅适用于成功完成的 NFApp。
- 使用 testOptions、installOptions 或 upgradeOptions 参数来控制失败的 NfApp 的回滚。
给定相应的结果,AOSM 将返回以下操作状态和消息:
- Upgrade Succeeded
- Provisioning State: Succeeded
- Message: <empty>
- Upgrade Failed, Rollback Succeeded
- Provisioning State: Failed
- Message: Application(<ComponentName>) : <Failure Reason>; Rollback succeeded
- Upgrade Failed, Rollback Failed
- Provisioning State: Failed
- Message: Application(<ComponentName>) : <Failure reason>; Rollback Failed (<RollbackComponentName>) : <Rollback Failure reason>
如何配置失败时回滚
控制失败行为最灵活的方法是扩展新的配置组架构 (CGS) 参数 rollbackEnabled,以允许通过 NF 有效负载中的 roleOverrideValues 进行配置组值 (CGV) 控制。 首先,定义 CGS 参数:
{
"description": "NF configuration",
"type": "object",
"properties": {
"nfConfiguration": {
"type": "object",
"properties": {
"rollbackEnabled": {
"type": "boolean"
}
},
"required": [
"rollbackEnabled"
]
}
}
}
注意
- 如果未通过 roleOverrideValues 参数提供 nfConfiguration,则默认情况下将禁用回滚。
定义新的 rollbackEnable 参数后,操作员现在可以在 roleOverrideValues 下提供运行时值,作为 NF 信誉有效负载的一部分。
example:
{
"location": "eastus",
"properties": {
// ...
"roleOverrideValues": [
"{\"nfConfiguration\":{\"rollbackEnabled\":true}}",
"{\"name\":\"nfApp1\",\"deployParametersMappingRuleProfile\":{\"applicationEnablement\" : \"Disabled\"}}",
"{\"name\":\"nfApp2\",\"deployParametersMappingRuleProfile\":{\"applicationEnablement\" : \"Disabled\"}}",
//... other nfapps overrides
]
}
}
注意
- 每个 roleOverrideValues 条目都会替代 NfAapp 的默认行为。
- 如果在 roleOverrideValues 中找到 nfConfiguration 的多个条目,则会将 NF 信誉作为错误请求返回。
如何排查失败时回滚问题
了解 Pod 状态
了解不同的 Pod 状态对于有效故障排除至关重要。 下面是最常见的 Pod 状态:
- 挂起:Kubernetes 正在进行 Pod 计划。
- 正在运行:Pod 中的所有容器都在运行且正常运行。
- 失败:Pod 中的一个或多个容器以非零退出代码终止。
- CrashLoopBackOff:Pod 中的容器反复崩溃,Kubernetes 无法重启它。
- ContainerCreating:容器运行时正在进行容器创建。
检查 Pod 状态和日志
首先,使用 kubectl 命令检查 Pod 状态和日志:
$ kubectl get pods
$ kubectl logs <pod-name>
get pods 命令列出当前命名空间中的所有 Pod 及其当前状态。 logs 命令检索特定 Pod 的日志,允许检查任何错误或异常。 若要排查网络问题,请使用以下命令:
$ kubectl get services
$ kubectl describe service <service-name>
get services 命令显示当前命名空间中的所有服务。 此命令提供有关特定服务的详细信息,包括关联的终结点以及任何相关的错误消息。 如果遇到 PVC 的问题,可以使用以下命令对其进行调试:
$ kubectl get persistentvolumeclaims
$ kubectl describe persistentvolumeclaims <pvc-name>
“get persistentvolumeclaims”命令列出当前命名空间中的所有 PVC。 describe 命令提供有关特定 PVC 的详细信息,包括状态、关联的存储类以及任何相关事件或错误。