Skip to content

Commit d5b210f

Browse files
committed
feat: add arbiter node role assets and logic
added arbiter node role assets that mirror master, this will be changed before GA added logic to handle arbiter node assets only when arbiter node is explicitly defined Signed-off-by: ehila <ehila@redhat.com>
1 parent d7e345b commit d5b210f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1581
-8
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: machineconfiguration.openshift.io/v1
2+
kind: MachineConfigPool
3+
metadata:
4+
name: arbiter
5+
labels:
6+
"operator.machineconfiguration.openshift.io/required-for-upgrade": ""
7+
"machineconfiguration.openshift.io/mco-built-in": ""
8+
"pools.operator.machineconfiguration.openshift.io/arbiter": ""
9+
spec:
10+
machineConfigSelector:
11+
matchLabels:
12+
"machineconfiguration.openshift.io/role": "arbiter"
13+
nodeSelector:
14+
matchLabels:
15+
node-role.kubernetes.io/arbiter: ""

manifests/machineconfigcontroller/custom-machine-config-pool-selector-validatingadmissionpolicy.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ spec:
2222
(object.spec.machineConfigSelector.matchLabels["machineconfiguration.openshift.io/role"] == "master")
2323
||
2424
(object.spec.machineConfigSelector.matchLabels["machineconfiguration.openshift.io/role"] == "worker")
25+
||
26+
(object.spec.machineConfigSelector.matchLabels["machineconfiguration.openshift.io/role"] == "arbiter")
2527
)
2628
)
2729
||

pkg/controller/common/constants.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ const (
5252
// APIServerInstanceName is a singleton name for APIServer configuration
5353
APIServerBootstrapFileLocation = "/etc/mcs/bootstrap/api-server/api-server.yaml"
5454

55+
// MachineConfigPoolArbiter is the MachineConfigPool name given to the arbiter
56+
MachineConfigPoolArbiter = "arbiter"
57+
5558
// MachineConfigPoolMaster is the MachineConfigPool name given to the master
5659
MachineConfigPoolMaster = "master"
5760

pkg/controller/kubelet-config/kubelet_config_nodes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func (ctrl *Controller) syncNodeConfigHandler(key string) error {
133133
}
134134
}
135135
// The following code updates the MC with the relevant CGroups version
136-
if role == ctrlcommon.MachineConfigPoolWorker || role == ctrlcommon.MachineConfigPoolMaster {
136+
if role == ctrlcommon.MachineConfigPoolWorker || role == ctrlcommon.MachineConfigPoolMaster || role == ctrlcommon.MachineConfigPoolArbiter {
137137
err = updateMachineConfigwithCgroup(nodeConfig, mc)
138138
if err != nil {
139139
return err

pkg/controller/template/render.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ func generateTemplateMachineConfigs(config *RenderConfig, templateDir string) ([
8080
continue
8181
}
8282

83+
// Avoid creating resources for non arbiter deployments
84+
if role == "arbiter" && config.Infra.Status.ControlPlaneTopology != configv1.HighlyAvailableArbiterMode {
85+
continue
86+
}
87+
8388
roleConfigs, err := GenerateMachineConfigsForRole(config, role, templateDir)
8489
if err != nil {
8590
return nil, fmt.Errorf("failed to create MachineConfig for role %s: %w", role, err)
@@ -102,7 +107,7 @@ func generateTemplateMachineConfigs(config *RenderConfig, templateDir string) ([
102107
func GenerateMachineConfigsForRole(config *RenderConfig, role, templateDir string) ([]*mcfgv1.MachineConfig, error) {
103108
rolePath := role
104109
//nolint:goconst
105-
if role != "worker" && role != "master" {
110+
if role != "worker" && role != "master" && role != "arbiter" {
106111
// custom pools are only allowed to be worker's children
107112
// and can reuse the worker templates
108113
rolePath = "worker"

pkg/controller/template/render_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ var (
203203
configs = map[string]string{
204204
"aws": "./test_data/controller_config_aws.yaml",
205205
"baremetal": "./test_data/controller_config_baremetal.yaml",
206+
"baremetal-arbiter": "./test_data/controller_config_baremetal_arbiter.yaml",
206207
"gcp": "./test_data/controller_config_gcp.yaml",
207208
"openstack": "./test_data/controller_config_openstack.yaml",
208209
"libvirt": "./test_data/controller_config_libvirt.yaml",
@@ -303,6 +304,18 @@ func TestGenerateMachineConfigs(t *testing.T) {
303304
foundMTUMigrationWorker = findIgnFile(ign.Storage.Files, "/usr/local/bin/mtu-migration.sh", t)
304305
foundMTUMigrationWorker = foundMTUMigrationWorker || findIgnFile(ign.Storage.Files, "/etc/systemd/system/mtu-migration.service", t)
305306
}
307+
} else if role == "arbiter" {
308+
// arbiter role currently follows master output
309+
if !foundPullSecretMaster {
310+
foundPullSecretMaster = findIgnFile(ign.Storage.Files, "/var/lib/kubelet/config.json", t)
311+
}
312+
if !foundKubeletUnitMaster {
313+
foundKubeletUnitMaster = findIgnUnit(ign.Systemd.Units, "kubelet.service", t)
314+
}
315+
if !foundMTUMigrationMaster {
316+
foundMTUMigrationMaster = findIgnFile(ign.Storage.Files, "/usr/local/bin/mtu-migration.sh", t)
317+
foundMTUMigrationMaster = foundMTUMigrationMaster || findIgnFile(ign.Storage.Files, "/etc/systemd/system/mtu-migration.service", t)
318+
}
306319
} else {
307320
t.Fatalf("Unknown role %s", role)
308321
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
apiVersion: "machineconfigurations.openshift.io/v1"
2+
kind: "ControllerConfig"
3+
spec:
4+
clusterDNSIP: "10.3.0.10"
5+
cloudProviderConfig: ""
6+
etcdInitialCount: 3
7+
etcdCAData: ZHVtbXkgZXRjZC1jYQo=
8+
rootCAData: ZHVtbXkgcm9vdC1jYQo=
9+
pullSecret:
10+
data: ZHVtbXkgZXRjZC1jYQo=
11+
images:
12+
etcd: image/etcd:1
13+
setupEtcdEnv: image/setupEtcdEnv:1
14+
infraImage: image/infraImage:1
15+
kubeClientAgentImage: image/kubeClientAgentImage:1
16+
infra:
17+
apiVersion: config.openshift.io/v1
18+
kind: Infrastructure
19+
spec:
20+
cloudConfig:
21+
key: config
22+
name: cloud-provider-config
23+
status:
24+
apiServerInternalURI: https://api-int.my-test-cluster.installer.team.coreos.systems:6443
25+
apiServerURL: https://api.my-test-cluster.installer.team.coreos.systems:6443
26+
etcdDiscoveryDomain: my-test-cluster.installer.team.coreos.systems
27+
infrastructureName: my-test-cluster
28+
controlPlaneTopology: HighlyAvailableArbiter
29+
platformStatus:
30+
type: "BareMetal"
31+
baremetal:
32+
apiServerInternalIP: 10.0.0.1
33+
ingressIP: 10.0.0.2
34+
nodeDNSIP: 10.0.0.3
35+
dns:
36+
spec:
37+
baseDomain: my-test-cluster.installer.team.coreos.systems

pkg/daemon/daemon.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2728,6 +2728,8 @@ func (dn *Daemon) getControlPlaneTopology() configv1.TopologyMode {
27282728
return configv1.SingleReplicaTopologyMode
27292729
case configv1.HighlyAvailableTopologyMode:
27302730
return configv1.HighlyAvailableTopologyMode
2731+
case configv1.HighlyAvailableArbiterMode:
2732+
return configv1.HighlyAvailableArbiterMode
27312733
default:
27322734
// for any unhandled case, default to HighlyAvailableTopologyMode
27332735
return configv1.HighlyAvailableTopologyMode

pkg/operator/bootstrap.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func RenderBootstrap(
155155
templatectrl.KubeRbacProxyKey: imgs.KubeRbacProxy,
156156
}
157157

158-
config := getRenderConfig("", string(filesData[kubeAPIServerServingCA]), spec, &imgs.RenderConfigImages, infra.Status.APIServerInternalURL, nil, []*mcfgv1alpha1.MachineOSConfig{}, nil)
158+
config := getRenderConfig("", string(filesData[kubeAPIServerServingCA]), spec, &imgs.RenderConfigImages, infra, nil, []*mcfgv1alpha1.MachineOSConfig{}, nil)
159159

160160
manifests := []manifest{
161161
{
@@ -182,6 +182,13 @@ func RenderBootstrap(
182182
},
183183
}
184184

185+
if infra.Status.ControlPlaneTopology == configv1.HighlyAvailableArbiterMode {
186+
manifests = append(manifests, manifest{
187+
name: "manifests/arbiter.machineconfigpool.yaml",
188+
filename: "bootstrap/manifests/arbiter.machineconfigpool.yaml",
189+
})
190+
}
191+
185192
manifests = appendManifestsByPlatform(manifests, *infra)
186193

187194
for _, m := range manifests {

pkg/operator/sync.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -641,9 +641,9 @@ func (optr *Operator) syncRenderConfig(_ *renderConfig, _ *configv1.ClusterOpera
641641
}
642642

643643
// create renderConfig
644-
optr.renderConfig = getRenderConfig(optr.namespace, string(kubeAPIServerServingCABytes), spec, &imgs.RenderConfigImages, infra.Status.APIServerInternalURL, pointerConfigData, moscs, apiServer)
644+
optr.renderConfig = getRenderConfig(optr.namespace, string(kubeAPIServerServingCABytes), spec, &imgs.RenderConfigImages, infra, pointerConfigData, moscs, apiServer)
645645
} else {
646-
optr.renderConfig = getRenderConfig(optr.namespace, string(kubeAPIServerServingCABytes), spec, &imgs.RenderConfigImages, infra.Status.APIServerInternalURL, pointerConfigData, nil, apiServer)
646+
optr.renderConfig = getRenderConfig(optr.namespace, string(kubeAPIServerServingCABytes), spec, &imgs.RenderConfigImages, infra, pointerConfigData, nil, apiServer)
647647
}
648648

649649
return nil
@@ -682,6 +682,11 @@ func (optr *Operator) syncMachineConfigPools(config *renderConfig, _ *configv1.C
682682
"manifests/master.machineconfigpool.yaml",
683683
"manifests/worker.machineconfigpool.yaml",
684684
}
685+
686+
if config.Infra.Status.ControlPlaneTopology == configv1.HighlyAvailableArbiterMode {
687+
mcps = append(mcps, "manifests/arbiter.machineconfigpool.yaml")
688+
}
689+
685690
for _, mcp := range mcps {
686691
mcpBytes, err := renderAsset(config, mcp)
687692
if err != nil {
@@ -778,6 +783,8 @@ func (optr *Operator) syncMachineConfigNodes(_ *renderConfig, _ *configv1.Cluste
778783
pool = "worker"
779784
} else if _, ok = node.Labels["node-role.kubernetes.io/master"]; ok {
780785
pool = "master"
786+
} else if _, ok = node.Labels["node-role.kubernetes.io/arbiter"]; ok {
787+
pool = "arbiter"
781788
}
782789
newMCS := &v1alpha1.MachineConfigNode{
783790
Spec: v1alpha1.MachineConfigNodeSpec{
@@ -2035,7 +2042,7 @@ func setGVK(obj runtime.Object, scheme *runtime.Scheme) error {
20352042
return nil
20362043
}
20372044

2038-
func getRenderConfig(tnamespace, kubeAPIServerServingCA string, ccSpec *mcfgv1.ControllerConfigSpec, imgs *ctrlcommon.RenderConfigImages, apiServerURL string, pointerConfigData []byte, moscs []*mcfgv1alpha1.MachineOSConfig, apiServer *configv1.APIServer) *renderConfig {
2045+
func getRenderConfig(tnamespace, kubeAPIServerServingCA string, ccSpec *mcfgv1.ControllerConfigSpec, imgs *ctrlcommon.RenderConfigImages, infra *configv1.Infrastructure, pointerConfigData []byte, moscs []*mcfgv1alpha1.MachineOSConfig, apiServer *configv1.APIServer) *renderConfig {
20392046
tlsMinVersion, tlsCipherSuites := ctrlcommon.GetSecurityProfileCiphersFromAPIServer(apiServer)
20402047
return &renderConfig{
20412048
TargetNamespace: tnamespace,
@@ -2044,8 +2051,9 @@ func getRenderConfig(tnamespace, kubeAPIServerServingCA string, ccSpec *mcfgv1.C
20442051
ControllerConfig: *ccSpec,
20452052
Images: imgs,
20462053
KubeAPIServerServingCA: kubeAPIServerServingCA,
2047-
APIServerURL: apiServerURL,
2054+
APIServerURL: infra.Status.APIServerInternalURL,
20482055
PointerConfig: string(pointerConfigData),
2056+
Infra: *infra,
20492057
MachineOSConfigs: moscs,
20502058
TLSMinVersion: tlsMinVersion,
20512059
TLSCipherSuites: tlsCipherSuites,

0 commit comments

Comments
 (0)