你当前正在访问 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 群集扩展会运行后台垃圾回收作业来定期清理容器映像。 此作业按计划运行,检查群集注册表使用情况是否达到指定的阈值,如果是,请启动垃圾回收过程。 最终用户配置作业计划和阈值,但默认情况下,作业每天以 0% 利用率阈值运行一次。
清理垃圾映像清单
AOSM 在群集注册表中维护 Pod 所有者资源与所使用映像之间的引用。 启动映像清理过程后,会识别与任何 Pod 解除链接的映像,并发起软删除操作以从群集注册表中移除它们。 这种类型的软删除不会立即释放群集注册表的存储空间。 实际映像文件删除取决于实际的注册表垃圾回收设置。
注意
Pod 所有者与其容器映像之间的引用可确保 AOSM 不会错误地删除映像。 例如,即使副本集 Pod 出现故障,AOSM 也不会取消引用容器映像。 AOSM 仅会在删除副本集时取消引用容器映像。 相同的原则适用于 Kubernetes 作业和守护程序集管理的 Pod。
CNCF 垃圾回收分发
AOSM 使用开源 CNCF 分发注册表来设置群集注册表。 因此,AOSM 依赖于由 垃圾回收 |公共分发 提供的垃圾回收功能。 总的来说,它遵循标准 2 阶段的“标记并清理”过程删除映像文件,以释放注册表存储空间。
注意
此过程要求群集注册表处于只读模式。 如果在注册表未处于只读模式时上传映像,则可能错误地删除映像层,导致映像损坏。 注册表需要锁定只读模式,持续时间最长为 1 分钟。 当群集注册表处于只读模式时,AOSM 将延迟其他 NF 部署。
垃圾回收配置参数
以下参数配置垃圾回收作业的计划和阈值。
- global.networkfunctionextension.clusterRegistry.clusterRegistryGCCadence
- global.networkfunctionextension.clusterRegistry.clusterRegistryGCThreshold
- 有关更多配置详细信息,请参阅最新的 网络函数扩展安装说明
高可用性和复原能力注意事项
AOSM NF 扩展使用可变的 Webhook 和边缘注册表来支持关键功能。
- 载入 helm 图表而无需自定义图像路径。
- 用于加速 Pod 操作并启用断开连接模式支持的本地群集注册表。 这些基本组件需要具有高可用性和复原能力。
HA 更改摘要
借助 HA,群集注册表和 Webhook Pod 现在支持至少包含 3 个副本且不超过 5 个副本的副本集。 副本集密钥配置如下所示:
- 使用逐步推出升级策略。
- PodDisruptionBudget (PDB) 用于自愿性中断期间的可用性。
- Pod 反相关性用于在节点之间均匀分布 Pod。
- 就绪情况探测用于确保 Pod 在为流量提供服务之前准备就绪。
- AOSM 工作负载 Pod 仅分配给系统节点池。
- Pod 在 CPU 和内存负载下水平缩放。
副本
- 运行应用程序的多个副本的群集提供第一级别的冗余。 群集注册表和 Webhook 都定义为“kind:deployment”,至少有三个副本,最多 5 个副本。
部署策略
- 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 群集注册表与以前部署的 CNF 应用程序一起使用?
如果已部署了一个没有群集注册表的 CNF 应用程序,容器映像不会自动可用。 必须先启用群集注册表,然后才能使用 AOSM 部署网络功能。
是否可在部署后更改存储大小?
在初始部署后,无法修改存储大小。 建议将卷大小配置为起始大小的 3 到 4 倍。
是否可以列出当前存储在群集存储库中的文件?
以下命令可用于以人工可读格式列出文件:
kubectl get artifacts -A -o jsonpath='{range .items[*]}{.spec.sourceArtifact}'
此命令应生成以下输出:
ppleltestpublisheras2f88b55037.azurecr.io/nginx:1.0.0