@@ -20,7 +20,6 @@ import (
20
20
"bytes"
21
21
"crypto"
22
22
"fmt"
23
- "html/template"
24
23
"os"
25
24
"path/filepath"
26
25
"strings"
@@ -44,48 +43,6 @@ type KubeadmBootstrapper struct {
44
43
c bootstrapper.CommandRunner
45
44
}
46
45
47
- // TODO(r2d4): template this with bootstrapper.KubernetesConfig
48
- const kubeletSystemdConf = `
49
- [Service]
50
- Environment="KUBELET_KUBECONFIG_ARGS=--kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true"
51
- Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
52
- Environment="KUBELET_DNS_ARGS=--cluster-dns=10.0.0.10 --cluster-domain=cluster.local"
53
- Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
54
- Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
55
- ExecStart=
56
- ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_DNS_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CGROUP_ARGS $KUBELET_EXTRA_ARGS
57
- `
58
-
59
- const kubeletService = `
60
- [Unit]
61
- Description=kubelet: The Kubernetes Node Agent
62
- Documentation=http://kubernetes.io/docs/
63
-
64
- [Service]
65
- ExecStart=/usr/bin/kubelet
66
- Restart=always
67
- StartLimitInterval=0
68
- RestartSec=10
69
-
70
- [Install]
71
- WantedBy=multi-user.target
72
- `
73
-
74
- const kubeadmConfigTmpl = `
75
- apiVersion: kubeadm.k8s.io/v1alpha1
76
- kind: MasterConfiguration
77
- api:
78
- advertiseAddress: {{.AdvertiseAddress}}
79
- bindPort: {{.APIServerPort}}
80
- kubernetesVersion: {{.KubernetesVersion}}
81
- certificatesDir: {{.CertDir}}
82
- networking:
83
- serviceSubnet: {{.ServiceCIDR}}
84
- etcd:
85
- dataDir: {{.EtcdDataDir}}
86
- nodeName: {{.NodeName}}
87
- `
88
-
89
46
func NewKubeadmBootstrapper (api libmachine.API ) (* KubeadmBootstrapper , error ) {
90
47
h , err := api .Load (config .GetMachineName ())
91
48
if err != nil {
@@ -147,10 +104,8 @@ func (k *KubeadmBootstrapper) GetClusterLogs(follow bool) (string, error) {
147
104
func (k * KubeadmBootstrapper ) StartCluster (k8s bootstrapper.KubernetesConfig ) error {
148
105
// We use --skip-preflight-checks since we have our own custom addons
149
106
// that we also stick in /etc/kubernetes/manifests
150
- kubeadmTmpl := "sudo /usr/bin/kubeadm init --config {{.KubeadmConfigFile}} --skip-preflight-checks"
151
- t := template .Must (template .New ("kubeadmTmpl" ).Parse (kubeadmTmpl ))
152
107
b := bytes.Buffer {}
153
- if err := t .Execute (& b , struct { KubeadmConfigFile string }{constants .KubeadmConfigFile }); err != nil {
108
+ if err := kubeadmInitTemplate .Execute (& b , struct { KubeadmConfigFile string }{constants .KubeadmConfigFile }); err != nil {
154
109
return err
155
110
}
156
111
@@ -197,22 +152,14 @@ func addAddons(files *[]assets.CopyableFile) error {
197
152
}
198
153
199
154
func (k * KubeadmBootstrapper ) RestartCluster (k8s bootstrapper.KubernetesConfig ) error {
200
- restoreTmpl := `
201
- sudo kubeadm alpha phase certs all --config {{.KubeadmConfigFile}} &&
202
- sudo /usr/bin/kubeadm alpha phase kubeconfig all --config {{.KubeadmConfigFile}} &&
203
- sudo /usr/bin/kubeadm alpha phase controlplane all --config {{.KubeadmConfigFile}} &&
204
- sudo /usr/bin/kubeadm alpha phase etcd local --config {{.KubeadmConfigFile}}
205
- `
206
- t := template .Must (template .New ("restoreTmpl" ).Parse (restoreTmpl ))
207
-
208
155
opts := struct {
209
156
KubeadmConfigFile string
210
157
}{
211
158
KubeadmConfigFile : constants .KubeadmConfigFile ,
212
159
}
213
160
214
161
b := bytes.Buffer {}
215
- if err := t .Execute (& b , opts ); err != nil {
162
+ if err := kubeadmRestoreTemplate .Execute (& b , opts ); err != nil {
216
163
return err
217
164
}
218
165
@@ -231,19 +178,44 @@ func (k *KubeadmBootstrapper) SetupCerts(k8s bootstrapper.KubernetesConfig) erro
231
178
return bootstrapper .SetupCerts (k .c , k8s )
232
179
}
233
180
181
+ func NewKubeletConfig (k8s bootstrapper.KubernetesConfig ) (string , error ) {
182
+ version , err := ParseKubernetesVersion (k8s .KubernetesVersion )
183
+ if err != nil {
184
+ return "" , errors .Wrap (err , "parsing kubernetes version" )
185
+ }
186
+
187
+ extraOpts , err := ExtraConfigForComponent (Kubelet , k8s .ExtraOptions , version )
188
+ if err != nil {
189
+ return "" , errors .Wrap (err , "generating extra configuration for kubelet" )
190
+ }
191
+
192
+ extraFlags := convertToFlags (extraOpts )
193
+ b := bytes.Buffer {}
194
+ if err := kubeletSystemdTemplate .Execute (& b , map [string ]string {"ExtraOptions" : extraFlags }); err != nil {
195
+ return "" , err
196
+ }
197
+
198
+ return b .String (), nil
199
+ }
200
+
234
201
func (k * KubeadmBootstrapper ) UpdateCluster (cfg bootstrapper.KubernetesConfig ) error {
235
202
if cfg .ShouldLoadCachedImages {
236
203
// Make best effort to load any cached images
237
204
go machine .LoadImages (k .c , constants .GetKubeadmCachedImages (cfg .KubernetesVersion ), constants .ImageCacheDir )
238
205
}
239
- kubeadmCfg , err := k . generateConfig (cfg )
206
+ kubeadmCfg , err := generateConfig (cfg )
240
207
if err != nil {
241
208
return errors .Wrap (err , "generating kubeadm cfg" )
242
209
}
243
210
211
+ kubeletCfg , err := NewKubeletConfig (cfg )
212
+ if err != nil {
213
+ return errors .Wrap (err , "generating kubelet config" )
214
+ }
215
+
244
216
files := []assets.CopyableFile {
245
217
assets .NewMemoryAssetTarget ([]byte (kubeletService ), constants .KubeletServiceFile , "0640" ),
246
- assets .NewMemoryAssetTarget ([]byte (kubeletSystemdConf ), constants .KubeletSystemdConfFile , "0640" ),
218
+ assets .NewMemoryAssetTarget ([]byte (kubeletCfg ), constants .KubeletSystemdConfFile , "0640" ),
247
219
assets .NewMemoryAssetTarget ([]byte (kubeadmCfg ), constants .KubeadmConfigFile , "0640" ),
248
220
}
249
221
@@ -290,9 +262,17 @@ sudo systemctl start kubelet
290
262
return nil
291
263
}
292
264
293
- func (k * KubeadmBootstrapper ) generateConfig (k8s bootstrapper.KubernetesConfig ) (string , error ) {
294
- t := template .Must (template .New ("kubeadmConfigTmpl" ).Parse (kubeadmConfigTmpl ))
265
+ func generateConfig (k8s bootstrapper.KubernetesConfig ) (string , error ) {
266
+ version , err := ParseKubernetesVersion (k8s .KubernetesVersion )
267
+ if err != nil {
268
+ return "" , errors .Wrap (err , "parsing kubernetes version" )
269
+ }
295
270
271
+ // generates a map of component to extra args for apiserver, controller-manager, and scheduler
272
+ extraComponentConfig , err := NewComponentExtraArgs (k8s .ExtraOptions , version )
273
+ if err != nil {
274
+ return "" , errors .Wrap (err , "generating extra component config for kubeadm" )
275
+ }
296
276
opts := struct {
297
277
CertDir string
298
278
ServiceCIDR string
@@ -301,6 +281,7 @@ func (k *KubeadmBootstrapper) generateConfig(k8s bootstrapper.KubernetesConfig)
301
281
KubernetesVersion string
302
282
EtcdDataDir string
303
283
NodeName string
284
+ ExtraArgs []ComponentExtraArgs
304
285
}{
305
286
CertDir : util .DefaultCertPath ,
306
287
ServiceCIDR : util .DefaultInsecureRegistry ,
@@ -309,10 +290,11 @@ func (k *KubeadmBootstrapper) generateConfig(k8s bootstrapper.KubernetesConfig)
309
290
KubernetesVersion : k8s .KubernetesVersion ,
310
291
EtcdDataDir : "/data" , //TODO(r2d4): change to something else persisted
311
292
NodeName : k8s .NodeName ,
293
+ ExtraArgs : extraComponentConfig ,
312
294
}
313
295
314
296
b := bytes.Buffer {}
315
- if err := t .Execute (& b , opts ); err != nil {
297
+ if err := kubeadmConfigTemplate .Execute (& b , opts ); err != nil {
316
298
return "" , err
317
299
}
318
300
0 commit comments