From 638411d744755a4a34bfd692689adbbc30df5a7e Mon Sep 17 00:00:00 2001 From: Deyuan Deng Date: Wed, 28 Oct 2015 14:46:44 +0800 Subject: [PATCH] Wait apiserver in controller manager startup process --- cmd/kube-controller-manager/app/controllermanager.go | 9 ++++++++- .../service/ipallocator/controller/repair.go | 12 +++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index 24542f4bac0..8b200f6bfd4 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -55,6 +55,7 @@ import ( "k8s.io/kubernetes/pkg/healthz" "k8s.io/kubernetes/pkg/master/ports" "k8s.io/kubernetes/pkg/util" + "k8s.io/kubernetes/pkg/util/wait" "github.com/golang/glog" "github.com/prometheus/client_golang/prometheus" @@ -309,7 +310,13 @@ func (s *CMServer) Run(_ []string) error { resourcequotacontroller.NewResourceQuotaController(kubeClient).Run(s.ResourceQuotaSyncPeriod) - versionStrings, err := client.ServerAPIVersions(kubeconfig) + // If apiserver is not running we should wait for some time and fail only then. This is particularly + // important when we start apiserver and controller manager at the same time. + var versionStrings []string + err = wait.PollImmediate(time.Second, 10*time.Second, func() (bool, error) { + versionStrings, err = client.ServerAPIVersions(kubeconfig) + return err == nil, err + }) if err != nil { glog.Fatalf("Failed to get api versions from server: %v", err) } diff --git a/pkg/registry/service/ipallocator/controller/repair.go b/pkg/registry/service/ipallocator/controller/repair.go index fcf4b062de7..d648fe48d88 100644 --- a/pkg/registry/service/ipallocator/controller/repair.go +++ b/pkg/registry/service/ipallocator/controller/repair.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/registry/service" "k8s.io/kubernetes/pkg/registry/service/ipallocator" "k8s.io/kubernetes/pkg/util" + "k8s.io/kubernetes/pkg/util/wait" ) // Repair is a controller loop that periodically examines all service ClusterIP allocations @@ -84,13 +85,10 @@ func (c *Repair) RunOnce() error { // important when we start apiserver and etcd at the same time. var latest *api.RangeAllocation var err error - for i := 0; i < 10; i++ { - if latest, err = c.alloc.Get(); err != nil { - time.Sleep(time.Second) - } else { - break - } - } + err = wait.PollImmediate(time.Second, 10*time.Second, func() (bool, error) { + latest, err = c.alloc.Get() + return err == nil, err + }) if err != nil { return fmt.Errorf("unable to refresh the service IP block: %v", err) }