Skip to content

Commit 6fce566

Browse files
authored
Merge pull request kubernetes#128474 from neolit123/1.32-handle-custom-addreses-comp-readyz
kubeadm: use actual addresses/ports for WaitForAllControlPlaneComponents
2 parents 406fb26 + b2741f7 commit 6fce566

File tree

2 files changed

+53
-21
lines changed

2 files changed

+53
-21
lines changed

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

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import (
3939

4040
// Waiter is an interface for waiting for criteria in Kubernetes to happen
4141
type Waiter interface {
42-
// WaitForControlPlaneComponents waits for all control plane components to report "ok" on /healthz
42+
// WaitForControlPlaneComponents waits for all control plane components to be ready.
4343
WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) error
4444
// WaitForAPI waits for the API Server's /healthz endpoint to become "ok"
4545
// TODO: remove WaitForAPI once WaitForAllControlPlaneComponents goes GA:
@@ -81,31 +81,58 @@ type controlPlaneComponent struct {
8181
url string
8282
}
8383

84+
const (
85+
// TODO: switch to /livez once all components support it
86+
// and delete the endpointHealthz constant.
87+
// https://github.com/kubernetes/kubernetes/issues/118158
88+
endpointHealthz = "healthz"
89+
endpointLivez = "livez"
90+
)
91+
8492
// getControlPlaneComponents takes a ClusterConfiguration and returns a slice of
85-
// control plane components and their secure ports.
93+
// control plane components and their health check URLs.
8694
func getControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) []controlPlaneComponent {
87-
portArg := "secure-port"
95+
const (
96+
portArg = "secure-port"
97+
addressArg = "bind-address"
98+
defaultAddress = "127.0.0.1"
99+
)
100+
88101
portAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, portArg, -1)
89102
if idx == -1 {
90-
portAPIServer = "6443"
103+
portAPIServer = fmt.Sprintf("%d", constants.KubeAPIServerPort)
91104
}
92105
portKCM, idx := kubeadmapi.GetArgValue(cfg.ControllerManager.ExtraArgs, portArg, -1)
93106
if idx == -1 {
94-
portKCM = "10257"
107+
portKCM = fmt.Sprintf("%d", constants.KubeControllerManagerPort)
95108
}
96109
portScheduler, idx := kubeadmapi.GetArgValue(cfg.Scheduler.ExtraArgs, portArg, -1)
97110
if idx == -1 {
98-
portScheduler = "10259"
111+
portScheduler = fmt.Sprintf("%d", constants.KubeSchedulerPort)
112+
}
113+
114+
addressAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, addressArg, -1)
115+
if idx == -1 {
116+
addressAPIServer = defaultAddress
117+
}
118+
addressKCM, idx := kubeadmapi.GetArgValue(cfg.ControllerManager.ExtraArgs, addressArg, -1)
119+
if idx == -1 {
120+
addressKCM = defaultAddress
99121
}
100-
urlFormat := "https://127.0.0.1:%s/healthz"
122+
addressScheduler, idx := kubeadmapi.GetArgValue(cfg.Scheduler.ExtraArgs, addressArg, -1)
123+
if idx == -1 {
124+
addressScheduler = defaultAddress
125+
}
126+
127+
urlFormat := "https://%s:%s/%s"
101128
return []controlPlaneComponent{
102-
{name: "kube-apiserver", url: fmt.Sprintf(urlFormat, portAPIServer)},
103-
{name: "kube-controller-manager", url: fmt.Sprintf(urlFormat, portKCM)},
104-
{name: "kube-scheduler", url: fmt.Sprintf(urlFormat, portScheduler)},
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)},
105132
}
106133
}
107134

108-
// WaitForControlPlaneComponents waits for all control plane components to report "ok" on /healthz
135+
// WaitForControlPlaneComponents waits for all control plane components to report "ok".
109136
func (w *KubeWaiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) error {
110137
fmt.Printf("[control-plane-check] Waiting for healthy control plane components."+
111138
" This can take up to %v\n", w.timeout)
@@ -133,15 +160,16 @@ func (w *KubeWaiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfig
133160
true, func(ctx context.Context) (bool, error) {
134161
resp, err := client.Get(comp.url)
135162
if err != nil {
136-
lastError = errors.WithMessagef(err, "%s /healthz check failed", comp.name)
163+
lastError = errors.WithMessagef(err, "%s check failed at %s", comp.name, comp.url)
137164
return false, nil
138165
}
139166

140167
defer func() {
141168
_ = resp.Body.Close()
142169
}()
143170
if resp.StatusCode != http.StatusOK {
144-
lastError = errors.Errorf("%s /healthz check failed with status: %d", comp.name, resp.StatusCode)
171+
lastError = errors.Errorf("%s check failed at %s with status: %d",
172+
comp.name, comp.url, resp.StatusCode)
145173
return false, nil
146174
}
147175

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package apiclient
1818

1919
import (
20+
"fmt"
2021
"reflect"
2122
"testing"
2223

@@ -30,39 +31,42 @@ func TestGetControlPlaneComponents(t *testing.T) {
3031
expected []controlPlaneComponent
3132
}{
3233
{
33-
name: "port values from config",
34+
name: "port and addresses from config",
3435
cfg: &kubeadmapi.ClusterConfiguration{
3536
APIServer: kubeadmapi.APIServer{
3637
ControlPlaneComponent: kubeadmapi.ControlPlaneComponent{
3738
ExtraArgs: []kubeadmapi.Arg{
3839
{Name: "secure-port", Value: "1111"},
40+
{Name: "bind-address", Value: "0.0.0.0"},
3941
},
4042
},
4143
},
4244
ControllerManager: kubeadmapi.ControlPlaneComponent{
4345
ExtraArgs: []kubeadmapi.Arg{
4446
{Name: "secure-port", Value: "2222"},
47+
{Name: "bind-address", Value: "0.0.0.0"},
4548
},
4649
},
4750
Scheduler: kubeadmapi.ControlPlaneComponent{
4851
ExtraArgs: []kubeadmapi.Arg{
4952
{Name: "secure-port", Value: "3333"},
53+
{Name: "bind-address", Value: "0.0.0.0"},
5054
},
5155
},
5256
},
5357
expected: []controlPlaneComponent{
54-
{name: "kube-apiserver", url: "https://127.0.0.1:1111/healthz"},
55-
{name: "kube-controller-manager", url: "https://127.0.0.1:2222/healthz"},
56-
{name: "kube-scheduler", url: "https://127.0.0.1:3333/healthz"},
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)},
5761
},
5862
},
5963
{
60-
name: "default ports",
64+
name: "default ports and addresses",
6165
cfg: &kubeadmapi.ClusterConfiguration{},
6266
expected: []controlPlaneComponent{
63-
{name: "kube-apiserver", url: "https://127.0.0.1:6443/healthz"},
64-
{name: "kube-controller-manager", url: "https://127.0.0.1:10257/healthz"},
65-
{name: "kube-scheduler", url: "https://127.0.0.1:10259/healthz"},
67+
{name: "kube-apiserver", url: fmt.Sprintf("https://127.0.0.1:6443/%s", endpointLivez)},
68+
{name: "kube-controller-manager", url: fmt.Sprintf("https://127.0.0.1:10257/%s", endpointHealthz)},
69+
{name: "kube-scheduler", url: fmt.Sprintf("https://127.0.0.1:10259/%s", endpointLivez)},
6670
},
6771
},
6872
}

0 commit comments

Comments
 (0)