...
1
16
17 package kubelet
18
19 import (
20 "fmt"
21 "os"
22 "path/filepath"
23 "strings"
24
25 "github.com/pkg/errors"
26
27 "k8s.io/klog/v2"
28
29 nodeutil "k8s.io/component-helpers/node/util"
30 kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
31 "k8s.io/kubernetes/cmd/kubeadm/app/constants"
32 "k8s.io/kubernetes/cmd/kubeadm/app/images"
33 kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
34 )
35
36 type kubeletFlagsOpts struct {
37 nodeRegOpts *kubeadmapi.NodeRegistrationOptions
38 pauseImage string
39 registerTaintsUsingFlags bool
40 }
41
42
43
44
45
46
47
48 func GetNodeNameAndHostname(cfg *kubeadmapi.NodeRegistrationOptions) (string, string, error) {
49 hostname, err := nodeutil.GetHostname("")
50 nodeName := hostname
51 if cfg.Name != "" {
52 nodeName = cfg.Name
53 }
54 if name, idx := kubeadmapi.GetArgValue(cfg.KubeletExtraArgs, "hostname-override", -1); idx > -1 {
55 nodeName = name
56 }
57 return nodeName, hostname, err
58 }
59
60
61
62 func WriteKubeletDynamicEnvFile(cfg *kubeadmapi.ClusterConfiguration, nodeReg *kubeadmapi.NodeRegistrationOptions, registerTaintsUsingFlags bool, kubeletDir string) error {
63 flagOpts := kubeletFlagsOpts{
64 nodeRegOpts: nodeReg,
65 pauseImage: images.GetPauseImage(cfg),
66 registerTaintsUsingFlags: registerTaintsUsingFlags,
67 }
68 stringMap := buildKubeletArgs(flagOpts)
69 argList := kubeadmutil.ArgumentsToCommand(stringMap, nodeReg.KubeletExtraArgs)
70 envFileContent := fmt.Sprintf("%s=%q\n", constants.KubeletEnvFileVariableName, strings.Join(argList, " "))
71
72 return writeKubeletFlagBytesToDisk([]byte(envFileContent), kubeletDir)
73 }
74
75
76
77 func buildKubeletArgsCommon(opts kubeletFlagsOpts) []kubeadmapi.Arg {
78 kubeletFlags := []kubeadmapi.Arg{}
79 kubeletFlags = append(kubeletFlags, kubeadmapi.Arg{Name: "container-runtime-endpoint", Value: opts.nodeRegOpts.CRISocket})
80
81
82
83 if opts.pauseImage != "" {
84 kubeletFlags = append(kubeletFlags, kubeadmapi.Arg{Name: "pod-infra-container-image", Value: opts.pauseImage})
85 }
86
87 if opts.registerTaintsUsingFlags && opts.nodeRegOpts.Taints != nil && len(opts.nodeRegOpts.Taints) > 0 {
88 taintStrs := []string{}
89 for _, taint := range opts.nodeRegOpts.Taints {
90 taintStrs = append(taintStrs, taint.ToString())
91 }
92 kubeletFlags = append(kubeletFlags, kubeadmapi.Arg{Name: "register-with-taints", Value: strings.Join(taintStrs, ",")})
93 }
94
95
96 nodeName, hostname, err := GetNodeNameAndHostname(opts.nodeRegOpts)
97 if err != nil {
98 klog.Warning(err)
99 }
100 if nodeName != hostname {
101 klog.V(1).Infof("setting kubelet hostname-override to %q", nodeName)
102 kubeletFlags = append(kubeletFlags, kubeadmapi.Arg{Name: "hostname-override", Value: nodeName})
103 }
104
105 return kubeletFlags
106 }
107
108
109 func writeKubeletFlagBytesToDisk(b []byte, kubeletDir string) error {
110 kubeletEnvFilePath := filepath.Join(kubeletDir, constants.KubeletEnvFileName)
111 fmt.Printf("[kubelet-start] Writing kubelet environment file with flags to file %q\n", kubeletEnvFilePath)
112
113
114 if err := os.MkdirAll(kubeletDir, 0700); err != nil {
115 return errors.Wrapf(err, "failed to create directory %q", kubeletDir)
116 }
117 if err := os.WriteFile(kubeletEnvFilePath, b, 0644); err != nil {
118 return errors.Wrapf(err, "failed to write kubelet configuration to the file %q", kubeletEnvFilePath)
119 }
120 return nil
121 }
122
123
124
125 func buildKubeletArgs(opts kubeletFlagsOpts) []kubeadmapi.Arg {
126 return buildKubeletArgsCommon(opts)
127 }
128
View as plain text