diff --git a/cmd/kubeadm/app/images/images.go b/cmd/kubeadm/app/images/images.go index 4ff5dbfe406..295ad6f1e60 100644 --- a/cmd/kubeadm/app/images/images.go +++ b/cmd/kubeadm/app/images/images.go @@ -34,6 +34,7 @@ const ( KubeDNSImage = "kube-dns" KubeDNSmasqImage = "dnsmasq" KubeExechealthzImage = "exechealthz" + Pause = "pause" gcrPrefix = "gcr.io/google_containers" etcdVersion = "2.2.5" @@ -41,6 +42,7 @@ const ( kubeDNSVersion = "1.7" dnsmasqVersion = "1.3" exechealthzVersion = "1.1" + pauseVersion = "3.0" ) func GetCoreImage(image string, cfg *kubeadmapi.MasterConfiguration, overrideImage string) string { @@ -62,5 +64,6 @@ func GetAddonImage(image string) string { KubeDNSImage: fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "kubedns", runtime.GOARCH, kubeDNSVersion), KubeDNSmasqImage: fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "kube-dnsmasq", runtime.GOARCH, dnsmasqVersion), KubeExechealthzImage: fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "exechealthz", runtime.GOARCH, exechealthzVersion), + Pause: fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "pause", runtime.GOARCH, pauseVersion), }[image] } diff --git a/cmd/kubeadm/app/master/apiclient.go b/cmd/kubeadm/app/master/apiclient.go index c21d9a51c0d..5a68cec3796 100644 --- a/cmd/kubeadm/app/master/apiclient.go +++ b/cmd/kubeadm/app/master/apiclient.go @@ -21,6 +21,7 @@ import ( "fmt" "time" + "k8s.io/kubernetes/cmd/kubeadm/app/images" "k8s.io/kubernetes/pkg/api" apierrs "k8s.io/kubernetes/pkg/api/errors" unversionedapi "k8s.io/kubernetes/pkg/api/unversioned" @@ -96,6 +97,8 @@ func CreateClientAndWaitForAPI(adminConfig *clientcmdapi.Config) (*clientset.Cli return true, nil }) + createDummyDeployment(client) + return client, nil } @@ -219,3 +222,41 @@ func SetMasterNodeAffinity(meta *api.ObjectMeta) { } meta.Annotations[api.AffinityAnnotationKey] = string(affinityAnnotation) } + +func createDummyDeployment(client *clientset.Clientset) { + fmt.Println(" attempting a test deployment") + dummyDeployment := NewDeployment("dummy", 1, api.PodSpec{ + SecurityContext: &api.PodSecurityContext{HostNetwork: true}, + Containers: []api.Container{{ + Name: "dummy", + Image: images.GetAddonImage("pause"), + }}, + }) + + wait.PollInfinite(apiCallRetryInterval, func() (bool, error) { + // TODO: we should check the error, as some cases may be fatal + if _, err := client.Extensions().Deployments(api.NamespaceSystem).Create(dummyDeployment); err != nil { + fmt.Printf(" failed to create test deployment [%v] (will retry)", err) + return false, nil + } + return true, nil + }) + + wait.PollInfinite(apiCallRetryInterval, func() (bool, error) { + d, err := client.Extensions().Deployments(api.NamespaceSystem).Get("dummy") + if err != nil { + fmt.Printf(" failed to get test deployment [%v] (will retry)", err) + return false, nil + } + if d.Status.AvailableReplicas < 1 { + return false, nil + } + return true, nil + }) + + fmt.Println(" test deployment succeeded") + + if err := client.Extensions().Deployments(api.NamespaceSystem).Delete("dummy", &api.DeleteOptions{}); err != nil { + fmt.Printf(" failed to delete test deployment [%v] (will ignore)", err) + } +}