×

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

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

终身领导者

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

带租约的领导者

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

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

Operator SDK的Red Hat支持版本(包括Operator项目的相关脚手架和测试工具)已弃用,并计划在未来版本的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)

Operator领导者选举示例

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

终身领导者选举

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

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的命名空间来创建用于领导者选举的配置映射。您可以通过为Manager设置LeaderElectionNamespace选项来覆盖此命名空间。