gpt4 book ai didi

go - Leader election - Pod 没有选择作为领导者

转载 作者:IT王子 更新时间:2023-10-29 02:19:13 26 4
gpt4 key购买 nike

我已经使用 kubernetes/client-go 领导者选举实现了领导者选举。我有 2 个副本。第一次两个 pod 都被选为 leader,但此后同一个 pod 没有被选为 leader。领导选举在一段时间后停止。我试图删除一个 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())

enter image description here

最佳答案

您可以将 pod 部署为 statefullsets & headless service .请引用docs

为什么?

  • Pod 将按顺序创建。您定义要启动的第一个 pod 是 Master其余的都是奴隶。
  • 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

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

关于go - Leader election - Pod 没有选择作为领导者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55805569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com