Skip to content

Commit 7f3fea2

Browse files
committed
Got a working cluster with split control plane.
1 parent b0752c2 commit 7f3fea2

8 files changed

Lines changed: 52 additions & 15 deletions

File tree

channels/pkg/cmd/apply_channel.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ import (
4343
)
4444

4545
type ApplyChannelOptions struct {
46-
Yes bool
47-
Interval time.Duration
48-
NodeName string
46+
Yes bool
47+
Interval time.Duration
48+
NodeName string
49+
NodeLabel string
4950
}
5051

5152
func NewCmdApplyChannel(f *ChannelsFactory, out io.Writer) *cobra.Command {
@@ -67,6 +68,7 @@ func NewCmdApplyChannel(f *ChannelsFactory, out io.Writer) *cobra.Command {
6768
cmd.Flags().BoolVar(&options.Yes, "yes", false, "Apply update")
6869
cmd.Flags().DurationVar(&options.Interval, "interval", 0, "If non-zero, re-apply the channel on this interval until interrupted (e.g. 60s)")
6970
cmd.Flags().StringVar(&options.NodeName, "node-name", "", "If set, patch the named node with the mandatory control-plane labels each iteration; typically supplied via the downward API.")
71+
cmd.Flags().StringVar(&options.NodeLabel, "node-label", "", "If set, patch the named node with this label each iteration; typically supplied via the downward API.")
7072

7173
return cmd
7274
}
@@ -80,7 +82,7 @@ func runApplyChannelIteration(ctx context.Context, f *ChannelsFactory, out io.Wr
8082
labelerClient, err := f.KubernetesClient()
8183
if err != nil {
8284
merr = multierr.Append(merr, fmt.Errorf("building kubernetes client for node labeler: %w", err))
83-
} else if err := nodelabeler.BootstrapControlPlaneNodeLabels(ctx, labelerClient, options.NodeName); err != nil {
85+
} else if err := nodelabeler.BootstrapControlPlaneNodeLabels(ctx, labelerClient, options.NodeName, options.NodeLabel); err != nil {
8486
merr = multierr.Append(merr, fmt.Errorf("bootstrapping node labels: %w", err))
8587
}
8688
}

channels/pkg/nodelabeler/labeler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ type nodePatchMetadata struct {
3838

3939
// BootstrapControlPlaneNodeLabels applies labels to the current node so that it acts as a control-plane.
4040
// Safe to call repeatedly: the patch is skipped when the labels already match.
41-
func BootstrapControlPlaneNodeLabels(ctx context.Context, client kubernetes.Interface, nodeName string) error {
41+
func BootstrapControlPlaneNodeLabels(ctx context.Context, client kubernetes.Interface, nodeName string, nodeLabel string) error {
4242
if nodeName == "" {
4343
return fmt.Errorf("node name is required")
4444
}
@@ -49,7 +49,7 @@ func BootstrapControlPlaneNodeLabels(ctx context.Context, client kubernetes.Inte
4949
return fmt.Errorf("querying node %q: %w", nodeName, err)
5050
}
5151

52-
labels := nodelabels.BuildMandatoryControlPlaneLabels()
52+
labels := nodelabels.BuildMandatoryControlPlaneLabels(nodeLabel)
5353

5454
shouldPatch := false
5555
for k, v := range labels {

nodeup/pkg/model/channels.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ type ChannelsBuilder struct {
4646
var _ fi.NodeupModelBuilder = &ChannelsBuilder{}
4747

4848
func (b *ChannelsBuilder) Build(c *fi.NodeupModelBuilderContext) error {
49-
if !b.IsMaster && !b.HasAPIServer {
49+
if !b.IsMaster && !b.HasAPIServer { // TODO Fix me, only include API Server if not control plane.
5050
return nil
5151
}
5252

pkg/model/components/channels/model.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"k8s.io/kops/pkg/k8scodecs"
3131
"k8s.io/kops/pkg/kubemanifest"
3232
"k8s.io/kops/pkg/model"
33+
"k8s.io/kops/pkg/nodelabels"
3334
"k8s.io/kops/pkg/wellknownports"
3435
"k8s.io/kops/pkg/wellknownusers"
3536
"k8s.io/kops/upup/pkg/fi"
@@ -100,6 +101,7 @@ func (b *ChannelsBuilder) channelList() ([]string, error) {
100101

101102
func (b *ChannelsBuilder) buildPod(channels []string) (*v1.Pod, error) {
102103
image := b.AssetBuilder.RemapImage("registry.k8s.io/kops/channels:" + kopsroot.KopsVersionImageTag())
104+
// image = "gcr.io/wfender-dev-20240625/kops/channels:1.37.0-alpha.1"
103105

104106
pod := &v1.Pod{
105107
TypeMeta: metav1.TypeMeta{
@@ -121,11 +123,24 @@ func (b *ChannelsBuilder) buildPod(channels []string) (*v1.Pod, error) {
121123
},
122124
}
123125

126+
// Kops Clusters with a ControlPlane nodes will run kops-channel there
127+
// For those clusters we should label the cluster with the control plane label
128+
// For Split Control Plane clusters we run kops-channel on the APIServer node.
129+
// For those clusters we should label the cluster with the KOPS apiserver label
130+
nodeLabel := nodelabels.RoleLabelKopsAPIServer
131+
for _, ig := range b.AllInstanceGroups {
132+
if ig.IsControlPlane() {
133+
nodeLabel = nodelabels.RoleLabelControlPlane20
134+
break
135+
}
136+
}
137+
124138
args := []string{
125139
"apply", "channel",
126140
"--v=4",
127141
"--yes",
128142
"--interval=" + channelsInterval.String(),
143+
"--node-label=" + nodeLabel,
129144
"--node-name=$(NODE_NAME)",
130145
}
131146
args = append(args, channels...)

pkg/nodelabels/builder.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,15 @@ import (
2626

2727
const (
2828
RoleLabelAPIServer16 = "node-role.kubernetes.io/api-server"
29+
RoleLabelKopsAPIServer = "kops.k8s.io/node-api-server"
2930
RoleLabelNode16 = "node-role.kubernetes.io/node"
31+
RoleLabelKopsNode = "kops.k8s.io/node-node"
3032
RoleLabelEtcd = "node-role.kubernetes.io/etcd"
33+
RoleLabelKopsEtcd = "kops.k8s.io/node-etcd"
3134
RoleLabelScheduler = "node-role.kubernetes.io/scheduler"
35+
RoleLabelKopsScheduler = "kops.k8s.io/node-scheduler"
3236
RoleLabelKubeControllerManager = "node-role.kubernetes.io/kube-controller-manager"
37+
RoleLabelKopsKCM = "kops.k8s.io/node-kube-controller-manager"
3338

3439
RoleLabelControlPlane20 = "node-role.kubernetes.io/control-plane"
3540
)
@@ -64,7 +69,7 @@ func BuildNodeLabels(cluster *api.Cluster, instanceGroup *api.InstanceGroup) (ma
6469

6570
// Merge KubeletConfig for NodeLabels
6671
c := &api.KubeletConfigSpec{}
67-
if isControlPlane {
72+
if instanceGroup.Spec.Role.IsControlPlaneType() {
6873
reflectutils.JSONMergeStruct(c, cluster.Spec.ControlPlaneKubelet)
6974
} else {
7075
reflectutils.JSONMergeStruct(c, cluster.Spec.Kubelet)
@@ -84,8 +89,9 @@ func BuildNodeLabels(cluster *api.Cluster, instanceGroup *api.InstanceGroup) (ma
8489
// We keep the featureflag as a placeholder to change the logic;
8590
// when we drop the featureflag we should just always include the label, even for
8691
// full control-plane nodes.
87-
if isAPIServer || featureflag.APIServerNodes.Enabled() {
92+
if isAPIServer && featureflag.APIServerNodes.Enabled() {
8893
nodeLabels[RoleLabelAPIServer16] = ""
94+
nodeLabels[RoleLabelKopsAPIServer] = ""
8995
nodeLabels["kops.k8s.io/kops-controller-pki"] = ""
9096
}
9197
}
@@ -95,37 +101,38 @@ func BuildNodeLabels(cluster *api.Cluster, instanceGroup *api.InstanceGroup) (ma
95101
nodeLabels = make(map[string]string)
96102
}
97103
nodeLabels[RoleLabelNode16] = ""
104+
nodeLabels[RoleLabelKopsNode] = ""
98105
}
99106

100107
if isEtcd {
101108
if nodeLabels == nil {
102109
nodeLabels = make(map[string]string)
103110
}
104111
nodeLabels[RoleLabelEtcd] = ""
105-
nodeLabels[RoleLabelControlPlane20] = ""
112+
nodeLabels[RoleLabelKopsEtcd] = ""
106113
}
107114

108115
if isScheduler {
109116
if nodeLabels == nil {
110117
nodeLabels = make(map[string]string)
111118
}
112119
nodeLabels[RoleLabelScheduler] = ""
113-
nodeLabels[RoleLabelControlPlane20] = ""
120+
nodeLabels[RoleLabelKopsScheduler] = ""
114121
}
115122

116123
if isKubeControllerManager {
117124
if nodeLabels == nil {
118125
nodeLabels = make(map[string]string)
119126
}
120127
nodeLabels[RoleLabelKubeControllerManager] = ""
121-
nodeLabels[RoleLabelControlPlane20] = ""
128+
nodeLabels[RoleLabelKopsKCM] = ""
122129
}
123130

124131
if isControlPlane {
125132
if nodeLabels == nil {
126133
nodeLabels = make(map[string]string)
127134
}
128-
for label, value := range BuildMandatoryControlPlaneLabels() {
135+
for label, value := range BuildMandatoryControlPlaneLabels(RoleLabelControlPlane20) {
129136
nodeLabels[label] = value
130137
}
131138
}
@@ -141,9 +148,13 @@ func BuildNodeLabels(cluster *api.Cluster, instanceGroup *api.InstanceGroup) (ma
141148
}
142149

143150
// BuildMandatoryControlPlaneLabels returns the list of labels all CP nodes must have
144-
func BuildMandatoryControlPlaneLabels() map[string]string {
151+
func BuildMandatoryControlPlaneLabels(nodeLabel string) map[string]string {
145152
nodeLabels := make(map[string]string)
146-
nodeLabels[RoleLabelControlPlane20] = ""
153+
if nodeLabel == "" {
154+
nodeLabels[RoleLabelControlPlane20] = ""
155+
} else {
156+
nodeLabels[nodeLabel] = ""
157+
}
147158
nodeLabels["kops.k8s.io/kops-controller-pki"] = ""
148159
nodeLabels["node.kubernetes.io/exclude-from-external-load-balancers"] = ""
149160
return nodeLabels

upup/models/cloudup/resources/addons/gcp-cloud-controller.addons.k8s.io/k8s-1.23.yaml.template

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ spec:
2323
nodeAffinity:
2424
requiredDuringSchedulingIgnoredDuringExecution:
2525
nodeSelectorTerms:
26+
- matchExpressions:
27+
- key: kops.k8s.io/node-api-server
28+
operator: Exists
2629
- matchExpressions:
2730
- key: node-role.kubernetes.io/control-plane
2831
operator: Exists

upup/models/cloudup/resources/addons/kops-controller.addons.k8s.io/k8s-1.16.yaml.template

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ spec:
3939
nodeAffinity:
4040
requiredDuringSchedulingIgnoredDuringExecution:
4141
nodeSelectorTerms:
42+
- matchExpressions:
43+
- key: kops.k8s.io/node-api-server
44+
operator: Exists
4245
- matchExpressions:
4346
- key: node-role.kubernetes.io/control-plane
4447
operator: Exists

upup/pkg/fi/cloudup/tests/bootstrapchannelbuilder/simple/kops-controller.addons.k8s.io-k8s-1.16.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ spec:
4242
nodeAffinity:
4343
requiredDuringSchedulingIgnoredDuringExecution:
4444
nodeSelectorTerms:
45+
- matchExpressions:
46+
- key: kops.k8s.io/node-api-server
47+
operator: Exists
4548
- matchExpressions:
4649
- key: node-role.kubernetes.io/control-plane
4750
operator: Exists

0 commit comments

Comments
 (0)