×

在 Operator 的生命周期中,可能在任何给定时间运行多个实例,例如在推出 Operator 升级时。在这种情况下,有必要避免使用领导者选举来避免多个 Operator 实例之间的竞争。这确保只有一个领导者实例处理协调,而其他实例处于非活动状态,但在领导者退出时随时准备接管。

有两种不同的领导者选举实现可供选择,每种实现都有其自身的权衡

终身领导者

领导者 Pod 仅在被删除时才放弃领导权(使用垃圾回收)。此实现排除了两个实例错误地运行为领导者的可能性,这种状态也称为脑裂。但是,此方法可能会延迟选举新的领导者。例如,当领导者 Pod 位于无响应或分区节点上时,您可以指定node.kubernetes.io/unreachablenode.kubernetes.io/not-ready容忍度在领导者 Pod 上,并使用tolerationSeconds值来决定领导者 Pod 从节点中删除并退出需要多长时间。这些容忍度默认情况下会在接纳时添加到 Pod 中,tolerationSeconds值为 5 分钟。更多信息,请参见终身领导者 Go 文档。

带租约的领导者

领导者 Pod 定期续订领导者租约,并在无法续订租约时放弃领导权。此实现允许在现有领导者隔离时更快地过渡到新的领导者,但在某些情况下存在脑裂的可能性。更多信息,请参见带租约的领导者 Go 文档。

默认情况下,Operator SDK 启用终身领导者实现。请参考这两种方法的相关 Go 文档,以考虑适合您的用例的权衡。

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

不建议使用 Red Hat 支持的 Operator SDK 版本创建新的 Operator 项目。拥有现有 Operator 项目的 Operator 作者可以使用 OpenShift Dedicated 发布的 Operator SDK CLI 工具版本来维护他们的项目并创建目标为更新版本的 OpenShift Dedicated 的 Operator 版本。

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

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

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

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

Operator 选主示例

以下示例说明如何为 Operator 使用两种选主选项:终身领导者和带租约的领导者。

终身领导者选举

在终身领导者选举实现中,对 leader.Become() 的调用会阻塞 Operator,因为它会重试直到能够通过创建名为 memcached-operator-lock 的 ConfigMap 来成为领导者。

import (
  ...
  "github.com/operator-framework/operator-sdk/pkg/leader"
)

func main() {
  ...
  err = leader.Become(context.TODO(), "memcached-operator-lock")
  if err != nil {
    log.Error(err, "Failed to retry for leader lock")
    os.Exit(1)
  }
  ...
}

如果 Operator 没有在集群内运行,leader.Become() 将简单地返回而不会出错,以跳过选主过程,因为它无法检测到 Operator 的名称。

带租约的领导者选举

可以使用 Manager 选项 启用带租约的领导者选举。

import (
  ...
  "sigs.k8s.io/controller-runtime/pkg/manager"
)

func main() {
  ...
  opts := manager.Options{
    ...
    LeaderElection: true,
    LeaderElectionID: "memcached-operator-lock"
  }
  mgr, err := manager.New(cfg, opts)
  ...
}

当 Operator 未在集群中运行时,Manager 在启动时会返回错误,因为它无法检测到 Operator 的命名空间以创建用于选主的 ConfigMap。可以通过为 Manager 设置 LeaderElectionNamespace 选项来覆盖此命名空间。