re-establish apiserver tunnel on restart

pull/14183/head
Sharif Elgamal 2022-05-16 19:07:51 -07:00
parent ac8f0b1ede
commit f02e977544
3 changed files with 27 additions and 12 deletions

View File

@ -494,17 +494,17 @@ func (d *Driver) Stop() error {
func (d *Driver) Remove() error {
s, err := d.GetState()
if err != nil {
return err
return errors.Wrap(err, "get state")
}
if s == state.Running {
if err := d.Kill(); err != nil {
return err
return errors.Wrap(err, "kill")
}
}
if s != state.Stopped {
_, err = d.RunQMPCommand("quit")
if err != nil {
return err
return errors.Wrap(err, "quit")
}
}
return nil

View File

@ -290,6 +290,9 @@ func (k *Bootstrapper) init(cfg config.ClusterConfig) error {
}()
wg.Wait()
if cfg.APIServerPort != 0 {
k.tunnelToAPIServer(cfg)
}
return nil
}
@ -399,6 +402,10 @@ func (k *Bootstrapper) StartCluster(cfg config.ClusterConfig) error {
}
if err := bsutil.ExistingConfig(k.c); err == nil {
// Tunnel apiserver to guest, if needed
if cfg.APIServerPort != 0 {
k.tunnelToAPIServer(cfg)
}
klog.Infof("found existing configuration files, will attempt cluster restart")
rerr := k.restartControlPlane(cfg)
if rerr == nil {
@ -433,6 +440,22 @@ func (k *Bootstrapper) StartCluster(cfg config.ClusterConfig) error {
return err
}
func (k *Bootstrapper) tunnelToAPIServer(cfg config.ClusterConfig) {
m, err := machine.NewAPIClient()
if err != nil {
klog.Warningf("libmachine API failed: %v", err)
}
cp, err := config.PrimaryControlPlane(&cfg)
if err != nil {
klog.Warningf("finding control plane failed: %v", err)
}
args := []string{"-f", "-NTL", fmt.Sprintf("%d:localhost:8443", cfg.APIServerPort)}
err = machine.CreateSSHShell(m, cfg, cp, args, false)
if err != nil {
klog.Warningf("apiserver tunnel failed: %v", err)
}
}
// client sets and returns a Kubernetes client to use to speak to a kubeadm launched apiserver
func (k *Bootstrapper) client(ip string, port int) (*kubernetes.Clientset, error) {
if k.k8sClient != nil {
@ -569,6 +592,7 @@ func (k *Bootstrapper) needsReconfigure(conf string, hostname string, port int,
klog.Infof("needs reconfigure: configs differ:\n%s", rr.Output())
return true
}
// cruntime.Enable() may restart kube-apiserver but does not wait for it to return back
apiStatusTimeout := 3000 * time.Millisecond
st, err := kverify.WaitForAPIServerStatus(k.c, apiStatusTimeout, hostname, port)

View File

@ -253,15 +253,6 @@ func handleAPIServer(starter Starter, cr cruntime.Manager, hostIP net.IP) (*kube
return nil, bs, err
}
// Tunnel apiserver to guest, if needed
if starter.Cfg.APIServerPort != 0 {
args := []string{"-f", "-NTL", fmt.Sprintf("%d:localhost:8443", starter.Cfg.APIServerPort)}
err := machine.CreateSSHShell(starter.MachineAPI, *starter.Cfg, *starter.Node, args, false)
if err != nil {
klog.Warningf("apiserver tunnel failed: %v", err)
}
}
// Write the kubeconfig to the file system after everything required (like certs) are created by the bootstrapper.
if err := kubeconfig.Update(kcs); err != nil {
return nil, bs, errors.Wrap(err, "Failed kubeconfig update")