Skip to content

Commit 52302e4

Browse files
committed
kubeadm: use the actual configured kubelet healthz address:port
When doing a kubelet health check on init/join, do not hardcode the "localhost" address. Instead, use the KubeletConfiguration HealthzBindAddress and HealthzPort fields.
1 parent f386b4c commit 52302e4

File tree

6 files changed

+24
-10
lines changed

6 files changed

+24
-10
lines changed

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ import (
2626
"github.com/pkg/errors"
2727

2828
clientset "k8s.io/client-go/kubernetes"
29+
kubeletconfig "k8s.io/kubelet/config/v1beta1"
2930

3031
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
32+
"k8s.io/kubernetes/cmd/kubeadm/app/componentconfigs"
3133
"k8s.io/kubernetes/cmd/kubeadm/app/features"
3234
"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
3335
dryrunutil "k8s.io/kubernetes/cmd/kubeadm/app/util/dryrun"
@@ -107,11 +109,16 @@ func runWaitControlPlanePhase(c workflow.RunData) error {
107109
}
108110

109111
kubeletFailTempl.Execute(data.OutputWriter(), context)
110-
return errors.New("couldn't initialize a Kubernetes cluster")
112+
return errors.New("could not initialize a Kubernetes cluster")
111113
}
112114

113115
waiter.SetTimeout(data.Cfg().Timeouts.KubeletHealthCheck.Duration)
114-
if err := waiter.WaitForKubelet(); err != nil {
116+
kubeletConfig := data.Cfg().ClusterConfiguration.ComponentConfigs[componentconfigs.KubeletGroup].Get()
117+
kubeletConfigTyped, ok := kubeletConfig.(*kubeletconfig.KubeletConfiguration)
118+
if !ok {
119+
return errors.New("could not convert the KubeletConfiguration to a typed object")
120+
}
121+
if err := waiter.WaitForKubelet(kubeletConfigTyped.HealthzBindAddress, *kubeletConfigTyped.HealthzPort); err != nil {
115122
return handleError(err)
116123
}
117124

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,12 @@ import (
3333
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
3434
certutil "k8s.io/client-go/util/cert"
3535
"k8s.io/klog/v2"
36+
kubeletconfig "k8s.io/kubelet/config/v1beta1"
3637

3738
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
3839
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
3940
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
41+
"k8s.io/kubernetes/cmd/kubeadm/app/componentconfigs"
4042
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
4143
kubeletphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubelet"
4244
patchnodephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/patchnode"
@@ -208,7 +210,12 @@ func runKubeletStartJoinPhase(c workflow.RunData) (returnErr error) {
208210
// times out, display a somewhat user-friendly message.
209211
waiter := apiclient.NewKubeWaiter(nil, 0, os.Stdout)
210212
waiter.SetTimeout(cfg.Timeouts.KubeletHealthCheck.Duration)
211-
if err := waiter.WaitForKubelet(); err != nil {
213+
kubeletConfig := initCfg.ClusterConfiguration.ComponentConfigs[componentconfigs.KubeletGroup].Get()
214+
kubeletConfigTyped, ok := kubeletConfig.(*kubeletconfig.KubeletConfiguration)
215+
if !ok {
216+
return errors.New("could not convert the KubeletConfiguration to a typed object")
217+
}
218+
if err := waiter.WaitForKubelet(kubeletConfigTyped.HealthzBindAddress, *kubeletConfigTyped.HealthzPort); err != nil {
212219
fmt.Printf(kubeadmJoinFailMsg, err)
213220
return err
214221
}

cmd/kubeadm/app/componentconfigs/kubelet.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ func (kc *kubeletConfig) Default(cfg *kubeadmapi.ClusterConfiguration, _ *kubead
170170
warnDefaultComponentConfigValue(kind, "authentication.webhook.enabled", kubeletAuthenticationWebhookEnabled, *kc.config.Authentication.Webhook.Enabled)
171171
}
172172

173-
// Serve a /healthz webserver on localhost:10248 that kubeadm can talk to
173+
// Serve a /healthz webserver on 127.0.0.1:10248 that kubeadm can talk to
174174
if kc.config.HealthzBindAddress == "" {
175175
kc.config.HealthzBindAddress = kubeletHealthzBindAddress
176176
} else if kc.config.HealthzBindAddress != kubeletHealthzBindAddress {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func (w *fakeWaiter) WaitForStaticPodHashChange(_, _, _ string) error {
137137
}
138138

139139
// WaitForHKubelet returns a dummy nil just to implement the interface
140-
func (w *fakeWaiter) WaitForKubelet() error {
140+
func (w *fakeWaiter) WaitForKubelet(_ string, _ int32) error {
141141
return nil
142142
}
143143

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ type Waiter interface {
5858
// WaitForStaticPodControlPlaneHashes fetches sha256 hashes for the control plane static pods
5959
WaitForStaticPodControlPlaneHashes(nodeName string) (map[string]string, error)
6060
// WaitForKubelet blocks until the kubelet /healthz endpoint returns 'ok'
61-
WaitForKubelet() error
61+
WaitForKubelet(healthzAddress string, healthzPort int32) error
6262
// SetTimeout adjusts the timeout to the specified duration
6363
SetTimeout(timeout time.Duration)
6464
}
@@ -243,11 +243,11 @@ func (w *KubeWaiter) WaitForPodToDisappear(podName string) error {
243243
}
244244

245245
// WaitForKubelet blocks until the kubelet /healthz endpoint returns 'ok'.
246-
func (w *KubeWaiter) WaitForKubelet() error {
246+
func (w *KubeWaiter) WaitForKubelet(healthzAddress string, healthzPort int32) error {
247247
var (
248248
lastError error
249249
start = time.Now()
250-
healthzEndpoint = fmt.Sprintf("http://localhost:%d/healthz", constants.KubeletHealthzPort)
250+
healthzEndpoint = fmt.Sprintf("http://%s:%d/healthz", healthzAddress, healthzPort)
251251
)
252252

253253
fmt.Printf("[kubelet-check] Waiting for a healthy kubelet. This can take up to %v\n", w.timeout)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ func (w *Waiter) WaitForPodToDisappear(podName string) error {
113113
}
114114

115115
// WaitForKubelet blocks until the kubelet /healthz endpoint returns 'ok'
116-
func (w *Waiter) WaitForKubelet() error {
117-
fmt.Println("[dryrun] Would make sure the kubelet's /healthz endpoint is healthy")
116+
func (w *Waiter) WaitForKubelet(healthzAddress string, healthzPort int32) error {
117+
fmt.Printf("[dryrun] Would make sure the kubelet returns 'ok' at http://%s:%d/healthz\n", healthzAddress, healthzPort)
118118
return nil
119119
}
120120

0 commit comments

Comments
 (0)