×

在操作符的生命周期中,可能存在多个实例同时运行的情况,例如在滚动升级操作符时。在这种情况下,需要避免多个操作符实例之间发生竞争,使用领导者选举来确保只有一个领导者实例处理协调,而其他实例处于非活动状态,但在领导者下线时随时准备接管。

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

终身领导者

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

带租期的领导者

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

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

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

不建议使用 Red Hat 支持的 Operator SDK 版本创建新的 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)

操作符领导者选举示例

以下示例说明了如何为操作符使用两种领导者选举选项:终身领导者和带租期的领导者。

终身领导者选举

使用终身领导者选举实现,对leader.Become()的调用会阻塞操作符,因为它会重试直到能够通过创建名为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)
  }
  ...
}

如果操作符未在集群内运行,则leader.Become()会简单地返回而不会出错,从而跳过领导者选举,因为它无法检测到操作符的名称。

带租期的领导者选举

可以使用管理器选项启用带租期的领导者实现。

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)
  ...
}

当操作符未在集群中运行时,管理器在启动时会返回错误,因为它无法检测到操作符的命名空间以创建用于领导者选举的 ConfigMap。可以通过设置管理器的LeaderElectionNamespace选项来覆盖此命名空间。