Skip to content

Commit b2741f7

Browse files
committed
kubeadm: use actual addresses/ports for WaitForAllControlPlaneComponents
By default check the KCM and scheduler on 127.0.0.1:<port> as that is the defaall --bind-address kubeamd uses for these components. For kube-apiserver take the value from APIEndpoint.AdvertiseAddress which is dynamically detected from the host. Unless the user has passed explicitly --advertise-address as an extra arg. Read the <port> values for all components from the --secure-port flag value if needed. Otherwise use defaults. Use /livez for apiserver and scheduler. Add TODO for KCM to switch to /livez as well.
1 parent 16f9fdc commit b2741f7

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
@@ -40,7 +40,7 @@ import (
4040

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

87+
const (
88+
// TODO: switch to /livez once all components support it
89+
// and delete the endpointHealthz constant.
90+
// https://github.com/kubernetes/kubernetes/issues/118158
91+
endpointHealthz = "healthz"
92+
endpointLivez = "livez"
93+
)
94+
8795
// getControlPlaneComponents takes a ClusterConfiguration and returns a slice of
88-
// control plane components and their secure ports.
96+
// control plane components and their health check URLs.
8997
func getControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) []controlPlaneComponent {
90-
portArg := "secure-port"
98+
const (
99+
portArg = "secure-port"
100+
addressArg = "bind-address"
101+
defaultAddress = "127.0.0.1"
102+
)
103+
91104
portAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, portArg, -1)
92105
if idx == -1 {
93-
portAPIServer = "6443"
106+
portAPIServer = fmt.Sprintf("%d", constants.KubeAPIServerPort)
94107
}
95108
portKCM, idx := kubeadmapi.GetArgValue(cfg.ControllerManager.ExtraArgs, portArg, -1)
96109
if idx == -1 {
97-
portKCM = "10257"
110+
portKCM = fmt.Sprintf("%d", constants.KubeControllerManagerPort)
98111
}
99112
portScheduler, idx := kubeadmapi.GetArgValue(cfg.Scheduler.ExtraArgs, portArg, -1)
100113
if idx == -1 {
101-
portScheduler = "10259"
114+
portScheduler = fmt.Sprintf("%d", constants.KubeSchedulerPort)
115+
}
116+
117+
addressAPIServer, idx := kubeadmapi.GetArgValue(cfg.APIServer.ExtraArgs, addressArg, -1)
118+
if idx == -1 {
119+
addressAPIServer = defaultAddress
120+
}
121+
addressKCM, idx := kubeadmapi.GetArgValue(cfg.ControllerManager.ExtraArgs, addressArg, -1)
122+
if idx == -1 {
123+
addressKCM = defaultAddress
102124
}
103-
urlFormat := "https://127.0.0.1:%s/healthz"
125+
addressScheduler, idx := kubeadmapi.GetArgValue(cfg.Scheduler.ExtraArgs, addressArg, -1)
126+
if idx == -1 {
127+
addressScheduler = defaultAddress
128+
}
129+
130+
urlFormat := "https://%s:%s/%s"
104131
return []controlPlaneComponent{
105-
{name: "kube-apiserver", url: fmt.Sprintf(urlFormat, portAPIServer)},
106-
{name: "kube-controller-manager", url: fmt.Sprintf(urlFormat, portKCM)},
107-
{name: "kube-scheduler", url: fmt.Sprintf(urlFormat, portScheduler)},
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)},
108135
}
109136
}
110137

111-
// WaitForControlPlaneComponents waits for all control plane components to report "ok" on /healthz
138+
// WaitForControlPlaneComponents waits for all control plane components to report "ok".
112139
func (w *KubeWaiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfiguration) error {
113140
fmt.Printf("[control-plane-check] Waiting for healthy control plane components."+
114141
" This can take up to %v\n", w.timeout)
@@ -136,15 +163,16 @@ func (w *KubeWaiter) WaitForControlPlaneComponents(cfg *kubeadmapi.ClusterConfig
136163
true, func(ctx context.Context) (bool, error) {
137164
resp, err := client.Get(comp.url)
138165
if err != nil {
139-
lastError = errors.WithMessagef(err, "%s /healthz check failed", comp.name)
166+
lastError = errors.WithMessagef(err, "%s check failed at %s", comp.name, comp.url)
140167
return false, nil
141168
}
142169

143170
defer func() {
144171
_ = resp.Body.Close()
145172
}()
146173
if resp.StatusCode != http.StatusOK {
147-
lastError = errors.Errorf("%s /healthz check failed with status: %d", comp.name, resp.StatusCode)
174+
lastError = errors.Errorf("%s check failed at %s with status: %d",
175+
comp.name, comp.url, resp.StatusCode)
148176
return false, nil
149177
}
150178

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)