Skip to content

Commit 3dcad5f

Browse files
authored
Merge pull request kubernetes#128532 from neolit123/1.32-handle-custom-addreses-comp-readyz
kubeadm: use advertise address for WaitForAllControlPlaneComponents
2 parents aafcf4e + 0cfcaa8 commit 3dcad5f

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

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

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

101108
portAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, portArg, -1)
@@ -111,33 +118,39 @@ func getControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) []controlPl
111118
portScheduler = fmt.Sprintf("%d", constants.KubeSchedulerPort)
112119
}
113120

114-
addressAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, addressArg, -1)
121+
addressAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, advertiseAddressArg, -1)
115122
if idx == -1 {
116-
addressAPIServer = defaultAddress
123+
addressAPIServer = defaultAddressAPIServer
117124
}
118-
addressKCM, idx := kubeadmapi.GetArgValue(cfg.ControllerManager.ExtraArgs, addressArg, -1)
125+
addressKCM, idx := kubeadmapi.GetArgValue(cfg.ControllerManager.ExtraArgs, bindAddressArg, -1)
119126
if idx == -1 {
120-
addressKCM = defaultAddress
127+
addressKCM = defaultAddressKCM
121128
}
122-
addressScheduler, idx := kubeadmapi.GetArgValue(cfg.Scheduler.ExtraArgs, addressArg, -1)
129+
addressScheduler, idx := kubeadmapi.GetArgValue(cfg.Scheduler.ExtraArgs, bindAddressArg, -1)
123130
if idx == -1 {
124-
addressScheduler = defaultAddress
131+
addressScheduler = defaultAddressScheduler
125132
}
126133

127-
urlFormat := "https://%s:%s/%s"
134+
getURL := func(address, port, endpoint string) string {
135+
return fmt.Sprintf(
136+
"https://%s/%s",
137+
net.JoinHostPort(address, port),
138+
endpoint,
139+
)
140+
}
128141
return []controlPlaneComponent{
129-
{name: "kube-apiserver", url: fmt.Sprintf(urlFormat, addressAPIServer, portAPIServer, endpointLivez)},
130-
{name: "kube-controller-manager", url: fmt.Sprintf(urlFormat, addressKCM, portKCM, endpointHealthz)},
131-
{name: "kube-scheduler", url: fmt.Sprintf(urlFormat, addressScheduler, portScheduler, endpointLivez)},
142+
{name: "kube-apiserver", url: getURL(addressAPIServer, portAPIServer, endpointLivez)},
143+
{name: "kube-controller-manager", url: getURL(addressKCM, portKCM, endpointHealthz)},
144+
{name: "kube-scheduler", url: getURL(addressScheduler, portScheduler, endpointLivez)},
132145
}
133146
}
134147

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

140-
components := getControlPlaneComponents(cfg)
153+
components := getControlPlaneComponents(cfg, apiSeverAddress)
141154

142155
var errs []error
143156
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)