Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 领导人选举-Pod未选择作为领导人_Go_Kubernetes_Leader Election - Fatal编程技术网

Go 领导人选举-Pod未选择作为领导人

Go 领导人选举-Pod未选择作为领导人,go,kubernetes,leader-election,Go,Kubernetes,Leader Election,我已经使用kubernetes/client go领导人选举实现了领导人选举。我有两个复制品。这是第一次两个pod都被选为领导者,但在此之后,同一个pod不会被选为领导者。一段时间后,领导人选举就停止了。我试图删除一个pod,然后创建的新pod被选为引导。一旦吊舱停止引导,就没有吊舱充当引导器。我正在使用configmap进行资源锁定。请帮我解决这个问题 func NewElectorWithCallbacks(namespace, configMapName, identity string,

我已经使用kubernetes/client go领导人选举实现了领导人选举。我有两个复制品。这是第一次两个pod都被选为领导者,但在此之后,同一个pod不会被选为领导者。一段时间后,领导人选举就停止了。我试图删除一个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部署为
状态完整集
无头服务
。请参阅

为什么?

  • 吊舱将按顺序创建。您定义要启动的第一个pod是主pod,其余pod是从pod
  • 状态集中的POD具有唯一的顺序索引和稳定的网络标识。比如下面,
即使pod
web-0
重新启动,pod的名称或FQDN也不会更改

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

…svc.cluster.local


我只强调了几点,请仔细阅读这些文件

你能用一段代码更新你的问题吗?这样可以更容易地找出潜在的错误,并提高获得答案的机会。@AntoineCotten我已经添加了代码。你能查一下吗
    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