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