×

为了确保您的 Operator 在 OpenShift Container Platform 集群的高可用性 (HA) 模式和非 HA 模式下都能良好运行,您可以使用 Operator SDK 检测集群的基础架构拓扑,并设置适合集群拓扑的资源需求。

OpenShift Container Platform 集群可以配置为高可用性 (HA) 模式(使用多个节点)或非 HA 模式(使用单个节点)。单节点集群(也称为单节点 OpenShift)可能具有更严格的资源限制。因此,重要的是,安装在单节点集群上的 Operator 能够相应地进行调整,并仍然能够良好运行。

通过访问 Red Hat OpenShift Service on AWS 提供的集群高可用性模式 API,Operator 作者可以使用 Operator SDK 使他们的 Operator 能够检测集群的基础架构拓扑(HA 或非 HA 模式)。可以开发使用检测到的集群拓扑自动将资源需求(对于 Operator 以及它管理的任何操作数或工作负载)切换到最适合拓扑的配置文件的自定义 Operator 逻辑。

包含与 Operator 项目相关的脚手架和测试工具的 Red Hat 支持版本的 Operator SDK CLI 工具已被弃用,并计划在未来版本的 Red Hat OpenShift Service on AWS 中删除。Red Hat 将在此版本的生命周期内为此功能提供错误修复和支持,但此功能将不再接收增强功能,并将从未来的 Red Hat OpenShift Service on AWS 版本中删除。

不建议使用 Red Hat 支持版本的 Operator SDK 创建新的 Operator 项目。拥有现有 Operator 项目的 Operator 作者可以使用 Red Hat OpenShift Service on AWS 发布的 Operator SDK CLI 工具版本来维护他们的项目并创建针对较新版本的 Red Hat OpenShift Service on AWS 的 Operator 版本。

以下与 Operator 项目相关的基本镜像被弃用。这些基本镜像的运行时功能和配置 API 仍然支持错误修复和解决 CVE。

  • 基于 Ansible 的 Operator 项目的基本镜像

  • 基于 Helm 的 Operator 项目的基本镜像

有关不受支持的社区维护版本的 Operator SDK 的信息,请参阅Operator SDK (Operator Framework)

关于集群高可用性模式 API

Red Hat OpenShift Service on AWS 提供了一个集群高可用性模式 API,Operator 可以使用它来帮助检测基础架构拓扑。基础架构 API 包含有关基础架构的集群范围信息。如果 Operator Lifecycle Manager (OLM) 管理的 Operator 需要根据高可用性模式以不同的方式配置操作数或管理的工作负载,则可以使用基础架构 API。

在基础架构 API 中,infrastructureTopology 状态表示对不在控制平面节点上运行的基础架构服务的期望,通常由role 值(非master)的节点选择器指示。controlPlaneTopology 状态表示对通常在控制平面节点上运行的操作数的期望。

任一状态的默认设置为HighlyAvailable,它表示 Operator 在多个节点集群中的行为。SingleReplica 设置用于单节点集群(也称为单节点 OpenShift),并指示 Operator 不应将其操作数配置为高可用性操作。

根据以下规则,Red Hat OpenShift Service on AWS 安装程序在创建集群时根据集群的副本数量设置controlPlaneTopologyinfrastructureTopology 状态字段

  • 当控制平面副本数小于 3 时,controlPlaneTopology 状态设置为SingleReplica。否则,将其设置为HighlyAvailable

  • 当 Worker 副本数量为 0 时,控制平面节点也会被配置为 Worker 节点。因此,infrastructureTopology 状态将与 controlPlaneTopology 状态相同。

  • 当 Worker 副本数量为 1 时,infrastructureTopology 将设置为 SingleReplica。否则,它将设置为 HighlyAvailable

Operator 项目中的 API 使用示例

作为 Operator 作者,您可以使用普通的 Kubernetes 结构和 controller-runtime 库来更新您的 Operator 项目以访问基础设施 API,如下例所示。

controller-runtime 库示例
// Simple query
 nn := types.NamespacedName{
 Name: "cluster",
 }
 infraConfig := &configv1.Infrastructure{}
 err = crClient.Get(context.Background(), nn, infraConfig)
 if err != nil {
 return err
 }
 fmt.Printf("using crclient: %v\n", infraConfig.Status.ControlPlaneTopology)
 fmt.Printf("using crclient: %v\n", infraConfig.Status.InfrastructureTopology)
Kubernetes 结构示例
operatorConfigInformer := configinformer.NewSharedInformerFactoryWithOptions(configClient, 2*time.Second)
 infrastructureLister = operatorConfigInformer.Config().V1().Infrastructures().Lister()
 infraConfig, err := configClient.ConfigV1().Infrastructures().Get(context.Background(), "cluster", metav1.GetOptions{})
 if err != nil {
 return err
 }
// fmt.Printf("%v\n", infraConfig)
 fmt.Printf("%v\n", infraConfig.Status.ControlPlaneTopology)
 fmt.Printf("%v\n", infraConfig.Status.InfrastructureTopology)