Выбор лидера - Pod не выбирает в качестве лидера - PullRequest
1 голос
/ 23 апреля 2019

Я провел выборы лидера, используя выборы лидера 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(&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

1 Ответ

0 голосов
/ 23 апреля 2019

Вы можете развернуть модули как statefullsets & 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

Я только выделил несколько пунктов, пожалуйста, пройдите, хотя документы полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...