你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure 运营商服务管理器 (AOSM) 群集注册表 (CR) 提高云原生网络功能的复原能力
文档历史记录
- 创建并首次发布:2024 年 7 月 26 日
- 针对 HA 更新:2024 年 10 月 16 日
- 已更新为 GC:2024 年 11 月 5 日
功能依赖关系
此功能至少需要以下环境:
- 最低 AOSM ARM API 版本:2023-09-01
- 第一个版本,无可用于网络函数 (NF) kubernetes 扩展的高可用性 (HA):1.0.2711-7
- 第一个版本,为 NF kubernetes 扩展提供 HA:2.0.2810-144
- 第一个版本,为 NF kubernetes 扩展提供 GC:2.0.2860-160
群集注册表概述
Azure 运营商服务管理器 (AOSM) 群集注册表 (CR) 在 Nexus K8s 群集中启用容器映像的本地副本。 在启用了群集注册表的情况下安装容器化网络功能 (CNF) 时,容器映像从远程 AOSM 项目存储中拉取并保存到此本地群集注册表。 使用可变 Webhook 时,群集注册表自动截获映像请求并替换本地注册表路径,以避免发布者打包更改。 通过群集注册表,CNF 对容器映像的访问权限在丢失与远程项目存储的连接后仍然存在。
关键用例和优势
云原生网络功能 (CNF) 不仅在使用 AOSM 项目存储的初始部署期间需要对容器映像的访问权限,而且还需要该权限以使网络功能保持正常运行。 其中一些场景包括:
- Pod 重启:停止和启动 Pod 可能会导致群集节点从注册表拉取容器映像。
- Kubernetes 计划程序操作:在 Pod 到节点分配期间,根据计划程序配置文件规则,如果新节点未在本地缓存容器映像,则该节点从注册表拉取容器映像。
使用 AOSM 群集注册表的优势:
- 提供必要的本地映像,防止在与 AOSM 项目存储的连接丢失的情况下发生 CNF 中断。
- 减少对 AOSM 项目存储的映像拉取数,因为每个群集节点现仅从本地注册表拉取映像。
- 通过使用可变 Webhook 替换正确的本地注册表 URL 路径,克服注册表 URL 格式错误的问题。
群集注册表命令语法
使用 Network Function Operator (NFO) Arc K8s 扩展启用 AOSM 群集注册表。 以下 CLI 演示如何对 Nexus K8s 群集启用群集注册表。
az k8s-extension create --cluster-name
--cluster-type {connectedClusters}
--extension-type {Microsoft.Azure.HybridNetwork}
--name
--resource-group
--scope {cluster}
--release-namespace {azurehybridnetwork}
--release-train {preview, stable}
--config Microsoft.CustomLocation.ServiceAccount=azurehybridnetwork-networkfunction-operator
[--auto-upgrade {false, true}]
[--config global.networkfunctionextension.enableClusterRegistry={false, true}]
[--config global.networkfunctionextension.enableLocalRegistry={false, true}]
[--config global.networkfunctionextension.enableEarlyLoading={false,true}]
[--config global.networkfunctionextension.clusterRegistry.highAvailability.enabled={true, false}]
[--config global.networkfunctionextension.clusterRegistry.autoScaling.enabled={true, false}]
[--config global.networkfunctionextension.webhook.highAvailability.enabled={true, false}]
[--config global.networkfunctionextension.webhook.autoScaling.enabled={true, false}]
[--config global.networkfunctionextension.clusterRegistry.storageClassName=]
[--config global.networkfunctionextension.clusterRegistry.storageSize=]
[--config global.networkfunctionextension.webhook.pod.mutation.matchConditionExpression=]
[--config global.networkfunctionextension.clusterRegistry.clusterRegistryGCCadence=]
[--config global.networkfunctionextension.clusterRegistry.clusterRegistryGCThreshold=]
[--version]
在 Network Function Operator Arc K8s 扩展中启用群集注册表功能时,从 AOSM 项目存储部署的任何容器映像都可在 Nexus K8s 群集进行本地访问。 用户可为群集注册表选择永久性存储大小。
注意
如果用户未提供任何输入,则使用默认的 100 GB 永久性卷。
群集注册表组件
群集注册表功能在目标边缘群集上部署帮助程序 Pod,以协助 NFO 扩展。
组件协调器
- 此主 Pod 负责协调由 K8sBridge 在
Microsoft.Kubernetes资源提供程序 (RP)、混合中继和在群集上运行的 Arc 代理的帮助下创建的组件自定义资源对象 (CRO)。
Pod 可变 Webhook
- 这些 Pod 实现 Kubernetes 可变准入 Webhook,为可变 API 的实例提供服务。 可变 API 执行两项操作:
- 它修改本地注册表 IP 的映像注册表路径,替换掉 AOSM 项目存储 Azure 容器注册表 (ACR)。
- 它在边缘群集上创建项目 CR。
项目协调器
- 此 Pod 协调由可变 Webhook 创建的项目 CLO。
注册表
- 此 Pod 存储并检索 CNF 的容器映像。
高可用性和复原能力注意事项
AOSM NF 扩展使用可变的 Webhook 和边缘注册表来支持关键功能。
- 载入 helm 图表而无需自定义图像路径。
- 用于加速 Pod 操作并启用断开连接模式支持的本地群集注册表。 这些基本组件需要具有高可用性和复原能力。
HA 操作模式详细信息
启用 HA 后,群集注册表和 Webhook Pod 支持至少包含 3 个副本且不超过 5 个副本的副本集。 副本集密钥配置如下所示:
- 使用逐步推出升级策略。
- PodDisruptionBudget (PDB) 用于自愿性中断期间的可用性。
- Pod 反相关性用于在节点之间均匀分布 Pod。
- 就绪情况探测用于确保 Pod 在为流量提供服务之前准备就绪。
- AOSM 工作负载 Pod 仅分配给系统节点池。
- Pod 在 CPU 和内存负载下水平缩放。
副本
- 运行应用程序的多个副本的群集提供第一级别的冗余。 群集注册表和 Webhook 都定义为包含至少 3 个副本且不超过 5 个副本的“kind:deployment”。
部署策略
- rollingUpdate 策略用于帮助实现零停机时间升级并支持逐步推出应用程序。 默认 maxUnavailable 配置一次只允许关闭一个 Pod,直到创建足够多的 Pod 以满足冗余策略。
Pod 中断预算
- 策略中断预算 (PDB) 可保护 Pod 免受自愿性中断的影响,并随 Deployment、ReplicaSet 或 StatefulSet 对象一起部署。 对于 AOSM 操作员 Pod,使用 minAvailable 参数为 2 的 PDB。
Pod 反相关性
- Pod 反相关性控制应用程序 Pod 在群集中的多个节点上的分布。 启用 HA 后,AOSM 实现以下反关联规则:
- 使用 preferredDuringSchedulingIgnoredDuringExecution (Soft) 规则类型。 借助软计划,如果满足偏好条件的拓扑可用,Kubernetes 会计划 Pod。 如果没有此类拓扑可用,仍可在不符合偏好的其他节点上计划 Pod。
- 拓扑密钥基于 kubernetes.io/hostname 的值使用。
- 使用的权重为 100。
节点相关性
Nexus 节点的放置经过设计,均匀分布在各个区域,以确保区域冗余。 AOSM 使用以下规则进一步跨节点均匀分布 Pod:
- 首选没有“控制平面”角色的节点(权重:10)
- 首选具有“系统”模式的节点(权重:20)
存储
- 由于 AOSM 边缘注册表有多个跨节点分布的副本,因此永久性卷必须支持 ReadWriteManyX (RWX) 访问模式。 PVC“nexus-shared”卷在 Nexus 群集上可用,并支持 RWX 访问模式。
通过就绪情况探测进行监视
- AOSM 使用 http 就绪情况探测了解容器何时准备好开始接受流量。 所有容器准备就绪时,pod 被视为就绪。 当 Pod 未准备好时,会从服务负载均衡器中删除。
系统节点池
- 所有 AOSM 操作员 Pod 都分配给系统节点池。 此池可防止配置错误或恶意的应用程序 Pod 影响系统 Pod。
水平扩展
- 在 Kubernetes 中,HorizontalPodAutoscaler (HPA) 会自动更新工作负载资源,目的是自动缩放工作负载以满足需求。 AOSM 操作员 Pod 配置了以下 HPA 策略参数;
- 最小副本为 3 个。
- 最大副本为 5 个。
- cpu 和内存的 targetAverageUtilization 为 80%。
资源限制
- 资源限制用于防止运行 AOSM Pod 的节点上的资源重载。 AOSM 使用两个资源参数来限制 CPU 和内存消耗。
- 资源请求 - 应为 Pod 保留的最小数量。 此值应设置为应用程序正常负载下的资源使用状况。
- 资源限制 - 使用量达到终止限制的情况下 Pod 应使用的最大数量。 所有 AOSM 操作员容器都配置有适当的请求、CPU 和内存限制。
已知 HA 限制
- 系统代理池中具有单个活动节点的 Nexus AKS (NAKS) 群集不适合高度可用。 Nexus 生产拓扑必须在系统代理池中使用至少 3 个活动节点。
- nexus-shared 存储类由一项网络文件系统 (NFS) 存储服务。 此 NFS 存储服务按云服务网络 (CSN) 提供。 附加到 CSN 的任何 Nexus Kubernetes 群集都可以从此共享存储池预配永久性卷。 截至网络云 (NC) 3.10,存储池的最大大小目前限制为 1 TiB,而 NC 3.12 提供 16 TiB 的选项。
- Pod 反相关性仅处理 Pod 的初始放置、后续 Pod 缩放和修复,遵循标准的 K8s 计划逻辑。
群集注册表自动清理
启用后,AOSM NFO 扩展会运行后台垃圾回收 (GC) 作业来定期清理 NAKS 群集注册表。 垃圾回收是从文件系统中删除不再被任何清单引用的项目的过程。 使用垃圾回收,用户可以更好地管理群集注册表使用的磁盘空间。 当需要确保文件系统上不再存在某些层时,垃圾回收也是一个安全考虑因素。 此 GC 作业将按计划运行,检查群集注册表使用情况是否已达到指定的阈值,如果达到阈值,请启动垃圾回收过程。
清理未使用的映像清单
AOSM 在群集注册表中维护 Pod 所有者资源与所使用项目之间的引用。 启动群集注册表清理过程后,将识别未链接到任何 Pod 的项目,并发出软删除命令将其从群集注册表中删除。 这种类型的软删除不会立即释放群集注册表的存储空间。 实际映像文件删除取决于实际的注册表垃圾回收设置。
注意
Pod 所有者与其容器项目之间的引用可确保 AOSM 不会错误地删除项目。 例如,即使副本集 Pod 出现故障,AOSM 也不会取消引用容器项目。 AOSM 仅会在删除副本集时取消引用项目。 相同的原则适用于 Kubernetes 作业和守护程序集管理的 Pod。
垃圾回收分发
AOSM 依赖于垃圾回收 | 公共分发提供的垃圾回收功能。 AOSM 实现标准的两阶段“标记和整理”过程,以删除项目并释放注册表存储空间。 首先,会标记符合条件的图像,然后仅在满足某些条件时,才会在整理过程中清除这些图像。
注意
GC 过程要求群集注册表处于只读模式。 否则,可能会错误地删除项目,从而导致项目损坏。 GC 运行时,它会将注册表锁定在只读模式下,最长持续 1 分钟。 在此期间,AOSM 会延迟新操作,直到注册表锁定解除。
群集注册表自动清理参数
以下参数配置垃圾回收作业的计划和阈值。
- global.networkfunctionextension.clusterRegistry.clusterRegistryGCCadence
- global.networkfunctionextension.clusterRegistry.clusterRegistryGCThreshold
- 有关更多配置详细信息,请参阅最新的 网络函数扩展安装说明
常见问题
是否可将 AOSM 群集注册表与以前部署的 CNF 应用程序一起使用?
如果已部署了一个没有群集注册表的 CNF 应用程序,容器映像不会自动可用。 必须先启用群集注册表,然后才能使用 AOSM 部署网络功能。
是否可在部署后更改存储大小?
在初始部署后,无法修改存储大小。 建议将卷大小配置为起始大小的 3 到 4 倍。
是否可以列出当前存储在群集存储库中的文件?
以下命令可用于以人工可读格式列出文件:
kubectl get artifacts -A -o jsonpath='{range .items[*]}{.spec.sourceArtifact}'
此命令应生成以下输出:
ppleltestpublisheras2f88b55037.azurecr.io/nginx:1.0.0