Skip to content

Commit c1e37a5

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request kubernetes#66056 from mikedanese/fixhang
Automatic merge from submit-queue (batch tested with PRs 67349, 66056). If you want to cherry-pick this change to another branch, please follow the instructions here: https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md. wait until apiserver connection before starting kubelet tls bootstrap I wonder if this helps with sometimes slow network programming cc @mwielgus @awly
2 parents c081c02 + 2cf1c75 commit c1e37a5

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

pkg/kubelet/certificate/bootstrap/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ go_library(
2121
srcs = ["bootstrap.go"],
2222
importpath = "k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap",
2323
deps = [
24+
"//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
2425
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
2526
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
27+
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
28+
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
2629
"//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library",
2730
"//staging/src/k8s.io/client-go/rest:go_default_library",
2831
"//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library",

pkg/kubelet/certificate/bootstrap/bootstrap.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,20 @@ limitations under the License.
1717
package bootstrap
1818

1919
import (
20+
"context"
21+
"errors"
2022
"fmt"
2123
"os"
2224
"path/filepath"
2325
"time"
2426

2527
"github.com/golang/glog"
2628

29+
"k8s.io/apimachinery/pkg/runtime/serializer"
2730
"k8s.io/apimachinery/pkg/types"
2831
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
32+
"k8s.io/apimachinery/pkg/util/wait"
33+
"k8s.io/client-go/kubernetes/scheme"
2934
certificates "k8s.io/client-go/kubernetes/typed/certificates/v1beta1"
3035
restclient "k8s.io/client-go/rest"
3136
"k8s.io/client-go/tools/clientcmd"
@@ -59,6 +64,7 @@ func LoadClientCert(kubeconfigPath string, bootstrapPath string, certDir string,
5964
if err != nil {
6065
return fmt.Errorf("unable to load bootstrap kubeconfig: %v", err)
6166
}
67+
6268
bootstrapClient, err := certificates.NewForConfig(bootstrapClientConfig)
6369
if err != nil {
6470
return fmt.Errorf("unable to create certificates signing request client: %v", err)
@@ -92,6 +98,10 @@ func LoadClientCert(kubeconfigPath string, bootstrapPath string, certDir string,
9298
}
9399
}
94100

101+
if err := waitForServer(*bootstrapClientConfig, 1*time.Minute); err != nil {
102+
glog.Warningf("Error waiting for apiserver to come up: %v", err)
103+
}
104+
95105
certData, err := csr.RequestNodeCertificate(bootstrapClient.CertificateSigningRequests(), keyData, nodeName)
96106
if err != nil {
97107
return err
@@ -207,3 +217,30 @@ func verifyKeyData(data []byte) bool {
207217
_, err := certutil.ParsePrivateKeyPEM(data)
208218
return err == nil
209219
}
220+
221+
func waitForServer(cfg restclient.Config, deadline time.Duration) error {
222+
cfg.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}
223+
cfg.Timeout = 1 * time.Second
224+
cli, err := restclient.UnversionedRESTClientFor(&cfg)
225+
if err != nil {
226+
return fmt.Errorf("couldn't create client: %v", err)
227+
}
228+
229+
ctx, cancel := context.WithTimeout(context.TODO(), deadline)
230+
defer cancel()
231+
232+
var connected bool
233+
wait.JitterUntil(func() {
234+
if _, err := cli.Get().AbsPath("/healthz").Do().Raw(); err != nil {
235+
glog.Infof("Failed to connect to apiserver: %v", err)
236+
return
237+
}
238+
cancel()
239+
connected = true
240+
}, 2*time.Second, 0.2, true, ctx.Done())
241+
242+
if !connected {
243+
return errors.New("timed out waiting to connect to apiserver")
244+
}
245+
return nil
246+
}

0 commit comments

Comments
 (0)