Skip to content

Commit 91b88f7

Browse files
committed
feat: support multiple values for extraArgs
BREAKING: internal resources for the components use different representation of AxtraArgs, resulting in modified types in protocol buffers. Signed-off-by: Mateusz Urbanek <mateusz.urbanek.98@gmail.com>
1 parent 96e6048 commit 91b88f7

Some content is hidden

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

50 files changed

+1740
-834
lines changed

api/lock.binpb

383 Bytes
Binary file not shown.

api/resource/definitions/etcd/etcd.proto

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@ option java_package = "dev.talos.api.resource.definitions.etcd";
77

88
import "common/common.proto";
99

10+
// ArgValues represents values for a command line argument which can be specified multiple times.
11+
message ArgValues {
12+
repeated string values = 1;
13+
}
14+
1015
// ConfigSpec describes (some) configuration settings of etcd.
1116
message ConfigSpec {
1217
repeated string advertise_valid_subnets = 1;
1318
repeated string advertise_exclude_subnets = 2;
1419
string image = 3;
15-
map<string, string> extra_args = 4;
20+
map<string, ArgValues> extra_args = 4;
1621
repeated string listen_valid_subnets = 5;
1722
repeated string listen_exclude_subnets = 6;
1823
}
@@ -33,7 +38,7 @@ message SpecSpec {
3338
string name = 1;
3439
repeated common.NetIP advertised_addresses = 2;
3540
string image = 3;
36-
map<string, string> extra_args = 4;
41+
map<string, ArgValues> extra_args = 4;
3742
repeated common.NetIP listen_peer_addresses = 5;
3843
repeated common.NetIP listen_client_addresses = 6;
3944
}

api/resource/definitions/k8s/k8s.proto

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ message APIServerConfigSpec {
1717
repeated string etcd_servers = 4;
1818
int64 local_port = 5;
1919
repeated string service_cid_rs = 6;
20-
map<string, string> extra_args = 7;
20+
map<string, ArgValues> extra_args = 7;
2121
repeated ExtraVolume extra_volumes = 8;
2222
map<string, string> environment_variables = 9;
2323
string advertised_address = 11;
@@ -35,6 +35,11 @@ message AdmissionPluginSpec {
3535
google.protobuf.Struct configuration = 2;
3636
}
3737

38+
// ArgValues represents values for a command line argument which can be specified multiple times.
39+
message ArgValues {
40+
repeated string values = 1;
41+
}
42+
3843
// AuditPolicyConfigSpec is audit policy configuration for kube-apiserver.
3944
message AuditPolicyConfigSpec {
4045
google.protobuf.Struct config = 1;
@@ -87,7 +92,7 @@ message ControllerManagerConfigSpec {
8792
string cloud_provider = 3;
8893
repeated string pod_cid_rs = 4;
8994
repeated string service_cid_rs = 5;
90-
map<string, string> extra_args = 6;
95+
map<string, ArgValues> extra_args = 6;
9196
repeated ExtraVolume extra_volumes = 7;
9297
map<string, string> environment_variables = 8;
9398
Resources resources = 9;
@@ -150,7 +155,7 @@ message KubeletConfigSpec {
150155
string image = 1;
151156
repeated string cluster_dns = 2;
152157
string cluster_domain = 3;
153-
map<string, string> extra_args = 4;
158+
map<string, ArgValues> extra_args = 4;
154159
repeated talos.resource.definitions.proto.Mount extra_mounts = 5;
155160
google.protobuf.Struct extra_config = 6;
156161
bool cloud_provider_external = 7;
@@ -239,7 +244,7 @@ message Resources {
239244
message SchedulerConfigSpec {
240245
bool enabled = 1;
241246
string image = 2;
242-
map<string, string> extra_args = 3;
247+
map<string, ArgValues> extra_args = 3;
243248
repeated ExtraVolume extra_volumes = 4;
244249
map<string, string> environment_variables = 5;
245250
Resources resources = 6;

hack/release.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ A new `KubeSpanConfig` document has been introduced to configure KubeSpan settin
127127
It replaces and deprecates the previous method of configuring KubeSpan via the `.machine.network.kubespan` field.
128128
129129
The old configuration field will continue to work for backward compatibility.
130+
"""
131+
132+
[notes.extraArgs]
133+
title = "Extra Arguments accept slices in addition to strings"
134+
description = """\
135+
Several Talos configuration fields that previously accepted single string values for extra arguments have been updated to accept slices of strings as well.
136+
This includes fields such as `.cluster.apiServer.extraArgs`.
137+
138+
BREAKING: If you were relying on the resources EtcdConfigs, KubeletConfigs, ControllerManagerConfigs, SchedulerConfigs or APIServerConfigs, the protobuf format has changed from `map<string,string>` to `map<string,message>`.
130139
"""
131140

132141
[make_deps]

internal/app/machined/pkg/controllers/etcd/config.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
type ConfigController = transform.Controller[*config.MachineConfig, *etcd.Config]
2121

2222
// NewConfigController instanciates the config controller.
23+
//
24+
//nolint:gocyclo
2325
func NewConfigController() *ConfigController {
2426
return transform.NewController(
2527
transform.Settings[*config.MachineConfig, *etcd.Config]{
@@ -64,7 +66,14 @@ func NewConfigController() *ConfigController {
6466
}
6567

6668
cfg.TypedSpec().Image = machineConfig.Config().Cluster().Etcd().Image()
67-
cfg.TypedSpec().ExtraArgs = machineConfig.Config().Cluster().Etcd().ExtraArgs()
69+
70+
extraArgs := make(map[string]etcd.ArgValues, len(machineConfig.Config().Cluster().Etcd().ExtraArgs()))
71+
72+
for k, v := range machineConfig.Config().Cluster().Etcd().ExtraArgs() {
73+
extraArgs[k] = etcd.ArgValues{Values: v}
74+
}
75+
76+
cfg.TypedSpec().ExtraArgs = extraArgs
6877

6978
return nil
7079
},

internal/app/machined/pkg/controllers/etcd/config_test.go

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,24 @@ func (suite *ConfigSuite) TestReconcile() {
5555
},
5656
expectedConfig: etcd.ConfigSpec{
5757
Image: "foo/bar:v1.0.0",
58-
ExtraArgs: map[string]string{},
58+
ExtraArgs: map[string]etcd.ArgValues{},
59+
AdvertiseValidSubnets: nil,
60+
ListenValidSubnets: nil,
61+
},
62+
},
63+
{
64+
name: "extra args config",
65+
etcdConfig: &v1alpha1.EtcdConfig{
66+
ContainerImage: "foo/bar:v1.0.0",
67+
EtcdExtraArgs: v1alpha1.Args{
68+
"foo": v1alpha1.NewArgValue("", []string{"bar", "baz"}),
69+
},
70+
},
71+
expectedConfig: etcd.ConfigSpec{
72+
Image: "foo/bar:v1.0.0",
73+
ExtraArgs: map[string]etcd.ArgValues{
74+
"foo": {Values: []string{"bar", "baz"}},
75+
},
5976
AdvertiseValidSubnets: nil,
6077
ListenValidSubnets: nil,
6178
},
@@ -64,15 +81,15 @@ func (suite *ConfigSuite) TestReconcile() {
6481
name: "legacy subnet",
6582
etcdConfig: &v1alpha1.EtcdConfig{
6683
ContainerImage: "foo/bar:v1.0.0",
67-
EtcdExtraArgs: map[string]string{
68-
"arg": "value",
84+
EtcdExtraArgs: v1alpha1.Args{
85+
"arg": v1alpha1.NewArgValue("value", nil),
6986
},
7087
EtcdSubnet: "10.0.0.0/8",
7188
},
7289
expectedConfig: etcd.ConfigSpec{
7390
Image: "foo/bar:v1.0.0",
74-
ExtraArgs: map[string]string{
75-
"arg": "value",
91+
ExtraArgs: map[string]etcd.ArgValues{
92+
"arg": {Values: []string{"value"}},
7693
},
7794
AdvertiseValidSubnets: []string{"10.0.0.0/8"},
7895
ListenValidSubnets: nil,
@@ -86,7 +103,7 @@ func (suite *ConfigSuite) TestReconcile() {
86103
},
87104
expectedConfig: etcd.ConfigSpec{
88105
Image: "foo/bar:v1.0.0",
89-
ExtraArgs: map[string]string{},
106+
ExtraArgs: map[string]etcd.ArgValues{},
90107
AdvertiseValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
91108
ListenValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
92109
},
@@ -100,7 +117,7 @@ func (suite *ConfigSuite) TestReconcile() {
100117
},
101118
expectedConfig: etcd.ConfigSpec{
102119
Image: "foo/bar:v1.0.0",
103-
ExtraArgs: map[string]string{},
120+
ExtraArgs: map[string]etcd.ArgValues{},
104121
AdvertiseValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
105122
ListenValidSubnets: []string{"10.0.0.0/8"},
106123
},
@@ -120,7 +137,7 @@ func (suite *ConfigSuite) TestReconcile() {
120137
},
121138
expectedConfig: etcd.ConfigSpec{
122139
Image: "foo/bar:v1.0.0",
123-
ExtraArgs: map[string]string{},
140+
ExtraArgs: map[string]etcd.ArgValues{},
124141
AdvertiseValidSubnets: nil,
125142
AdvertiseExcludeSubnets: []string{"10.0.0.4"},
126143
ListenValidSubnets: nil,
@@ -139,7 +156,7 @@ func (suite *ConfigSuite) TestReconcile() {
139156
},
140157
expectedConfig: etcd.ConfigSpec{
141158
Image: "foo/bar:v1.0.0",
142-
ExtraArgs: map[string]string{},
159+
ExtraArgs: map[string]etcd.ArgValues{},
143160
AdvertiseValidSubnets: nil,
144161
AdvertiseExcludeSubnets: []string{"10.0.0.4"},
145162
ListenValidSubnets: nil,
@@ -161,7 +178,7 @@ func (suite *ConfigSuite) TestReconcile() {
161178
},
162179
expectedConfig: etcd.ConfigSpec{
163180
Image: "foo/bar:v1.0.0",
164-
ExtraArgs: map[string]string{},
181+
ExtraArgs: map[string]etcd.ArgValues{},
165182
AdvertiseValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
166183
AdvertiseExcludeSubnets: []string{"10.0.0.4"},
167184
ListenValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
@@ -181,7 +198,7 @@ func (suite *ConfigSuite) TestReconcile() {
181198
},
182199
expectedConfig: etcd.ConfigSpec{
183200
Image: "foo/bar:v1.0.0",
184-
ExtraArgs: map[string]string{},
201+
ExtraArgs: map[string]etcd.ArgValues{},
185202
AdvertiseValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
186203
AdvertiseExcludeSubnets: []string{"10.0.0.4"},
187204
ListenValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},

internal/app/machined/pkg/controllers/etcd/spec_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@ func (suite *SpecSuite) TestReconcile() {
7878
name: "defaults",
7979
cfg: etcd.ConfigSpec{
8080
Image: "foo/bar:v1.0.0",
81-
ExtraArgs: map[string]string{
82-
"arg": "value",
81+
ExtraArgs: map[string]etcd.ArgValues{
82+
"arg": {Values: []string{"value"}},
8383
},
8484
},
8585
expected: etcd.SpecSpec{
8686
Name: "worker1",
8787
Image: "foo/bar:v1.0.0",
88-
ExtraArgs: map[string]string{
89-
"arg": "value",
88+
ExtraArgs: map[string]etcd.ArgValues{
89+
"arg": {Values: []string{"value"}},
9090
},
9191
AdvertisedAddresses: []netip.Addr{
9292
netip.MustParseAddr("10.0.0.5"),

internal/app/machined/pkg/controllers/k8s/control_plane.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,19 @@ func NewControlPlaneAPIServerController() *ControlPlaneAPIServerController {
188188
advertisedAddress = ""
189189
}
190190

191+
extraArgs := make(map[string]k8s.ArgValues, len(cfgProvider.Cluster().APIServer().ExtraArgs()))
192+
for k, v := range cfgProvider.Cluster().APIServer().ExtraArgs() {
193+
extraArgs[k] = k8s.ArgValues{Values: v}
194+
}
195+
191196
*res.TypedSpec() = k8s.APIServerConfigSpec{
192197
Image: cfgProvider.Cluster().APIServer().Image(),
193198
CloudProvider: cloudProvider,
194199
ControlPlaneEndpoint: cfgProvider.Cluster().Endpoint().String(),
195200
EtcdServers: []string{fmt.Sprintf("https://%s", nethelpers.JoinHostPort("127.0.0.1", constants.EtcdClientPort))},
196201
LocalPort: cfgProvider.Cluster().LocalAPIServerPort(),
197202
ServiceCIDRs: cfgProvider.Cluster().Network().ServiceCIDRs(),
198-
ExtraArgs: cfgProvider.Cluster().APIServer().ExtraArgs(),
203+
ExtraArgs: extraArgs,
199204
ExtraVolumes: convertVolumes(cfgProvider.Cluster().APIServer().ExtraVolumes()),
200205
EnvironmentVariables: cfgProvider.Cluster().APIServer().Env(),
201206
AdvertisedAddress: advertisedAddress,
@@ -226,13 +231,18 @@ func NewControlPlaneControllerManagerController() *ControlPlaneControllerManager
226231
cloudProvider = CloudProviderExternal
227232
}
228233

234+
extraArgs := make(map[string]k8s.ArgValues, len(cfgProvider.Cluster().ControllerManager().ExtraArgs()))
235+
for k, v := range cfgProvider.Cluster().ControllerManager().ExtraArgs() {
236+
extraArgs[k] = k8s.ArgValues{Values: v}
237+
}
238+
229239
*res.TypedSpec() = k8s.ControllerManagerConfigSpec{
230240
Enabled: !cfgProvider.Machine().Controlplane().ControllerManager().Disabled(),
231241
Image: cfgProvider.Cluster().ControllerManager().Image(),
232242
CloudProvider: cloudProvider,
233243
PodCIDRs: cfgProvider.Cluster().Network().PodCIDRs(),
234244
ServiceCIDRs: cfgProvider.Cluster().Network().ServiceCIDRs(),
235-
ExtraArgs: cfgProvider.Cluster().ControllerManager().ExtraArgs(),
245+
ExtraArgs: extraArgs,
236246
ExtraVolumes: convertVolumes(cfgProvider.Cluster().ControllerManager().ExtraVolumes()),
237247
EnvironmentVariables: cfgProvider.Cluster().ControllerManager().Env(),
238248
Resources: convertResources(cfgProvider.Cluster().ControllerManager().Resources()),
@@ -256,10 +266,15 @@ func NewControlPlaneSchedulerController() *ControlPlaneSchedulerController {
256266
TransformFunc: func(ctx context.Context, r controller.Reader, logger *zap.Logger, machineConfig *config.MachineConfig, res *k8s.SchedulerConfig) error {
257267
cfgProvider := machineConfig.Config()
258268

269+
extraArgs := make(map[string]k8s.ArgValues, len(cfgProvider.Cluster().Scheduler().ExtraArgs()))
270+
for k, v := range cfgProvider.Cluster().Scheduler().ExtraArgs() {
271+
extraArgs[k] = k8s.ArgValues{Values: v}
272+
}
273+
259274
*res.TypedSpec() = k8s.SchedulerConfigSpec{
260275
Enabled: !cfgProvider.Machine().Controlplane().Scheduler().Disabled(),
261276
Image: cfgProvider.Cluster().Scheduler().Image(),
262-
ExtraArgs: cfgProvider.Cluster().Scheduler().ExtraArgs(),
277+
ExtraArgs: extraArgs,
263278
ExtraVolumes: convertVolumes(cfgProvider.Cluster().Scheduler().ExtraVolumes()),
264279
EnvironmentVariables: cfgProvider.Cluster().Scheduler().Env(),
265280
Resources: convertResources(cfgProvider.Cluster().Scheduler().Resources()),
@@ -469,11 +484,11 @@ func getProxyArgs(cfgProvider talosconfig.Config) ([]string, error) {
469484
}
470485

471486
builder := argsbuilder.Args{
472-
"cluster-cidr": clusterCidr,
473-
"hostname-override": "$(NODE_NAME)",
474-
"kubeconfig": "/etc/kubernetes/kubeconfig",
475-
"proxy-mode": proxyMode,
476-
"conntrack-max-per-core": "0",
487+
"cluster-cidr": {clusterCidr},
488+
"hostname-override": {"$(NODE_NAME)"},
489+
"kubeconfig": {"/etc/kubernetes/kubeconfig"},
490+
"proxy-mode": {proxyMode},
491+
"conntrack-max-per-core": {"0"},
477492
}
478493

479494
policies := argsbuilder.MergePolicies{

0 commit comments

Comments
 (0)