Skip to content

Commit 53a7d8e

Browse files
Fix dual stack installation with cloud provider (#432)
Fixes k0sproject/k0s#2464 --node-ip is incompatible with cloud providers because: kubernetes/kubernetes#95239 Not defining the flag --node-ip if --enable-cloud-provider is defined fixes the issue. In the long term we need to handle the configuration using a KubeletConfiguration file instead of flags. But for now this fixes the issue. Signed-off-by: Juan Luis de Sousa-Valadas Castaño <[email protected]>
1 parent 0e8e8c5 commit 53a7d8e

File tree

7 files changed

+123
-15
lines changed

7 files changed

+123
-15
lines changed

phase/initialize_k0s.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ func (p *InitializeK0s) Run() error {
5454
}
5555

5656
log.Infof("%s: installing k0s controller", h)
57-
if err := h.Exec(h.K0sInstallCommand()); err != nil {
57+
cmd, err := h.K0sInstallCommand()
58+
if err != nil {
59+
return err
60+
}
61+
if err = h.Exec(cmd); err != nil {
5862
return err
5963
}
6064

phase/install_controllers.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,11 @@ func (p *InstallControllers) Run() error {
8484
}()
8585

8686
log.Infof("%s: installing k0s controller", h)
87-
if err := h.Exec(h.K0sInstallCommand()); err != nil {
87+
cmd, err := h.K0sInstallCommand()
88+
if err != nil {
89+
return err
90+
}
91+
if err = h.Exec(cmd); err != nil {
8892
return err
8993
}
9094

phase/install_workers.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ func (p *InstallWorkers) Run() error {
121121
}
122122

123123
log.Infof("%s: installing k0s worker", h)
124-
if err := h.Exec(h.K0sInstallCommand()); err != nil {
124+
cmd, err := h.K0sInstallCommand()
125+
if err != nil {
126+
return err
127+
}
128+
if err = h.Exec(cmd); err != nil {
125129
return err
126130
}
127131

pkg/apis/k0sctl.k0sproject.io/v1beta1/cluster/flags.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,23 @@ func (f Flags) GetValue(s string) string {
8888
return val
8989
}
9090

91+
// GetValue returns the boolean value part of a flag such as true for a flag like "--san"
92+
// If the flag is not defined returns false. If the flag is defined without a value, returns true
93+
// If no value is set, returns true
94+
func (f Flags) GetBoolean(s string) (bool, error) {
95+
idx := f.Index(s)
96+
if idx < 0 {
97+
return false, nil
98+
}
99+
100+
fl := f.GetValue(s)
101+
if fl == "" {
102+
return true, nil
103+
}
104+
105+
return strconv.ParseBool(fl)
106+
}
107+
91108
// Delete removes a matching flag from the list
92109
func (f *Flags) Delete(s string) {
93110
idx := f.Index(s)

pkg/apis/k0sctl.k0sproject.io/v1beta1/cluster/flags_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,56 @@ func TestString(t *testing.T) {
4949
flags := Flags{"--help", "--setting=false"}
5050
require.Equal(t, "--help --setting=false", flags.Join())
5151
}
52+
53+
func TestGetBoolean(t *testing.T) {
54+
t.Run("Valid flags", func(t *testing.T) {
55+
testsValid := []struct {
56+
flag string
57+
expect bool
58+
}{
59+
{"--flag", true},
60+
{"--flag=true", true},
61+
{"--flag=false", false},
62+
{"--flag=1", true},
63+
{"--flag=TRUE", true},
64+
}
65+
for _, test := range testsValid {
66+
flags := Flags{test.flag}
67+
result, err := flags.GetBoolean(test.flag)
68+
require.NoError(t, err)
69+
require.Equal(t, test.expect, result)
70+
71+
flags = Flags{"--unrelated-flag1", "--unrelated-flag2=foo", test.flag}
72+
result, err = flags.GetBoolean(test.flag)
73+
require.NoError(t, err)
74+
require.Equal(t, test.expect, result)
75+
}
76+
})
77+
78+
t.Run("Invalid flags", func(t *testing.T) {
79+
testsInvalid := []string{
80+
"--flag=foo",
81+
"--flag=2",
82+
"--flag=TrUe",
83+
"--flag=-4",
84+
"--flag=FalSe",
85+
}
86+
for _, test := range testsInvalid {
87+
flags := Flags{test}
88+
_, err := flags.GetBoolean(test)
89+
require.Error(t, err)
90+
91+
flags = Flags{"--unrelated-flag1", "--unrelated-flag2=foo", test}
92+
_, err = flags.GetBoolean(test)
93+
require.Error(t, err)
94+
}
95+
})
96+
97+
t.Run("Unknown flags", func(t *testing.T) {
98+
flags := Flags{"--flag1=1", "--flag2"}
99+
result, err := flags.GetBoolean("--flag3")
100+
require.NoError(t, err)
101+
require.Equal(t, result, false)
102+
103+
})
104+
}

pkg/apis/k0sctl.k0sproject.io/v1beta1/cluster/host.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ func unQE(s string) string {
239239
}
240240

241241
// K0sInstallCommand returns a full command that will install k0s service with necessary flags
242-
func (h *Host) K0sInstallCommand() string {
242+
func (h *Host) K0sInstallCommand() (string, error) {
243243
role := h.Role
244244
flags := h.InstallFlags
245245

@@ -268,10 +268,15 @@ func (h *Host) K0sInstallCommand() string {
268268
if old := flags.GetValue("--kubelet-extra-args"); old != "" {
269269
extra = Flags{unQE(old)}
270270
}
271-
// set worker's private address to --node-ip in --extra-kubelet-args
272-
if h.PrivateAddress != "" {
271+
// set worker's private address to --node-ip in --extra-kubelet-args if cloud ins't enabled
272+
enableCloudProvider, err := h.InstallFlags.GetBoolean("--enable-cloud-provider")
273+
if err != nil {
274+
return "", fmt.Errorf("--enable-cloud-provider flag is set to invalid value: %s. (%v)", h.InstallFlags.GetValue("--enable-cloud-provider"), err)
275+
}
276+
if !enableCloudProvider && h.PrivateAddress != "" {
273277
extra.AddUnlessExist(fmt.Sprintf("--node-ip=%s", h.PrivateAddress))
274278
}
279+
275280
if h.HostnameOverride != "" {
276281
extra.AddOrReplace(fmt.Sprintf("--hostname-override=%s", h.HostnameOverride))
277282
}
@@ -284,9 +289,9 @@ func (h *Host) K0sInstallCommand() string {
284289
sudocmd, err := h.Sudo(cmd)
285290
if err != nil {
286291
log.Warnf("%s: %s", h, err.Error())
287-
return cmd
292+
return cmd, nil
288293
}
289-
return sudocmd
294+
return sudocmd, nil
290295
}
291296

292297
// K0sBackupCommand returns a full command to be used as run k0s backup

pkg/apis/k0sctl.k0sproject.io/v1beta1/cluster/host_test.go

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,23 +78,44 @@ func TestK0sInstallCommand(t *testing.T) {
7878
h := Host{Role: "worker"}
7979
h.Configurer = &mockconfigurer{}
8080

81-
require.Equal(t, `k0s install worker --token-file "from-configurer"`, h.K0sInstallCommand())
81+
cmd, err := h.K0sInstallCommand()
82+
require.NoError(t, err)
83+
require.Equal(t, `k0s install worker --token-file "from-configurer"`, cmd)
8284

8385
h.Role = "controller"
8486
h.Metadata.IsK0sLeader = true
85-
require.Equal(t, `k0s install controller --config "from-configurer"`, h.K0sInstallCommand())
87+
cmd, err = h.K0sInstallCommand()
88+
require.NoError(t, err)
89+
require.Equal(t, `k0s install controller --config "from-configurer"`, cmd)
90+
8691
h.Metadata.IsK0sLeader = false
87-
require.Equal(t, `k0s install controller --token-file "from-configurer" --config "from-configurer"`, h.K0sInstallCommand())
92+
cmd, err = h.K0sInstallCommand()
93+
require.NoError(t, err)
94+
require.Equal(t, `k0s install controller --token-file "from-configurer" --config "from-configurer"`, cmd)
8895

8996
h.Role = "controller+worker"
9097
h.Metadata.IsK0sLeader = true
91-
require.Equal(t, `k0s install controller --enable-worker --config "from-configurer"`, h.K0sInstallCommand())
98+
cmd, err = h.K0sInstallCommand()
99+
require.NoError(t, err)
100+
require.Equal(t, `k0s install controller --enable-worker --config "from-configurer"`, cmd)
92101
h.Metadata.IsK0sLeader = false
93-
require.Equal(t, `k0s install controller --enable-worker --token-file "from-configurer" --config "from-configurer"`, h.K0sInstallCommand())
102+
cmd, err = h.K0sInstallCommand()
103+
require.NoError(t, err)
104+
require.Equal(t, `k0s install controller --enable-worker --token-file "from-configurer" --config "from-configurer"`, cmd)
94105

95106
h.Role = "worker"
96107
h.PrivateAddress = "10.0.0.9"
97-
require.Equal(t, `k0s install worker --token-file "from-configurer" --kubelet-extra-args="--node-ip=10.0.0.9"`, h.K0sInstallCommand())
108+
cmd, err = h.K0sInstallCommand()
109+
require.NoError(t, err)
110+
require.Equal(t, `k0s install worker --token-file "from-configurer" --kubelet-extra-args="--node-ip=10.0.0.9"`, cmd)
111+
98112
h.InstallFlags = []string{`--kubelet-extra-args="--foo bar"`}
99-
require.Equal(t, `k0s install worker --kubelet-extra-args="--foo bar --node-ip=10.0.0.9" --token-file "from-configurer"`, h.K0sInstallCommand())
113+
cmd, err = h.K0sInstallCommand()
114+
require.NoError(t, err)
115+
require.Equal(t, `k0s install worker --kubelet-extra-args="--foo bar --node-ip=10.0.0.9" --token-file "from-configurer"`, cmd)
116+
117+
h.InstallFlags = []string{`--enable-cloud-provider`}
118+
cmd, err = h.K0sInstallCommand()
119+
require.NoError(t, err)
120+
require.Equal(t, `k0s install worker --enable-cloud-provider --token-file "from-configurer"`, cmd)
100121
}

0 commit comments

Comments
 (0)