提交 557339ac 编写于 作者: T Thomas Stromberg

Recover from aborted kubeadm runs by checking for file existence

上级 1c46502f
......@@ -1210,9 +1210,6 @@ func configureRuntimes(runner cruntime.CommandRunner, drvName string, k8s cfg.Ku
// bootstrapCluster starts Kubernetes using the chosen bootstrapper
func bootstrapCluster(bs bootstrapper.Bootstrapper, r cruntime.Manager, runner command.Runner, kc cfg.KubernetesConfig, preexisting bool, isUpgrade bool) {
// hum. bootstrapper.Bootstrapper should probably have a Name function.
bsName := viper.GetString(cmdcfg.Bootstrapper)
if isUpgrade || !preexisting {
out.T(out.Pulling, "Pulling images ...")
if err := bs.PullImages(kc); err != nil {
......@@ -1220,14 +1217,6 @@ func bootstrapCluster(bs bootstrapper.Bootstrapper, r cruntime.Manager, runner c
}
}
if preexisting {
out.T(out.Restarting, "Relaunching Kubernetes using {{.bootstrapper}} ... ", out.V{"bootstrapper": bsName})
if err := bs.RestartCluster(kc); err != nil {
exit.WithLogEntries("Error restarting cluster", err, logs.FindProblems(r, bs, runner))
}
return
}
out.T(out.Launch, "Launching Kubernetes ... ")
if err := bs.StartCluster(kc); err != nil {
exit.WithLogEntries("Error starting cluster", err, logs.FindProblems(r, bs, runner))
......
......@@ -94,6 +94,17 @@ var KubeadmExtraArgsWhitelist = map[int][]string{
},
}
// remote artifacts that must exist for minikube to function properly. The sign of a previously working installation.
var expectedArtifacts = []string{
"/etc/kubernetes/scheduler.conf",
"/etc/kubernetes/kubelet.conf",
"/var/lib/kubelet/kubeadm-flags.env",
"/var/lib/kubelet/config.yaml",
"/var/lib/minikube",
"/etc/kubernetes/manifests/kube-apiserver.yaml",
"/etc/kubernetes/manifests/etcd.yaml",
}
// yamlConfigPath is the path to the kubeadm configuration
var yamlConfigPath = path.Join(vmpath.GuestEphemeralDir, "kubeadm.yaml")
......@@ -222,8 +233,20 @@ func (k *Bootstrapper) createCompatSymlinks() error {
return nil
}
func (k *Bootstrapper) existingConfig() error {
_, err := k.c.RunCmd(exec.Command("ls", expectedArtifacts...))
return err
}
// StartCluster starts the cluster
func (k *Bootstrapper) StartCluster(k8s config.KubernetesConfig) error {
err := k.existingConfig()
if err == nil {
return k.RestartCluster(k8s)
} else {
glog.Infof("existence check: %v", err)
}
start := time.Now()
glog.Infof("StartCluster: %+v", k8s)
defer func() {
......@@ -281,6 +304,7 @@ func (k *Bootstrapper) StartCluster(k8s config.KubernetesConfig) error {
if err := k.adjustResourceLimits(); err != nil {
glog.Warningf("unable to adjust resource limits: %v", err)
}
return nil
}
......@@ -454,6 +478,7 @@ func (k *Bootstrapper) WaitForCluster(k8s config.KubernetesConfig, timeout time.
// RestartCluster restarts the Kubernetes cluster configured by kubeadm
func (k *Bootstrapper) RestartCluster(k8s config.KubernetesConfig) error {
glog.Infof("RestartCluster start")
start := time.Now()
defer func() {
glog.Infof("RestartCluster took %s", time.Since(start))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册