Skip to content

Commit e12c2b6

Browse files
committed
cluster up: set docker cgroup driver on kubelet config
On kubelet versions that support the --enforce-node-allocatable argument, set the cgroup-driver flag to the one reported by docker. If the cgroup-driver is not systemd, also specify --enforce-node-allocatable and --cgroups-per-qos arguments.
1 parent dac5ddc commit e12c2b6

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

pkg/bootstrap/docker/dockerhelper/helper.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ func (h *Helper) dockerInfo() (*dockertypes.Info, error) {
7777
return h.info, nil
7878
}
7979

80+
func (h *Helper) CgroupDriver() (string, error) {
81+
info, err := h.dockerInfo()
82+
if err != nil {
83+
return "", err
84+
}
85+
return info.CgroupDriver, nil
86+
}
87+
8088
// HasInsecureRegistryArg checks whether the docker daemon is configured with
8189
// the appropriate insecure registry argument
8290
func (h *Helper) HasInsecureRegistryArg() (bool, error) {

pkg/bootstrap/docker/openshift/helper.go

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,10 @@ type StartOptions struct {
116116
}
117117

118118
// NewHelper creates a new OpenShift helper
119-
func NewHelper(client *docker.Client, hostHelper *host.HostHelper, image, containerName, publicHostname, routingSuffix string) *Helper {
119+
func NewHelper(client *docker.Client, dockerHelper *dockerhelper.Helper, hostHelper *host.HostHelper, image, containerName, publicHostname, routingSuffix string) *Helper {
120120
return &Helper{
121121
client: client,
122-
dockerHelper: dockerhelper.NewHelper(client, nil),
122+
dockerHelper: dockerHelper,
123123
execHelper: dockerexec.NewExecHelper(client, containerName),
124124
hostHelper: hostHelper,
125125
runHelper: run.NewRunHelper(client),
@@ -730,6 +730,23 @@ func (h *Helper) updateConfig(configDir string, opt *StartOptions) error {
730730
nodeCfg.DNSIP = ""
731731
}
732732
nodeCfg.DNSBindAddress = ""
733+
734+
if h.supportsEnforceNodeAllocatableArgument() {
735+
// Set the cgroup driver from the current docker
736+
cgroupDriver, err := h.dockerHelper.CgroupDriver()
737+
if err != nil {
738+
return err
739+
}
740+
if nodeCfg.KubeletArguments == nil {
741+
nodeCfg.KubeletArguments = configapi.ExtendedArguments{}
742+
}
743+
nodeCfg.KubeletArguments["cgroup-driver"] = []string{cgroupDriver}
744+
if cgroupDriver != "systemd" {
745+
nodeCfg.KubeletArguments["enforce-node-allocatable"] = []string{""}
746+
nodeCfg.KubeletArguments["cgroups-per-qos"] = []string{"false"}
747+
}
748+
}
749+
733750
cfgBytes, err = configapilatest.WriteYAML(nodeCfg)
734751
if err != nil {
735752
return err
@@ -784,3 +801,25 @@ func getUsedPorts(data string) map[int]struct{} {
784801
glog.V(2).Infof("Used ports in container: %#v", ports)
785802
return ports
786803
}
804+
805+
func (h *Helper) supportsEnforceNodeAllocatableArgument() bool {
806+
script := `#!/bin/bash
807+
808+
# Exit with an error
809+
set -e
810+
811+
# Ensure we have a link to the openshift binary named kubelet
812+
if [[ ! -f /usr/bin/kubelet ]]; then
813+
ln -s /usr/bin/openshift /usr/bin/kubelet
814+
fi
815+
816+
kubelet --help | grep -- "--enforce-node-allocatable"
817+
`
818+
rc, err := h.runHelper.New().Image(h.image).
819+
DiscardContainer().
820+
Entrypoint("/bin/bash").
821+
Command("-c", script).
822+
Run()
823+
824+
return rc == 0 && err == nil
825+
}

pkg/bootstrap/docker/up.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1071,7 +1071,7 @@ func (c *ClientStartConfig) Clients() (*client.Client, kclientset.Interface, err
10711071
// OpenShiftHelper returns a helper object to work with OpenShift on the server
10721072
func (c *CommonStartConfig) OpenShiftHelper() *openshift.Helper {
10731073
if c.openshiftHelper == nil {
1074-
c.openshiftHelper = openshift.NewHelper(c.dockerClient, c.HostHelper(), c.openshiftImage(), openshift.OpenShiftContainer, c.PublicHostname, c.RoutingSuffix)
1074+
c.openshiftHelper = openshift.NewHelper(c.dockerClient, c.DockerHelper(), c.HostHelper(), c.openshiftImage(), openshift.OpenShiftContainer, c.PublicHostname, c.RoutingSuffix)
10751075
}
10761076
return c.openshiftHelper
10771077
}

0 commit comments

Comments
 (0)