-
Notifications
You must be signed in to change notification settings - Fork 488
/
kubelet.go
112 lines (97 loc) · 3.51 KB
/
kubelet.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package service
import (
"fmt"
"io/ioutil"
"os"
"strings"
"github.com/autonomy/dianemo/src/initramfs/cmd/init/pkg/constants"
"github.com/autonomy/dianemo/src/initramfs/cmd/init/pkg/service/conditions"
"github.com/autonomy/dianemo/src/initramfs/pkg/userdata"
)
// Kubelet implements the Service interface. It serves as the concrete type with
// the required methods.
type Kubelet struct{}
// Pre implements the Service interface.
func (p *Kubelet) Pre(data userdata.UserData) error {
if err := os.Mkdir("/run/flannel", os.ModeDir); err != nil {
return fmt.Errorf("create /run/flannel: %s", err.Error())
}
if err := os.MkdirAll("/etc/cni/net.d", os.ModeDir); err != nil {
return fmt.Errorf("create /etc/cni/net.d: %s", err.Error())
}
if err := os.MkdirAll("/etc/kubernetes/manifests", os.ModeDir); err != nil {
return fmt.Errorf("create /etc/kubernetes/manifests: %s", err.Error())
}
if err := os.MkdirAll("/var/lib/kubelet", os.ModeDir); err != nil {
return fmt.Errorf("create /var/lib/kubelet: %s", err.Error())
}
return nil
}
// Post implements the Service interface.
func (p *Kubelet) Post(data userdata.UserData) (err error) {
return nil
}
// Cmd implements the Service interface.
func (p *Kubelet) Cmd(data userdata.UserData, cmdArgs *CmdArgs) error {
cmdArgs.Name = "kubelet"
cmdArgs.Path = "/bin/docker"
cmdArgs.Args = []string{
"run",
"--volume=/dev:/dev:shared",
"--volume=/sys:/sys:ro",
"--volume=/sys/fs/cgroup:/sys/fs/cgroup:rw",
"--volume=/var/run:/var/run:rw",
"--volume=/run:/run:rw",
"--volume=/var/lib/docker:/var/lib/docker:rw",
"--volume=/var/lib/kubelet:/var/lib/kubelet:rshared",
"--volume=/var/log:/var/log",
"--volume=/etc/cni:/etc/cni:ro",
"--volume=/etc/kubernetes:/etc/kubernetes:shared",
"--volume=/etc/os-release:/etc/os-release:ro",
"--volume=/etc/ssl/certs:/etc/ssl/certs:ro",
"--volume=/lib/modules:/lib/modules:ro",
"--volume=/var/libexec/kubernetes:/usr/libexec/kubernetes:shared",
"--rm",
"--net=host",
"--pid=host",
"--privileged",
"--name=kubelet",
"gcr.io/google_containers/hyperkube:v1.11.2",
"/hyperkube",
"kubelet",
}
kubeletArgs := []string{
"--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf",
"--kubeconfig=/etc/kubernetes/kubelet.conf",
"--config=/var/lib/kubelet/config.yaml",
}
fileBytes, err := ioutil.ReadFile("/var/lib/kubelet/kubeadm-flags.env")
if err != nil {
return err
}
argsString := strings.TrimPrefix(string(fileBytes), "KUBELET_KUBEADM_ARGS=")
argsString = strings.TrimSuffix(argsString, "\n")
kubeletArgs = append(kubeletArgs, strings.Split(argsString, " ")...)
cmdArgs.Args = append(cmdArgs.Args, kubeletArgs...)
switch data.Services.Kubeadm.ContainerRuntime {
case constants.ContainerRuntimeCRIO:
cmdArgs.Args = append(cmdArgs.Args, "--container-runtime=remote", "--container-runtime-endpoint=unix:///var/run/crio/crio.sock")
default:
}
return nil
}
// Condition implements the Service interface.
func (p *Kubelet) Condition(data userdata.UserData) func() (bool, error) {
switch data.Services.Kubeadm.ContainerRuntime {
case constants.ContainerRuntimeDocker:
return conditions.WaitForFileExists("/var/lib/kubelet/kubeadm-flags.env")
case constants.ContainerRuntimeCRIO:
return conditions.WaitForFilesToExist("/var/lib/kubelet/kubeadm-flags.env", "/etc/containers/policy.json")
default:
return conditions.None()
}
}
// Env implements the Service interface.
func (p *Kubelet) Env() []string { return []string{} }
// Type implements the Service interface.
func (p *Kubelet) Type() Type { return Forever }