繁体   English   中英

领导人选举-Pod未选择担任领导人

[英]Leader election- Pod is not selecting as a leader

我已经使用kubernetes / client-go领导者选举实施了领导者选举。 我有2个副本。 这两个Pod都首次选择担任领导者,但是此后没有选择同一Pod作为领导者。 一段时间后,领导人选举便停止了。 我试图删除一个吊舱,然后将创建的新吊舱选为领导。 再次,如果广告连播停止停止播放,则没有任何广告连播充当领导。 我正在使用configmap进行资源锁定。 请帮我解决问题。

func NewElectorWithCallbacks(namespace, configMapName, identity string, ttl time.Duration, client cli.CoreV1Interface, callbacks *leaderelection.LeaderCallbacks) (*leaderelection.LeaderElector, error) {
hostname, err := os.Hostname()
if err != nil {
  return nil, err
}
broadcaster := record.NewBroadcaster()
broadcaster.StartLogging(log.Printf)
broadcaster.StartRecordingToSink(&cli.EventSinkImpl{Interface: client.Events(namespace)})
recorder := broadcaster.NewRecorder(scheme.Scheme, api.EventSource{Component: identity, Host: hostname})
cmLock := &resourcelock.ConfigMapLock{
  Client: client,
  ConfigMapMeta: meta.ObjectMeta{
    Namespace: namespace,
    Name:      configMapName,
  },
  LockConfig: resourcelock.ResourceLockConfig{
    Identity:      identity,
    EventRecorder: recorder,
  },
}
if callbacks == nil {
  callbacks = NewDefaultCallbacks()
}
config := leaderelection.LeaderElectionConfig{
  Lock:          cmLock,
  LeaseDuration: ttl,
  RenewDeadline: ttl / 2,
  RetryPeriod:   ttl / 4,
  Callbacks:     *callbacks,
}
return leaderelection.NewLeaderElector(config)
}

config, err = rest.InClusterConfig()
v1Client, err := v1.NewForConfig(config)
callbacks := &leaderelection.LeaderCallbacks{
        OnStartedLeading: func(context.Context) {
            // do the work
           fmt.Println("selected as leader")
            // Wait forever
            select {}
        },
        OnStoppedLeading: func() {
            fmt.Println("Pod stopped leading")

        },
    }
elector, err := election.NewElectorWithCallbacks(namespace, electionName, hostname, ttl, v1Client, callbacks)
elector.Run(context.TODO())

在此处输入图片说明

您可以将pod部署为statefullsetsheadless service 请参考文档

为什么?

  • 容器将按顺序创建。 您定义要启动的第一个Pod为Master ,其余为Slave。
  • StatefulSet中的Pod具有唯一的序号索引和稳定的网络标识。 例如下面
    kubectl get pods -l app=nginx
    NAME      READY     STATUS    RESTARTS   AGE
    web-0     1/1       Running   0          1m
    web-1     1/1       Running   0          1m

即使pod web-0重新启动,pod的名称或FQDN也不会改变。

web-0.nginx.default.svc.cluster.local

<pod_name>.<service_name>.<namespace>.svc.cluster.local

我仅强调了几点,请完整阅读文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM