Skip to content

Commit e51b55b

Browse files
committed
kubeadm: feature gate ControlPlaneKubeletLocalMode on upgrade
1 parent 241c1c7 commit e51b55b

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

cmd/kubeadm/app/cmd/phases/upgrade/node/controlplane.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
2626
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
27+
"k8s.io/kubernetes/cmd/kubeadm/app/features"
2728
"k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade"
2829
"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
2930
)
@@ -82,6 +83,12 @@ func runControlPlane() func(c workflow.RunData) error {
8283
return errors.Wrap(err, "failed to perform addons upgrade")
8384
}
8485

86+
if features.Enabled(cfg.FeatureGates, features.ControlPlaneKubeletLocalMode) {
87+
if err := upgrade.UpdateKubeletLocalMode(cfg, dryRun); err != nil {
88+
return errors.Wrap(err, "failed to update kubelet local mode")
89+
}
90+
}
91+
8592
fmt.Println("[upgrade] The control plane instance for this node was successfully updated!")
8693

8794
return nil

cmd/kubeadm/app/phases/upgrade/postupgrade.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@ import (
3131
errorsutil "k8s.io/apimachinery/pkg/util/errors"
3232
"k8s.io/apimachinery/pkg/util/sets"
3333
clientset "k8s.io/client-go/kubernetes"
34+
"k8s.io/client-go/tools/clientcmd"
3435
"k8s.io/klog/v2"
3536

3637
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
3738
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
39+
"k8s.io/kubernetes/cmd/kubeadm/app/features"
3840
"k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/dns"
3941
"k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/proxy"
4042
"k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo"
@@ -109,6 +111,12 @@ func PerformPostUpgradeTasks(client clientset.Interface, cfg *kubeadmapi.InitCon
109111
errs = append(errs, err)
110112
}
111113

114+
if features.Enabled(cfg.FeatureGates, features.ControlPlaneKubeletLocalMode) {
115+
if err := UpdateKubeletLocalMode(cfg, dryRun); err != nil {
116+
return errors.Wrap(err, "failed to update kubelet local mode")
117+
}
118+
}
119+
112120
return errorsutil.NewAggregate(errs)
113121
}
114122

@@ -281,3 +289,53 @@ func GetKubeletDir(dryRun bool) (string, error) {
281289
}
282290
return kubeadmconstants.KubeletRunDirectory, nil
283291
}
292+
293+
func UpdateKubeletLocalMode(cfg *kubeadmapi.InitConfiguration, dryRun bool) error {
294+
// TODO(chrischdi): how to get the correct dir? kubeadm init has a flag to change the location
295+
dir := kubeadmconstants.KubernetesDir
296+
297+
kubeletKubeConfigFilePath := filepath.Join(dir, kubeadmconstants.KubeletKubeConfigFileName)
298+
299+
if _, err := os.Stat(kubeletKubeConfigFilePath); err != nil {
300+
if os.IsNotExist(err) {
301+
// TODO(chrischdi): should we print a warning or even return the error?
302+
return nil
303+
}
304+
return err
305+
}
306+
307+
config, err := clientcmd.LoadFromFile(kubeletKubeConfigFilePath)
308+
if err != nil {
309+
return err
310+
}
311+
312+
configContext, ok := config.Contexts[config.CurrentContext]
313+
if !ok {
314+
return errors.Errorf("cannot find cluster for active context in kubeconfig %q", kubeletKubeConfigFilePath)
315+
}
316+
317+
localAPIEndpoint, err := kubeadmutil.GetLocalAPIEndpoint(&cfg.LocalAPIEndpoint)
318+
if err != nil {
319+
return err
320+
}
321+
322+
// Skip changing kubeconfig file if LocalAPIEndpoint is already set.
323+
if config.Clusters[configContext.Cluster].Server == localAPIEndpoint {
324+
return nil
325+
}
326+
327+
if dryRun {
328+
fmt.Printf("[dryrun] Would change the server url from %q to %q in %s and try to restart kubelet\n", localAPIEndpoint, config.Clusters[configContext.Cluster].Server, kubeletKubeConfigFilePath)
329+
return nil
330+
}
331+
332+
config.Clusters[configContext.Cluster].Server = localAPIEndpoint
333+
334+
if err := clientcmd.WriteToFile(*config, kubeletKubeConfigFilePath); err != nil {
335+
return err
336+
}
337+
338+
kubeletphase.TryRestartKubelet()
339+
340+
return nil
341+
}

0 commit comments

Comments
 (0)