// startKubelet starts the Kubelet in a separate process or returns an error // if the Kubelet fails to start. func (e *E2EServices) startKubelet() (*server, error) { glog.Info("Starting kubelet") var killCommand, restartCommand *exec.Cmd cmdArgs := []string{} if systemdRun, err := exec.LookPath("systemd-run"); err == nil { // On systemd services, detection of a service / unit works reliably while // detection of a process started from an ssh session does not work. // Since kubelet will typically be run as a service it also makes more // sense to test it that way unitName := fmt.Sprintf("kubelet-%d.service", rand.Int31()) cmdArgs = append(cmdArgs, systemdRun, "--unit="+unitName, "--remain-after-exit", builder.GetKubeletServerBin()) killCommand = exec.Command("systemctl", "kill", unitName) restartCommand = exec.Command("systemctl", "restart", unitName) e.logFiles["kubelet.log"] = logFileData{ journalctlCommand: []string{"-u", unitName}, } framework.TestContext.EvictionHard = adjustConfigForSystemd(framework.TestContext.EvictionHard) } else { cmdArgs = append(cmdArgs, builder.GetKubeletServerBin()) cmdArgs = append(cmdArgs, "--runtime-cgroups=/docker-daemon", "--kubelet-cgroups=/kubelet", "--cgroup-root=/", "--system-cgroups=/system", ) } cmdArgs = append(cmdArgs, "--api-servers", getAPIServerClientURL(), "--address", "0.0.0.0", "--port", kubeletPort, "--read-only-port", kubeletReadOnlyPort, "--volume-stats-agg-period", "10s", // Aggregate volumes frequently so tests don't need to wait as long "--allow-privileged", "true", "--serialize-image-pulls", "false", "--config", framework.TestContext.ManifestPath, "--file-check-frequency", "10s", // Check file frequently so tests won't wait too long "--pod-cidr=10.180.0.0/24", // Assign a fixed CIDR to the node because there is no node controller. "--eviction-hard", framework.TestContext.EvictionHard, "--eviction-pressure-transition-period", "30s", "--feature-gates", framework.TestContext.FeatureGates, "--v", LOG_VERBOSITY_LEVEL, "--logtostderr", "--experimental-mounter-path", framework.TestContext.MounterPath, ) if framework.TestContext.NodeName != "" { // If node name is specified, set hostname override. cmdArgs = append(cmdArgs, "--hostname-override", framework.TestContext.NodeName) } if framework.TestContext.EnableCRI { cmdArgs = append(cmdArgs, "--experimental-cri", "true") // Whether to use experimental cri integration. } if framework.TestContext.ContainerRuntimeEndpoint != "" { cmdArgs = append(cmdArgs, "--container-runtime-endpoint", framework.TestContext.ContainerRuntimeEndpoint) } if framework.TestContext.CgroupsPerQOS { cmdArgs = append(cmdArgs, "--cgroups-per-qos", "true", "--cgroup-root", "/", ) } if framework.TestContext.CgroupDriver != "" { cmdArgs = append(cmdArgs, "--cgroup-driver", framework.TestContext.CgroupDriver, ) } if !framework.TestContext.DisableKubenet { cwd, err := os.Getwd() if err != nil { return nil, err } cmdArgs = append(cmdArgs, "--network-plugin=kubenet", // TODO(random-liu): Make sure the cni directory name is the same with that in remote/remote.go "--network-plugin-dir", filepath.Join(cwd, "cni", "bin")) // Enable kubenet } cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) server := newServer( "kubelet", cmd, killCommand, restartCommand, []string{kubeletHealthCheckURL}, "kubelet.log", e.monitorParent, true /* restartOnExit */) return server, server.start() }
// startKubelet starts the Kubelet in a separate process or returns an error // if the Kubelet fails to start. func (e *E2EServices) startKubelet() (*server, error) { glog.Info("Starting kubelet") // Create pod manifest path manifestPath, err := createPodManifestDirectory() if err != nil { return nil, err } e.rmDirs = append(e.rmDirs, manifestPath) var killCommand, restartCommand *exec.Cmd var isSystemd bool // Apply default kubelet flags. cmdArgs := []string{} if systemdRun, err := exec.LookPath("systemd-run"); err == nil { // On systemd services, detection of a service / unit works reliably while // detection of a process started from an ssh session does not work. // Since kubelet will typically be run as a service it also makes more // sense to test it that way isSystemd = true unitName := fmt.Sprintf("kubelet-%d.service", rand.Int31()) cmdArgs = append(cmdArgs, systemdRun, "--unit="+unitName, "--remain-after-exit", builder.GetKubeletServerBin()) killCommand = exec.Command("systemctl", "kill", unitName) restartCommand = exec.Command("systemctl", "restart", unitName) e.logFiles["kubelet.log"] = logFileData{ journalctlCommand: []string{"-u", unitName}, } } else { cmdArgs = append(cmdArgs, builder.GetKubeletServerBin()) cmdArgs = append(cmdArgs, "--runtime-cgroups=/docker-daemon", "--kubelet-cgroups=/kubelet", "--cgroup-root=/", "--system-cgroups=/system", ) } cmdArgs = append(cmdArgs, "--api-servers", getAPIServerClientURL(), "--address", "0.0.0.0", "--port", kubeletPort, "--read-only-port", kubeletReadOnlyPort, "--volume-stats-agg-period", "10s", // Aggregate volumes frequently so tests don't need to wait as long "--allow-privileged", "true", "--serialize-image-pulls", "false", "--config", manifestPath, "--file-check-frequency", "10s", // Check file frequently so tests won't wait too long "--pod-cidr", "10.180.0.0/24", // Assign a fixed CIDR to the node because there is no node controller. "--eviction-pressure-transition-period", "30s", // Apply test framework feature gates by default. This could also be overridden // by kubelet-flags. "--feature-gates", framework.TestContext.FeatureGates, "--eviction-hard", "memory.available<250Mi,nodefs.available<10%,nodefs.inodesFree<5%", // The hard eviction thresholds. "--eviction-minimum-reclaim", "nodefs.available=5%,nodefs.inodesFree=5%", // The minimum reclaimed resources after eviction. "--v", LOG_VERBOSITY_LEVEL, "--logtostderr", ) // Enable kubenet by default. cniDir, err := getCNIDirectory() if err != nil { return nil, err } cmdArgs = append(cmdArgs, "--network-plugin=kubenet", "--network-plugin-dir", cniDir) // Keep hostname override for convenience. if framework.TestContext.NodeName != "" { // If node name is specified, set hostname override. cmdArgs = append(cmdArgs, "--hostname-override", framework.TestContext.NodeName) } // Override the default kubelet flags. cmdArgs = append(cmdArgs, kubeletArgs...) // Adjust the args if we are running kubelet with systemd. if isSystemd { adjustArgsForSystemd(cmdArgs) } cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) server := newServer( "kubelet", cmd, killCommand, restartCommand, []string{kubeletHealthCheckURL}, "kubelet.log", e.monitorParent, true /* restartOnExit */) return server, server.start() }