Skip to content

Commit a99a585

Browse files
committed
Switched new kops role to be about workload not destination.
Fixed image rewrite to work for all of control plane. Fixed docs to reflect changes. Fixed role direct equality check.
1 parent 7f3fea2 commit a99a585

12 files changed

Lines changed: 29 additions & 31 deletions

File tree

channels/pkg/cmd/apply_channel.go

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

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

5252
func NewCmdApplyChannel(f *ChannelsFactory, out io.Writer) *cobra.Command {
@@ -68,7 +68,7 @@ func NewCmdApplyChannel(f *ChannelsFactory, out io.Writer) *cobra.Command {
6868
cmd.Flags().BoolVar(&options.Yes, "yes", false, "Apply update")
6969
cmd.Flags().DurationVar(&options.Interval, "interval", 0, "If non-zero, re-apply the channel on this interval until interrupted (e.g. 60s)")
7070
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.")
71+
cmd.Flags().StringVar(&options.NodeLabels, "node-labels", "", "If set, patch the named node with each of the labels each iteration; typically supplied via the downward API.")
7272

7373
return cmd
7474
}
@@ -82,7 +82,7 @@ func runApplyChannelIteration(ctx context.Context, f *ChannelsFactory, out io.Wr
8282
labelerClient, err := f.KubernetesClient()
8383
if err != nil {
8484
merr = multierr.Append(merr, fmt.Errorf("building kubernetes client for node labeler: %w", err))
85-
} else if err := nodelabeler.BootstrapControlPlaneNodeLabels(ctx, labelerClient, options.NodeName, options.NodeLabel); err != nil {
85+
} else if err := nodelabeler.BootstrapControlPlaneNodeLabels(ctx, labelerClient, options.NodeName, options.NodeLabels); err != nil {
8686
merr = multierr.Append(merr, fmt.Errorf("bootstrapping node labels: %w", err))
8787
}
8888
}

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, nodeLabel string) error {
41+
func BootstrapControlPlaneNodeLabels(ctx context.Context, client kubernetes.Interface, nodeName string, nodeLabels 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(nodeLabel)
52+
labels := nodelabels.BuildMandatoryControlPlaneLabels(nodeLabels)
5353

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

docs/cli/kops_rolling-update_cluster.md

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/cli/kops_update_cluster.md

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/apis/kops/validation/instancegroup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ func validateKarpenterInstanceGroup(g *kops.InstanceGroup, cluster *kops.Cluster
333333
if cluster.GetCloudProvider() != kops.CloudProviderAWS {
334334
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "manager"), "Karpenter InstanceGroups are only supported on AWS"))
335335
}
336-
if g.Spec.Role != kops.InstanceGroupRoleNode {
336+
if g.Spec.Role.HasNode() {
337337
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "role"), "Karpenter InstanceGroups must have role Node"))
338338
}
339339
if g.Spec.MaxSize != nil && *g.Spec.MaxSize <= 0 {

pkg/model/components/channels/model.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (b *ChannelsBuilder) buildPod(channels []string) (*v1.Pod, error) {
127127
// For those clusters we should label the cluster with the control plane label
128128
// For Split Control Plane clusters we run kops-channel on the APIServer node.
129129
// For those clusters we should label the cluster with the KOPS apiserver label
130-
nodeLabel := nodelabels.RoleLabelKopsAPIServer
130+
nodeLabel := nodelabels.RoleLabelKopsCCM + "," + nodelabels.RoleLabelKopsChannel
131131
for _, ig := range b.AllInstanceGroups {
132132
if ig.IsControlPlane() {
133133
nodeLabel = nodelabels.RoleLabelControlPlane20
@@ -140,7 +140,7 @@ func (b *ChannelsBuilder) buildPod(channels []string) (*v1.Pod, error) {
140140
"--v=4",
141141
"--yes",
142142
"--interval=" + channelsInterval.String(),
143-
"--node-label=" + nodeLabel,
143+
"--node-labels=" + nodeLabel,
144144
"--node-name=$(NODE_NAME)",
145145
}
146146
args = append(args, channels...)

pkg/nodelabels/builder.go

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package nodelabels
1818

1919
import (
2020
"fmt"
21+
"strings"
2122

2223
api "k8s.io/kops/pkg/apis/kops"
2324
"k8s.io/kops/pkg/featureflag"
@@ -26,15 +27,13 @@ import (
2627

2728
const (
2829
RoleLabelAPIServer16 = "node-role.kubernetes.io/api-server"
29-
RoleLabelKopsAPIServer = "kops.k8s.io/node-api-server"
3030
RoleLabelNode16 = "node-role.kubernetes.io/node"
31-
RoleLabelKopsNode = "kops.k8s.io/node-node"
3231
RoleLabelEtcd = "node-role.kubernetes.io/etcd"
33-
RoleLabelKopsEtcd = "kops.k8s.io/node-etcd"
3432
RoleLabelScheduler = "node-role.kubernetes.io/scheduler"
35-
RoleLabelKopsScheduler = "kops.k8s.io/node-scheduler"
3633
RoleLabelKubeControllerManager = "node-role.kubernetes.io/kube-controller-manager"
37-
RoleLabelKopsKCM = "kops.k8s.io/node-kube-controller-manager"
34+
35+
RoleLabelKopsCCM = "kops.k8s.io/cloud-controller-manager"
36+
RoleLabelKopsChannel = "kops.k8s.io/kops-channel"
3837

3938
RoleLabelControlPlane20 = "node-role.kubernetes.io/control-plane"
4039
)
@@ -91,7 +90,6 @@ func BuildNodeLabels(cluster *api.Cluster, instanceGroup *api.InstanceGroup) (ma
9190
// full control-plane nodes.
9291
if isAPIServer && featureflag.APIServerNodes.Enabled() {
9392
nodeLabels[RoleLabelAPIServer16] = ""
94-
nodeLabels[RoleLabelKopsAPIServer] = ""
9593
nodeLabels["kops.k8s.io/kops-controller-pki"] = ""
9694
}
9795
}
@@ -101,31 +99,27 @@ func BuildNodeLabels(cluster *api.Cluster, instanceGroup *api.InstanceGroup) (ma
10199
nodeLabels = make(map[string]string)
102100
}
103101
nodeLabels[RoleLabelNode16] = ""
104-
nodeLabels[RoleLabelKopsNode] = ""
105102
}
106103

107104
if isEtcd {
108105
if nodeLabels == nil {
109106
nodeLabels = make(map[string]string)
110107
}
111108
nodeLabels[RoleLabelEtcd] = ""
112-
nodeLabels[RoleLabelKopsEtcd] = ""
113109
}
114110

115111
if isScheduler {
116112
if nodeLabels == nil {
117113
nodeLabels = make(map[string]string)
118114
}
119115
nodeLabels[RoleLabelScheduler] = ""
120-
nodeLabels[RoleLabelKopsScheduler] = ""
121116
}
122117

123118
if isKubeControllerManager {
124119
if nodeLabels == nil {
125120
nodeLabels = make(map[string]string)
126121
}
127122
nodeLabels[RoleLabelKubeControllerManager] = ""
128-
nodeLabels[RoleLabelKopsKCM] = ""
129123
}
130124

131125
if isControlPlane {
@@ -148,12 +142,15 @@ func BuildNodeLabels(cluster *api.Cluster, instanceGroup *api.InstanceGroup) (ma
148142
}
149143

150144
// BuildMandatoryControlPlaneLabels returns the list of labels all CP nodes must have
151-
func BuildMandatoryControlPlaneLabels(nodeLabel string) map[string]string {
145+
func BuildMandatoryControlPlaneLabels(baseLabels string) map[string]string {
152146
nodeLabels := make(map[string]string)
153-
if nodeLabel == "" {
147+
if baseLabels == "" {
154148
nodeLabels[RoleLabelControlPlane20] = ""
155149
} else {
156-
nodeLabels[nodeLabel] = ""
150+
labels := strings.Split(baseLabels, ",")
151+
for _, label := range labels {
152+
nodeLabels[label] = ""
153+
}
157154
}
158155
nodeLabels["kops.k8s.io/kops-controller-pki"] = ""
159156
nodeLabels["node.kubernetes.io/exclude-from-external-load-balancers"] = ""

pkg/nodemodel/nodeupconfigbuilder.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ func NewNodeUpConfigBuilder(cluster *kops.Cluster, assetBuilder *assets.AssetBui
7474
}
7575

7676
for _, role := range kops.AllInstanceGroupRoles {
77+
isControlPlaneType := role.IsControlPlaneType()
7778
isMaster := role.HasControlPlane()
7879
isAPIServer := role.HasAPIServer()
7980
isEtcd := role.HasEtcd()
@@ -119,7 +120,7 @@ func NewNodeUpConfigBuilder(cluster *kops.Cluster, assetBuilder *assets.AssetBui
119120

120121
// `docker load` our images when using a KOPS_BASE_URL, so we
121122
// don't need to push/pull from a registry
122-
if os.Getenv("KOPS_BASE_URL") != "" && isMaster {
123+
if os.Getenv("KOPS_BASE_URL") != "" && isControlPlaneType {
123124
for _, arch := range architectures.GetSupported() {
124125
for _, name := range []string{"kops-utils-cp", "kops-controller", "kops-channels", "dns-controller", "kube-apiserver-healthcheck"} {
125126
baseURL, err := url.Parse(os.Getenv("KOPS_BASE_URL"))

pkg/validation/validate_cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ func (v *clusterValidatorImpl) Validate(ctx context.Context) (*ValidationCluster
195195
if v.maxUnreadyNodes > 0 {
196196
var notReadyWorkerNodes []string
197197
for _, cloudGroup := range cloudGroups {
198-
if cloudGroup.InstanceGroup != nil && cloudGroup.InstanceGroup.Spec.Role == kops.InstanceGroupRoleNode {
198+
if cloudGroup.InstanceGroup != nil && cloudGroup.InstanceGroup.Spec.Role.HasNode() {
199199
var allMembers []*cloudinstances.CloudInstance
200200
allMembers = append(allMembers, cloudGroup.Ready...)
201201
allMembers = append(allMembers, cloudGroup.NeedUpdate...)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ spec:
2424
requiredDuringSchedulingIgnoredDuringExecution:
2525
nodeSelectorTerms:
2626
- matchExpressions:
27-
- key: kops.k8s.io/node-api-server
27+
- key: kops.k8s.io/cloud-controller-manager
2828
operator: Exists
2929
- matchExpressions:
3030
- key: node-role.kubernetes.io/control-plane

0 commit comments

Comments
 (0)