#go #kubernetes #leader-election
#Вперед #kubernetes #лидер-выборы
Вопрос:
Я реализовал выбор лидера, используя kubernetes / client-выбор лидера go. У меня есть 2 реплики. Впервые оба модуля выбираются в качестве лидера, но после этого один и тот же модуль не избирается в качестве лидера. И выборы лидера будут остановлены через некоторое время. Я попытался удалить один модуль, затем созданный новый модуль выбран в качестве лидера. Опять же, как только модуль перестал лидировать, ни один модуль не выступает в качестве лидера. Я использую 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(amp;cli.EventSinkImpl{Interface: client.Events(namespace)})
recorder := broadcaster.NewRecorder(scheme.Scheme, api.EventSource{Component: identity, Host: hostname})
cmLock := amp;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 := amp;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())
Комментарии:
1. Не могли бы вы, пожалуйста, обновить свой вопрос фрагментом вашего кода? Это облегчит выявление потенциальной ошибки и повысит ваши шансы получить ответ.
2. @AntoineCotten Я добавил код. Можете ли вы, пожалуйста, проверить
Ответ №1:
Вы можете развернуть модули как statefullsets
amp; headless service
. Пожалуйста, обратитесь к документам
Почему?
- Модули будут создаваться последовательно. Вы определяете, что первый запускаемый модуль является
Master
, а остальные являются подчиненными. - Модули в StatefulSet имеют уникальный порядковый индекс и стабильный сетевой идентификатор. Например, ниже,
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
Даже если модуль web-0
перезапустится, имя или полное доменное имя для модуля никогда не изменится.
web-0.nginx.default.svc.cluster.local
<pod_name>.<service_name>.<namespace>.svc.cluster.local
Я выделил только несколько моментов, пожалуйста, ознакомьтесь с документами полностью.