×

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

通过访问 OpenShift Container Platform 中提供的集群高可用性模式 API,Operator 作者可以使用 Operator SDK 来使其 Operator 能够检测集群的基础架构拓扑结构(HA 或非 HA 模式)。可以开发自定义 Operator 逻辑,该逻辑使用检测到的集群拓扑结构来自动将 Operator 及其管理的任何 Operand 或工作负载的资源需求切换到最适合该拓扑结构的配置文件。

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

不建议使用 Red Hat 支持的 Operator SDK 版本创建新的 Operator 项目。拥有现有 Operator 项目的 Operator 作者可以使用 OpenShift Container Platform 4.17 版本中发布的 Operator SDK CLI 工具版本来维护其项目并创建面向较新版本的 OpenShift Container Platform 的 Operator 版本。

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

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

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

有关 OpenShift Container Platform 中已弃用或移除的主要功能的最新列表,请参阅 OpenShift Container Platform 发行说明中的 *已弃用和移除的功能* 部分。

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

关于集群高可用性模式 API

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

在基础架构 API 中,infrastructureTopology 状态表示对不在控制平面节点上运行的基础架构服务的期望,通常由节点选择器表示,其 role 值不为 mastercontrolPlaneTopology 状态表示对通常在控制平面节点上运行的 Operand 的期望。

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

OpenShift Container Platform 安装程序根据创建集群时的集群副本数,按照以下规则设置 controlPlaneTopologyinfrastructureTopology 状态字段

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

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

  • 当工作副本数为 1 时,infrastructureTopology 设置为 SingleReplica。否则,设置为 HighlyAvailable

在 Operator 项目中使用 API 的示例

作为 Operator 作者,您可以更新您的 Operator 项目以使用正常的 Kubernetes 结构和 controller-runtime 库访问基础架构 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)