Skip to content

Commit 892bd88

Browse files
committed
Support new control plane label and taint
Signed-off-by: Stefan Büringer [email protected]
1 parent c337ecc commit 892bd88

File tree

9 files changed

+112
-14
lines changed

9 files changed

+112
-14
lines changed

bootstrap/kubeadm/config/manager/manager.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ spec:
4141
tolerations:
4242
- effect: NoSchedule
4343
key: node-role.kubernetes.io/master
44+
- effect: NoSchedule
45+
key: node-role.kubernetes.io/control-plane

config/manager/manager.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,5 @@ spec:
4242
tolerations:
4343
- effect: NoSchedule
4444
key: node-role.kubernetes.io/master
45+
- effect: NoSchedule
46+
key: node-role.kubernetes.io/control-plane

controlplane/kubeadm/config/manager/manager.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ spec:
4141
tolerations:
4242
- effect: NoSchedule
4343
key: node-role.kubernetes.io/master
44+
- effect: NoSchedule
45+
key: node-role.kubernetes.io/control-plane

controlplane/kubeadm/controllers/controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1516,7 +1516,7 @@ func createMachineNodePair(name string, cluster *clusterv1.Cluster, kcp *control
15161516
node := &corev1.Node{
15171517
ObjectMeta: metav1.ObjectMeta{
15181518
Name: name,
1519-
Labels: map[string]string{"node-role.kubernetes.io/master": ""},
1519+
Labels: map[string]string{"node-role.kubernetes.io/control-plane": ""},
15201520
},
15211521
}
15221522

controlplane/kubeadm/internal/workload_cluster.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@ import (
5151
)
5252

5353
const (
54-
kubeProxyKey = "kube-proxy"
55-
kubeadmConfigKey = "kubeadm-config"
56-
kubeletConfigKey = "kubelet"
57-
cgroupDriverKey = "cgroupDriver"
58-
labelNodeRoleControlPlane = "node-role.kubernetes.io/master"
59-
clusterStatusKey = "ClusterStatus"
60-
clusterConfigurationKey = "ClusterConfiguration"
54+
kubeProxyKey = "kube-proxy"
55+
kubeadmConfigKey = "kubeadm-config"
56+
kubeletConfigKey = "kubelet"
57+
cgroupDriverKey = "cgroupDriver"
58+
labelNodeRoleOldControlPlane = "node-role.kubernetes.io/master" // Deprecated: https://github.com/kubernetes/kubeadm/issues/2200
59+
labelNodeRoleControlPlane = "node-role.kubernetes.io/control-plane"
60+
clusterStatusKey = "ClusterStatus"
61+
clusterConfigurationKey = "ClusterConfiguration"
6162
)
6263

6364
var (
@@ -121,16 +122,28 @@ type Workload struct {
121122
var _ WorkloadCluster = &Workload{}
122123

123124
func (w *Workload) getControlPlaneNodes(ctx context.Context) (*corev1.NodeList, error) {
124-
nodes := &corev1.NodeList{}
125-
labels := map[string]string{
126-
labelNodeRoleControlPlane: "",
127-
}
128-
if err := w.Client.List(ctx, nodes, ctrlclient.MatchingLabels(labels)); err != nil {
125+
allNodes := &corev1.NodeList{}
126+
if err := w.Client.List(ctx, allNodes); err != nil {
129127
return nil, err
130128
}
129+
130+
nodes := &corev1.NodeList{}
131+
for i := range allNodes.Items {
132+
node := allNodes.Items[i]
133+
if isControlPlaneNode(node) {
134+
nodes.Items = append(nodes.Items, node)
135+
}
136+
}
137+
131138
return nodes, nil
132139
}
133140

141+
func isControlPlaneNode(node corev1.Node) bool {
142+
_, hasLabelNodeRoleControlPlane := node.Labels[labelNodeRoleControlPlane]
143+
_, hasLabelNodeRoleOldControlPlane := node.Labels[labelNodeRoleOldControlPlane]
144+
return hasLabelNodeRoleControlPlane || hasLabelNodeRoleOldControlPlane
145+
}
146+
134147
func (w *Workload) getConfigMap(ctx context.Context, configMap ctrlclient.ObjectKey) (*corev1.ConfigMap, error) {
135148
original := &corev1.ConfigMap{}
136149
if err := w.Client.Get(ctx, configMap, original); err != nil {

controlplane/kubeadm/internal/workload_cluster_conditions_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,9 @@ func fakeNode(name string, options ...fakeNodeOption) *corev1.Node {
980980
p := &corev1.Node{
981981
ObjectMeta: metav1.ObjectMeta{
982982
Name: name,
983+
Labels: map[string]string{
984+
labelNodeRoleControlPlane: "",
985+
},
983986
},
984987
}
985988
for _, opt := range options {

controlplane/kubeadm/internal/workload_cluster_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,66 @@ import (
3838
"sigs.k8s.io/cluster-api/util/yaml"
3939
)
4040

41+
func TestIsControlPlaneNode(t *testing.T) {
42+
tests := []struct {
43+
name string
44+
node corev1.Node
45+
isControlPlaneNode bool
46+
}{
47+
{
48+
name: "control plane node with old label",
49+
node: corev1.Node{
50+
ObjectMeta: metav1.ObjectMeta{
51+
Labels: map[string]string{
52+
labelNodeRoleOldControlPlane: "",
53+
},
54+
},
55+
},
56+
isControlPlaneNode: true,
57+
},
58+
{
59+
name: "control plane node with new label",
60+
node: corev1.Node{
61+
ObjectMeta: metav1.ObjectMeta{
62+
Labels: map[string]string{
63+
labelNodeRoleControlPlane: "",
64+
},
65+
},
66+
},
67+
isControlPlaneNode: true,
68+
},
69+
{
70+
name: "control plane node with both label",
71+
node: corev1.Node{
72+
ObjectMeta: metav1.ObjectMeta{
73+
Labels: map[string]string{
74+
labelNodeRoleControlPlane: "",
75+
labelNodeRoleOldControlPlane: "",
76+
},
77+
},
78+
},
79+
isControlPlaneNode: true,
80+
},
81+
{
82+
name: "worker node",
83+
node: corev1.Node{
84+
ObjectMeta: metav1.ObjectMeta{
85+
Labels: map[string]string{},
86+
},
87+
},
88+
isControlPlaneNode: false,
89+
},
90+
}
91+
92+
for _, tt := range tests {
93+
t.Run(tt.name, func(t *testing.T) {
94+
g := NewWithT(t)
95+
96+
g.Expect(isControlPlaneNode(tt.node)).To(Equal(tt.isControlPlaneNode))
97+
})
98+
}
99+
}
100+
41101
func TestUpdateKubeProxyImageInfo(t *testing.T) {
42102
tests := []struct {
43103
name string

test/framework/deployment_helpers.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"k8s.io/api/policy/v1beta1"
3535
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3636
"k8s.io/apimachinery/pkg/util/intstr"
37+
utilversion "k8s.io/apimachinery/pkg/util/version"
3738
"k8s.io/client-go/kubernetes"
3839
"k8s.io/utils/pointer"
3940
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -306,12 +307,25 @@ func DeployUnevictablePod(ctx context.Context, input DeployUnevictablePodInput)
306307
},
307308
}
308309
if input.ControlPlane != nil {
309-
workloadDeployment.Spec.Template.Spec.NodeSelector = map[string]string{"node-role.kubernetes.io/master": ""}
310+
serverVersion, err := workloadClient.ServerVersion()
311+
Expect(err).ToNot(HaveOccurred())
312+
313+
// Use the control-plane label for Kubernetes version >= v1.20.0.
314+
if utilversion.MustParseGeneric(serverVersion.String()).AtLeast(utilversion.MustParseGeneric("v1.20.0")) {
315+
workloadDeployment.Spec.Template.Spec.NodeSelector = map[string]string{"node-role.kubernetes.io/control-plane": ""}
316+
} else {
317+
workloadDeployment.Spec.Template.Spec.NodeSelector = map[string]string{"node-role.kubernetes.io/master": ""}
318+
}
319+
310320
workloadDeployment.Spec.Template.Spec.Tolerations = []corev1.Toleration{
311321
{
312322
Key: "node-role.kubernetes.io/master",
313323
Effect: "NoSchedule",
314324
},
325+
{
326+
Key: "node-role.kubernetes.io/control-plane",
327+
Effect: "NoSchedule",
328+
},
315329
}
316330
}
317331
AddDeploymentToWorkloadCluster(ctx, AddDeploymentToWorkloadClusterInput{

test/infrastructure/docker/config/manager/manager.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ spec:
4444
tolerations:
4545
- effect: NoSchedule
4646
key: node-role.kubernetes.io/master
47+
- effect: NoSchedule
48+
key: node-role.kubernetes.io/control-plane
4749
volumes:
4850
- name: dockersock
4951
hostPath:

0 commit comments

Comments
 (0)