Skip to content

Commit f20a36f

Browse files
authored
Merge pull request kubernetes#95428 from roycaihw/cleanup/generalize-lease-controller
Generalize node lease controller
2 parents 237dae5 + 9861b9e commit f20a36f

File tree

13 files changed

+338
-67
lines changed

13 files changed

+338
-67
lines changed

pkg/kubelet/BUILD

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ go_library(
7272
"//pkg/kubelet/metrics:go_default_library",
7373
"//pkg/kubelet/metrics/collectors:go_default_library",
7474
"//pkg/kubelet/network/dns:go_default_library",
75-
"//pkg/kubelet/nodelease:go_default_library",
7675
"//pkg/kubelet/nodestatus:go_default_library",
7776
"//pkg/kubelet/oom:go_default_library",
7877
"//pkg/kubelet/pleg:go_default_library",
@@ -142,6 +141,7 @@ go_library(
142141
"//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library",
143142
"//staging/src/k8s.io/cloud-provider:go_default_library",
144143
"//staging/src/k8s.io/cloud-provider/api:go_default_library",
144+
"//staging/src/k8s.io/component-helpers/lease:go_default_library",
145145
"//staging/src/k8s.io/cri-api/pkg/apis:go_default_library",
146146
"//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library",
147147
"//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library",
@@ -309,7 +309,6 @@ filegroup(
309309
"//pkg/kubelet/logs:all-srcs",
310310
"//pkg/kubelet/metrics:all-srcs",
311311
"//pkg/kubelet/network:all-srcs",
312-
"//pkg/kubelet/nodelease:all-srcs",
313312
"//pkg/kubelet/nodestatus:all-srcs",
314313
"//pkg/kubelet/oom:all-srcs",
315314
"//pkg/kubelet/pleg:all-srcs",

pkg/kubelet/kubelet.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import (
5656
"k8s.io/client-go/util/certificate"
5757
"k8s.io/client-go/util/flowcontrol"
5858
cloudprovider "k8s.io/cloud-provider"
59+
"k8s.io/component-helpers/lease"
5960
internalapi "k8s.io/cri-api/pkg/apis"
6061
"k8s.io/klog/v2"
6162
pluginwatcherapi "k8s.io/kubelet/pkg/apis/pluginregistration/v1"
@@ -84,7 +85,6 @@ import (
8485
"k8s.io/kubernetes/pkg/kubelet/metrics"
8586
"k8s.io/kubernetes/pkg/kubelet/metrics/collectors"
8687
"k8s.io/kubernetes/pkg/kubelet/network/dns"
87-
"k8s.io/kubernetes/pkg/kubelet/nodelease"
8888
oomwatcher "k8s.io/kubernetes/pkg/kubelet/oom"
8989
"k8s.io/kubernetes/pkg/kubelet/pleg"
9090
"k8s.io/kubernetes/pkg/kubelet/pluginmanager"
@@ -169,6 +169,9 @@ const (
169169

170170
// Minimum number of dead containers to keep in a pod
171171
minDeadContainerInPod = 1
172+
173+
// nodeLeaseRenewIntervalFraction is the fraction of lease duration to renew the lease
174+
nodeLeaseRenewIntervalFraction = 0.25
172175
)
173176

174177
// SyncHandler is an interface implemented by Kubelet, for testability
@@ -784,7 +787,17 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
784787
klet.softAdmitHandlers.AddPodAdmitHandler(lifecycle.NewNoNewPrivsAdmitHandler(klet.containerRuntime))
785788
klet.softAdmitHandlers.AddPodAdmitHandler(lifecycle.NewProcMountAdmitHandler(klet.containerRuntime))
786789

787-
klet.nodeLeaseController = nodelease.NewController(klet.clock, klet.heartbeatClient, string(klet.nodeName), kubeCfg.NodeLeaseDurationSeconds, klet.onRepeatedHeartbeatFailure)
790+
leaseDuration := time.Duration(kubeCfg.NodeLeaseDurationSeconds) * time.Second
791+
renewInterval := time.Duration(float64(leaseDuration) * nodeLeaseRenewIntervalFraction)
792+
klet.nodeLeaseController = lease.NewController(
793+
klet.clock,
794+
klet.heartbeatClient,
795+
string(klet.nodeName),
796+
kubeCfg.NodeLeaseDurationSeconds,
797+
klet.onRepeatedHeartbeatFailure,
798+
renewInterval,
799+
v1.NamespaceNodeLease,
800+
util.SetNodeOwnerFunc(klet.heartbeatClient, string(klet.nodeName)))
788801

789802
// Finally, put the most recent version of the config on the Kubelet, so
790803
// people can see how it was configured.
@@ -990,7 +1003,7 @@ type Kubelet struct {
9901003
updateRuntimeMux sync.Mutex
9911004

9921005
// nodeLeaseController claims and renews the node lease for this Kubelet
993-
nodeLeaseController nodelease.Controller
1006+
nodeLeaseController lease.Controller
9941007

9951008
// Generates pod events.
9961009
pleg pleg.PodLifecycleEventGenerator

pkg/kubelet/util/BUILD

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,34 +47,34 @@ go_library(
4747
"boottime_util_darwin.go",
4848
"boottime_util_linux.go",
4949
"doc.go",
50+
"nodelease.go",
5051
"util.go",
5152
"util_unix.go",
5253
"util_unsupported.go",
5354
"util_windows.go",
5455
],
5556
importpath = "k8s.io/kubernetes/pkg/kubelet/util",
5657
deps = [
58+
"//staging/src/k8s.io/api/coordination/v1:go_default_library",
59+
"//staging/src/k8s.io/api/core/v1:go_default_library",
5760
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
61+
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
62+
"//vendor/k8s.io/klog/v2:go_default_library",
5863
] + select({
5964
"@io_bazel_rules_go//go/platform:android": [
6065
"//vendor/golang.org/x/sys/unix:go_default_library",
61-
"//vendor/k8s.io/klog/v2:go_default_library",
6266
],
6367
"@io_bazel_rules_go//go/platform:darwin": [
6468
"//vendor/golang.org/x/sys/unix:go_default_library",
65-
"//vendor/k8s.io/klog/v2:go_default_library",
6669
],
6770
"@io_bazel_rules_go//go/platform:freebsd": [
6871
"//vendor/golang.org/x/sys/unix:go_default_library",
69-
"//vendor/k8s.io/klog/v2:go_default_library",
7072
],
7173
"@io_bazel_rules_go//go/platform:ios": [
7274
"//vendor/golang.org/x/sys/unix:go_default_library",
73-
"//vendor/k8s.io/klog/v2:go_default_library",
7475
],
7576
"@io_bazel_rules_go//go/platform:linux": [
7677
"//vendor/golang.org/x/sys/unix:go_default_library",
77-
"//vendor/k8s.io/klog/v2:go_default_library",
7878
],
7979
"@io_bazel_rules_go//go/platform:windows": [
8080
"//vendor/github.com/Microsoft/go-winio:go_default_library",

pkg/kubelet/util/nodelease.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
Copyright 2020 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package util
18+
19+
import (
20+
"context"
21+
22+
coordinationv1 "k8s.io/api/coordination/v1"
23+
corev1 "k8s.io/api/core/v1"
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25+
clientset "k8s.io/client-go/kubernetes"
26+
27+
"k8s.io/klog/v2"
28+
)
29+
30+
// SetNodeOwnerFunc helps construct a newLeasePostProcessFunc which sets
31+
// a node OwnerReference to the given lease object
32+
func SetNodeOwnerFunc(c clientset.Interface, nodeName string) func(lease *coordinationv1.Lease) error {
33+
return func(lease *coordinationv1.Lease) error {
34+
// Setting owner reference needs node's UID. Note that it is different from
35+
// kubelet.nodeRef.UID. When lease is initially created, it is possible that
36+
// the connection between master and node is not ready yet. So try to set
37+
// owner reference every time when renewing the lease, until successful.
38+
if len(lease.OwnerReferences) == 0 {
39+
if node, err := c.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}); err == nil {
40+
lease.OwnerReferences = []metav1.OwnerReference{
41+
{
42+
APIVersion: corev1.SchemeGroupVersion.WithKind("Node").Version,
43+
Kind: corev1.SchemeGroupVersion.WithKind("Node").Kind,
44+
Name: nodeName,
45+
UID: node.UID,
46+
},
47+
}
48+
} else {
49+
klog.Errorf("failed to get node %q when trying to set owner ref to the node lease: %v", nodeName, err)
50+
return err
51+
}
52+
}
53+
return nil
54+
}
55+
}

staging/publishing/import-restrictions.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,5 @@
255255
- k8s.io/api
256256
- k8s.io/apimachinery
257257
- k8s.io/client-go
258+
- k8s.io/klog
259+
- k8s.io/utils

staging/publishing/rules.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,3 +1368,5 @@ rules:
13681368
branch: master
13691369
- repository: api
13701370
branch: master
1371+
- repository: client-go
1372+
branch: master

staging/src/k8s.io/component-helpers/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ filegroup(
99
name = "all-srcs",
1010
srcs = [
1111
":package-srcs",
12+
"//staging/src/k8s.io/component-helpers/lease:all-srcs",
1213
"//staging/src/k8s.io/component-helpers/scheduling/corev1:all-srcs",
1314
],
1415
tags = ["automanaged"],

staging/src/k8s.io/component-helpers/go.mod

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@ module k8s.io/component-helpers
44

55
go 1.15
66

7-
require k8s.io/api v0.0.0
7+
require (
8+
k8s.io/api v0.0.0
9+
k8s.io/apimachinery v0.0.0
10+
k8s.io/client-go v0.0.0
11+
k8s.io/klog/v2 v2.2.0
12+
k8s.io/utils v0.0.0-20200729134348-d5654de09c73
13+
)
814

915
replace (
1016
k8s.io/api => ../api
1117
k8s.io/apimachinery => ../apimachinery
18+
k8s.io/client-go => ../client-go
1219
k8s.io/component-helpers => ../component-helpers
1320
)

0 commit comments

Comments
 (0)