Skip to content

Commit 0cfcaa8

Browse files
committed
kubeadm: use advertise address for WaitForAllControlPlaneComponents
1 parent b2741f7 commit 0cfcaa8

File tree

6 files changed

+43
-28
lines changed

6 files changed

+43
-28
lines changed

cmd/kubeadm/app/cmd/phases/init/waitcontrolplane.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ func runWaitControlPlanePhase(c workflow.RunData) error {
124124

125125
waiter.SetTimeout(data.Cfg().Timeouts.ControlPlaneComponentHealthCheck.Duration)
126126
if features.Enabled(data.Cfg().ClusterConfiguration.FeatureGates, features.WaitForAllControlPlaneComponents) {
127-
err = waiter.WaitForControlPlaneComponents(&data.Cfg().ClusterConfiguration)
127+
err = waiter.WaitForControlPlaneComponents(&data.Cfg().ClusterConfiguration,
128+
data.Cfg().LocalAPIEndpoint.AdvertiseAddress)
128129
} else {
129130
err = waiter.WaitForAPI()
130131
}

cmd/kubeadm/app/cmd/phases/join/waitcontrolplane.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ func runWaitControlPlanePhase(c workflow.RunData) error {
7171
}
7272

7373
waiter.SetTimeout(data.Cfg().Timeouts.ControlPlaneComponentHealthCheck.Duration)
74-
if err := waiter.WaitForControlPlaneComponents(&initCfg.ClusterConfiguration); err != nil {
74+
if err := waiter.WaitForControlPlaneComponents(&initCfg.ClusterConfiguration,
75+
data.Cfg().ControlPlane.LocalAPIEndpoint.AdvertiseAddress); err != nil {
7576
return err
7677
}
7778

cmd/kubeadm/app/phases/upgrade/staticpods_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func NewFakeStaticPodWaiter(errsToReturn map[string]error) apiclient.Waiter {
9999
}
100100

101101
// WaitForControlPlaneComponents just returns a dummy nil, to indicate that the program should just proceed
102-
func (w *fakeWaiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) error {
102+
func (w *fakeWaiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration, apiServerAddress string) error {
103103
return nil
104104
}
105105

cmd/kubeadm/app/util/apiclient/wait.go

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"crypto/tls"
2222
"fmt"
2323
"io"
24+
"net"
2425
"net/http"
2526
"time"
2627

@@ -41,7 +42,7 @@ import (
4142
// Waiter is an interface for waiting for criteria in Kubernetes to happen
4243
type Waiter interface {
4344
// WaitForControlPlaneComponents waits for all control plane components to be ready.
44-
WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) error
45+
WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration, apiServerAddress string) error
4546
// WaitForAPI waits for the API Server's /healthz endpoint to become "ok"
4647
// TODO: remove WaitForAPI once WaitForAllControlPlaneComponents goes GA:
4748
// https://github.com/kubernetes/kubeadm/issues/2907
@@ -94,11 +95,17 @@ const (
9495

9596
// getControlPlaneComponents takes a ClusterConfiguration and returns a slice of
9697
// control plane components and their health check URLs.
97-
func getControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) []controlPlaneComponent {
98+
func getControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration, defaultAddressAPIServer string) []controlPlaneComponent {
9899
const (
99100
portArg = "secure-port"
100-
addressArg = "bind-address"
101-
defaultAddress = "127.0.0.1"
101+
bindAddressArg = "bind-address"
102+
// By default, for kube-api-server, kubeadm does not apply a --bind-address flag.
103+
// Check --advertise-address instead, which can override the defaultAddressAPIServer value.
104+
advertiseAddressArg = "advertise-address"
105+
// By default kubeadm deploys the kube-controller-manager and kube-scheduler
106+
// with --bind-address=127.0.0.1. This should match get{Scheduler|ControllerManager}Command().
107+
defaultAddressKCM = "127.0.0.1"
108+
defaultAddressScheduler = "127.0.0.1"
102109
)
103110

104111
portAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, portArg, -1)
@@ -114,33 +121,39 @@ func getControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) []controlPl
114121
portScheduler = fmt.Sprintf("%d", constants.KubeSchedulerPort)
115122
}
116123

117-
addressAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, addressArg, -1)
124+
addressAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, advertiseAddressArg, -1)
118125
if idx == -1 {
119-
addressAPIServer = defaultAddress
126+
addressAPIServer = defaultAddressAPIServer
120127
}
121-
addressKCM, idx := kubeadmapi.GetArgValue(cfg.ControllerManager.ExtraArgs, addressArg, -1)
128+
addressKCM, idx := kubeadmapi.GetArgValue(cfg.ControllerManager.ExtraArgs, bindAddressArg, -1)
122129
if idx == -1 {
123-
addressKCM = defaultAddress
130+
addressKCM = defaultAddressKCM
124131
}
125-
addressScheduler, idx := kubeadmapi.GetArgValue(cfg.Scheduler.ExtraArgs, addressArg, -1)
132+
addressScheduler, idx := kubeadmapi.GetArgValue(cfg.Scheduler.ExtraArgs, bindAddressArg, -1)
126133
if idx == -1 {
127-
addressScheduler = defaultAddress
134+
addressScheduler = defaultAddressScheduler
128135
}
129136

130-
urlFormat := "https://%s:%s/%s"
137+
getURL := func(address, port, endpoint string) string {
138+
return fmt.Sprintf(
139+
"https://%s/%s",
140+
net.JoinHostPort(address, port),
141+
endpoint,
142+
)
143+
}
131144
return []controlPlaneComponent{
132-
{name: "kube-apiserver", url: fmt.Sprintf(urlFormat, addressAPIServer, portAPIServer, endpointLivez)},
133-
{name: "kube-controller-manager", url: fmt.Sprintf(urlFormat, addressKCM, portKCM, endpointHealthz)},
134-
{name: "kube-scheduler", url: fmt.Sprintf(urlFormat, addressScheduler, portScheduler, endpointLivez)},
145+
{name: "kube-apiserver", url: getURL(addressAPIServer, portAPIServer, endpointLivez)},
146+
{name: "kube-controller-manager", url: getURL(addressKCM, portKCM, endpointHealthz)},
147+
{name: "kube-scheduler", url: getURL(addressScheduler, portScheduler, endpointLivez)},
135148
}
136149
}
137150

138151
// WaitForControlPlaneComponents waits for all control plane components to report "ok".
139-
func (w *KubeWaiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) error {
152+
func (w *KubeWaiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration, apiSeverAddress string) error {
140153
fmt.Printf("[control-plane-check] Waiting for healthy control plane components."+
141154
" This can take up to %v\n", w.timeout)
142155

143-
components := getControlPlaneComponents(cfg)
156+
components := getControlPlaneComponents(cfg, apiSeverAddress)
144157

145158
var errs []error
146159
errChan := make(chan error, len(components))

cmd/kubeadm/app/util/apiclient/wait_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,34 +37,34 @@ func TestGetControlPlaneComponents(t *testing.T) {
3737
ControlPlaneComponent: kubeadmapi.ControlPlaneComponent{
3838
ExtraArgs: []kubeadmapi.Arg{
3939
{Name: "secure-port", Value: "1111"},
40-
{Name: "bind-address", Value: "0.0.0.0"},
40+
{Name: "advertise-address", Value: "fd00:1::"},
4141
},
4242
},
4343
},
4444
ControllerManager: kubeadmapi.ControlPlaneComponent{
4545
ExtraArgs: []kubeadmapi.Arg{
4646
{Name: "secure-port", Value: "2222"},
47-
{Name: "bind-address", Value: "0.0.0.0"},
47+
{Name: "bind-address", Value: "127.0.0.1"},
4848
},
4949
},
5050
Scheduler: kubeadmapi.ControlPlaneComponent{
5151
ExtraArgs: []kubeadmapi.Arg{
5252
{Name: "secure-port", Value: "3333"},
53-
{Name: "bind-address", Value: "0.0.0.0"},
53+
{Name: "bind-address", Value: "127.0.0.1"},
5454
},
5555
},
5656
},
5757
expected: []controlPlaneComponent{
58-
{name: "kube-apiserver", url: fmt.Sprintf("https://0.0.0.0:1111/%s", endpointLivez)},
59-
{name: "kube-controller-manager", url: fmt.Sprintf("https://0.0.0.0:2222/%s", endpointHealthz)},
60-
{name: "kube-scheduler", url: fmt.Sprintf("https://0.0.0.0:3333/%s", endpointLivez)},
58+
{name: "kube-apiserver", url: fmt.Sprintf("https://[fd00:1::]:1111/%s", endpointLivez)},
59+
{name: "kube-controller-manager", url: fmt.Sprintf("https://127.0.0.1:2222/%s", endpointHealthz)},
60+
{name: "kube-scheduler", url: fmt.Sprintf("https://127.0.0.1:3333/%s", endpointLivez)},
6161
},
6262
},
6363
{
6464
name: "default ports and addresses",
6565
cfg: &kubeadmapi.ClusterConfiguration{},
6666
expected: []controlPlaneComponent{
67-
{name: "kube-apiserver", url: fmt.Sprintf("https://127.0.0.1:6443/%s", endpointLivez)},
67+
{name: "kube-apiserver", url: fmt.Sprintf("https://192.168.0.1:6443/%s", endpointLivez)},
6868
{name: "kube-controller-manager", url: fmt.Sprintf("https://127.0.0.1:10257/%s", endpointHealthz)},
6969
{name: "kube-scheduler", url: fmt.Sprintf("https://127.0.0.1:10259/%s", endpointLivez)},
7070
},
@@ -73,7 +73,7 @@ func TestGetControlPlaneComponents(t *testing.T) {
7373

7474
for _, tc := range testcases {
7575
t.Run(tc.name, func(t *testing.T) {
76-
actual := getControlPlaneComponents(tc.cfg)
76+
actual := getControlPlaneComponents(tc.cfg, "192.168.0.1")
7777
if !reflect.DeepEqual(tc.expected, actual) {
7878
t.Fatalf("expected result: %+v, got: %+v", tc.expected, actual)
7979
}

cmd/kubeadm/app/util/dryrun/dryrun.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func NewWaiter() apiclient.Waiter {
9090
}
9191

9292
// WaitForControlPlaneComponents just returns a dummy nil, to indicate that the program should just proceed
93-
func (w *Waiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) error {
93+
func (w *Waiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration, apiServerAddress string) error {
9494
return nil
9595
}
9696

0 commit comments

Comments
 (0)