mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-20 18:31:15 +00:00
Add lock type flags for controller-manager leadership election
This commit is contained in:
parent
5a1ec9bf6f
commit
a2248a2bcd
@ -32,7 +32,6 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
@ -192,21 +191,17 @@ func Run(s *options.CMServer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: enable other lock types
|
rlc := resourcelock.ResourceLockConfig{
|
||||||
rl := resourcelock.EndpointsLock{
|
Identity: id,
|
||||||
EndpointsMeta: metav1.ObjectMeta{
|
EventRecorder: recorder,
|
||||||
Namespace: "kube-system",
|
}
|
||||||
Name: "kube-controller-manager",
|
rl, err := leaderelection.GetLock(s.LeaderElection, *leaderElectionClient, rlc)
|
||||||
},
|
if err != nil {
|
||||||
Client: leaderElectionClient,
|
return err
|
||||||
LockConfig: resourcelock.ResourceLockConfig{
|
|
||||||
Identity: id,
|
|
||||||
EventRecorder: recorder,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
leaderelection.RunOrDie(leaderelection.LeaderElectionConfig{
|
leaderelection.RunOrDie(leaderelection.LeaderElectionConfig{
|
||||||
Lock: &rl,
|
Lock: rl,
|
||||||
LeaseDuration: s.LeaderElection.LeaseDuration.Duration,
|
LeaseDuration: s.LeaderElection.LeaseDuration.Duration,
|
||||||
RenewDeadline: s.LeaderElection.RenewDeadline.Duration,
|
RenewDeadline: s.LeaderElection.RenewDeadline.Duration,
|
||||||
RetryPeriod: s.LeaderElection.RetryPeriod.Duration,
|
RetryPeriod: s.LeaderElection.RetryPeriod.Duration,
|
||||||
|
@ -685,6 +685,9 @@ type LeaderElectionConfiguration struct {
|
|||||||
// acquisition and renewal of a leadership. This is only applicable if
|
// acquisition and renewal of a leadership. This is only applicable if
|
||||||
// leader election is enabled.
|
// leader election is enabled.
|
||||||
RetryPeriod metav1.Duration
|
RetryPeriod metav1.Duration
|
||||||
|
// LockType indicates the type of locking to use for leadership election.
|
||||||
|
// Supported options are `endpoints` (default) and `configmap`.
|
||||||
|
LockType string
|
||||||
}
|
}
|
||||||
|
|
||||||
type KubeControllerManagerConfiguration struct {
|
type KubeControllerManagerConfiguration struct {
|
||||||
|
@ -233,6 +233,9 @@ type LeaderElectionConfiguration struct {
|
|||||||
// acquisition and renewal of a leadership. This is only applicable if
|
// acquisition and renewal of a leadership. This is only applicable if
|
||||||
// leader election is enabled.
|
// leader election is enabled.
|
||||||
RetryPeriod metav1.Duration `json:"retryPeriod"`
|
RetryPeriod metav1.Duration `json:"retryPeriod"`
|
||||||
|
// LockType indicates the type of locking to use for leadership election.
|
||||||
|
// Supported options are `endpoints` (default) and `configmap`.
|
||||||
|
LockType string
|
||||||
}
|
}
|
||||||
|
|
||||||
// A configuration field should go in KubeletFlags instead of KubeletConfiguration if any of these are true:
|
// A configuration field should go in KubeletFlags instead of KubeletConfiguration if any of these are true:
|
||||||
|
@ -814,6 +814,7 @@ func autoConvert_v1alpha1_LeaderElectionConfiguration_To_componentconfig_LeaderE
|
|||||||
out.LeaseDuration = in.LeaseDuration
|
out.LeaseDuration = in.LeaseDuration
|
||||||
out.RenewDeadline = in.RenewDeadline
|
out.RenewDeadline = in.RenewDeadline
|
||||||
out.RetryPeriod = in.RetryPeriod
|
out.RetryPeriod = in.RetryPeriod
|
||||||
|
out.LockType = in.LockType
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -829,6 +830,7 @@ func autoConvert_componentconfig_LeaderElectionConfiguration_To_v1alpha1_LeaderE
|
|||||||
out.LeaseDuration = in.LeaseDuration
|
out.LeaseDuration = in.LeaseDuration
|
||||||
out.RenewDeadline = in.RenewDeadline
|
out.RenewDeadline = in.RenewDeadline
|
||||||
out.RetryPeriod = in.RetryPeriod
|
out.RetryPeriod = in.RetryPeriod
|
||||||
|
out.LockType = in.LockType
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ go_library(
|
|||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/componentconfig:go_default_library",
|
"//pkg/apis/componentconfig:go_default_library",
|
||||||
|
"//pkg/client/clientset_generated/clientset:go_default_library",
|
||||||
"//pkg/client/leaderelection/resourcelock:go_default_library",
|
"//pkg/client/leaderelection/resourcelock:go_default_library",
|
||||||
"//vendor/github.com/golang/glog:go_default_library",
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
"//vendor/github.com/spf13/pflag:go_default_library",
|
"//vendor/github.com/spf13/pflag:go_default_library",
|
||||||
|
@ -53,11 +53,12 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/runtime"
|
"k8s.io/apimachinery/pkg/util/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/kubernetes/pkg/apis/componentconfig"
|
"k8s.io/kubernetes/pkg/apis/componentconfig"
|
||||||
|
cs "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
||||||
rl "k8s.io/kubernetes/pkg/client/leaderelection/resourcelock"
|
rl "k8s.io/kubernetes/pkg/client/leaderelection/resourcelock"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
@ -69,6 +70,9 @@ const (
|
|||||||
DefaultLeaseDuration = 15 * time.Second
|
DefaultLeaseDuration = 15 * time.Second
|
||||||
DefaultRenewDeadline = 10 * time.Second
|
DefaultRenewDeadline = 10 * time.Second
|
||||||
DefaultRetryPeriod = 2 * time.Second
|
DefaultRetryPeriod = 2 * time.Second
|
||||||
|
|
||||||
|
LockTypeEndpoints = "endpoints"
|
||||||
|
LockTypeConfigMaps = "configmaps"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewLeadereElector creates a LeaderElector from a LeaderElecitionConfig
|
// NewLeadereElector creates a LeaderElector from a LeaderElecitionConfig
|
||||||
@ -225,7 +229,7 @@ func (le *LeaderElector) tryAcquireOrRenew() bool {
|
|||||||
// 1. obtain or create the ElectionRecord
|
// 1. obtain or create the ElectionRecord
|
||||||
oldLeaderElectionRecord, err := le.config.Lock.Get()
|
oldLeaderElectionRecord, err := le.config.Lock.Get()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !errors.IsNotFound(err) {
|
if !apierrors.IsNotFound(err) {
|
||||||
glog.Errorf("error retrieving resource lock %v: %v", le.config.Lock.Describe(), err)
|
glog.Errorf("error retrieving resource lock %v: %v", le.config.Lock.Describe(), err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -284,6 +288,7 @@ func DefaultLeaderElectionConfiguration() componentconfig.LeaderElectionConfigur
|
|||||||
LeaseDuration: metav1.Duration{Duration: DefaultLeaseDuration},
|
LeaseDuration: metav1.Duration{Duration: DefaultLeaseDuration},
|
||||||
RenewDeadline: metav1.Duration{Duration: DefaultRenewDeadline},
|
RenewDeadline: metav1.Duration{Duration: DefaultRenewDeadline},
|
||||||
RetryPeriod: metav1.Duration{Duration: DefaultRetryPeriod},
|
RetryPeriod: metav1.Duration{Duration: DefaultRetryPeriod},
|
||||||
|
LockType: LockTypeEndpoints,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,4 +311,33 @@ func BindFlags(l *componentconfig.LeaderElectionConfiguration, fs *pflag.FlagSet
|
|||||||
fs.DurationVar(&l.RetryPeriod.Duration, "leader-elect-retry-period", l.RetryPeriod.Duration, ""+
|
fs.DurationVar(&l.RetryPeriod.Duration, "leader-elect-retry-period", l.RetryPeriod.Duration, ""+
|
||||||
"The duration the clients should wait between attempting acquisition and renewal "+
|
"The duration the clients should wait between attempting acquisition and renewal "+
|
||||||
"of a leadership. This is only applicable if leader election is enabled.")
|
"of a leadership. This is only applicable if leader election is enabled.")
|
||||||
|
fs.StringVar(&l.LockType, "leader-elect-lock-type", l.LockType, fmt.Sprintf(""+
|
||||||
|
"Indicates the type of locking to use for leadership election. Supported options "+
|
||||||
|
"are `%s` (default) and `%s`.", LockTypeConfigMaps, LockTypeEndpoints))
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLock(l componentconfig.LeaderElectionConfiguration, client cs.Clientset, rlc rl.ResourceLockConfig) (rl.Interface, error) {
|
||||||
|
name := "kube-controller-manager"
|
||||||
|
switch l.LockType {
|
||||||
|
case LockTypeEndpoints:
|
||||||
|
return &rl.EndpointsLock{
|
||||||
|
EndpointsMeta: metav1.ObjectMeta{
|
||||||
|
Namespace: metav1.NamespaceSystem,
|
||||||
|
Name: name,
|
||||||
|
},
|
||||||
|
Client: client,
|
||||||
|
LockConfig: rlc,
|
||||||
|
}, nil
|
||||||
|
case LockTypeConfigMaps:
|
||||||
|
return &rl.ConfigMapLock{
|
||||||
|
ConfigMapMeta: metav1.ObjectMeta{
|
||||||
|
Namespace: metav1.NamespaceSystem,
|
||||||
|
Name: name,
|
||||||
|
},
|
||||||
|
Client: client,
|
||||||
|
LockConfig: rlc,
|
||||||
|
}, nil
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("Invalid lock-type provided: %s. Supported types are `%s` and `%s`", l.LockType, LockTypeConfigMaps, LockTypeEndpoints)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user