| #!/bin/bash |
| # |
| # Copyright (c) 2019 Wind River Systems, Inc. |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # This script does minimal cgroup setup for kubelet. This creates k8s-infra |
| # cgroup for a minimal set of resource controllers, and configures cpuset |
| # attributes to span all online cpus and nodes. This will do nothing if |
| # the k8s-infra cgroup already exists (i.e., assume already configured). |
| # NOTE: The creation of directories under /sys/fs/cgroup is volatile, and |
| # does not persist reboots. The cpuset.mems and cpuset.cpus is later updated |
| # by puppet kubernetes.pp manifest. |
| # |
| |
| # Define minimal path |
| PATH=/bin:/usr/bin:/usr/local/bin |
| |
| # Log info message to /var/log/daemon.log |
| function LOG { |
| logger -p daemon.info "$0($$): $@" |
| } |
| |
| # Log error message to /var/log/daemon.log |
| function ERROR { |
| logger -s -p daemon.error "$0($$): ERROR: $@" |
| } |
| |
| # Create minimal cgroup directories and configure cpuset attributes |
| # pids should be first in the list, since it appears to get auto deleted |
| function create_cgroup { |
| local cg_name=$1 |
| local cg_nodeset=$2 |
| local cg_cpuset=$3 |
| |
| local CGROUP=/sys/fs/cgroup |
| local CONTROLLERS=("pids" "cpuset" "memory" "cpu,cpuacct" "systemd") |
| local cnt='' |
| local CGDIR='' |
| local RC=0 |
| |
| # Create the cgroup for required controllers |
| for cnt in ${CONTROLLERS[@]}; do |
| CGDIR=${CGROUP}/${cnt}/${cg_name} |
| if [ -d ${CGDIR} ]; then |
| LOG "Nothing to do, already configured: ${CGDIR}." |
| exit ${RC} |
| fi |
| LOG "Creating: ${CGDIR}" |
| mkdir -p ${CGDIR} |
| RC=$? |
| if [ ${RC} -ne 0 ]; then |
| ERROR "Creating: ${CGDIR}, rc=${RC}" |
| exit ${RC} |
| fi |
| done |
| |
| # Customize cpuset attributes |
| LOG "Configuring cgroup: ${cg_name}, nodeset: ${cg_nodeset}, cpuset: ${cg_cpuset}" |
| CGDIR=${CGROUP}/cpuset/${cg_name} |
| local CGMEMS=${CGDIR}/cpuset.mems |
| local CGCPUS=${CGDIR}/cpuset.cpus |
| local CGTASKS=${CGDIR}/tasks |
| |
| # Assign cgroup memory nodeset |
| LOG "Assign nodeset ${cg_nodeset} to ${CGMEMS}" |
| /bin/echo ${cg_nodeset} > ${CGMEMS} |
| RC=$? |
| if [ ${RC} -ne 0 ]; then |
| ERROR "Unable to write to: ${CGMEMS}, rc=${RC}" |
| exit ${RC} |
| fi |
| |
| # Assign cgroup cpus |
| LOG "Assign cpuset ${cg_cpuset} to ${CGCPUS}" |
| /bin/echo ${cg_cpuset} > ${CGCPUS} |
| RC=$? |
| if [ ${RC} -ne 0 ]; then |
| ERROR "Assigning: ${cg_cpuset} to ${CGCPUS}, rc=${RC}" |
| exit ${RC} |
| fi |
| |
| # Set file ownership |
| chown root:root ${CGMEMS} ${CGCPUS} ${CGTASKS} |
| RC=$? |
| if [ ${RC} -ne 0 ]; then |
| ERROR "Setting owner for: ${CGMEMS}, ${CGCPUS}, ${CGTASKS}, rc=${RC}" |
| exit ${RC} |
| fi |
| |
| # Set file mode permissions |
| chmod 644 ${CGMEMS} ${CGCPUS} ${CGTASKS} |
| RC=$? |
| if [ ${RC} -ne 0 ]; then |
| ERROR "Setting mode for: ${CGMEMS}, ${CGCPUS}, ${CGTASKS}, rc=${RC}" |
| exit ${RC} |
| fi |
| |
| return ${RC} |
| } |
| |
| if [ $UID -ne 0 ]; then |
| ERROR "Require sudo/root." |
| exit 1 |
| fi |
| |
| # Configure default kubepods cpuset to span all online cpus and nodes. |
| ONLINE_NODESET=$(/bin/cat /sys/devices/system/node/online) |
| ONLINE_CPUSET=$(/bin/cat /sys/devices/system/cpu/online) |
| |
| # Configure kubelet cgroup to match cgroupRoot. |
| create_cgroup 'k8s-infra' ${ONLINE_NODESET} ${ONLINE_CPUSET} |
| |
| exit $? |
| |