All manifests should be applied automatically on a new cluster via make deploy, in case if you want to test each feature separately, refer to the feature section.
Before you apply any feature, you should:
- add
worker-rtrole to relevant nodesoc label node <node_name> node-role.kubernetes.io/worker-rt= - add
worker-rtmachine config pooloc apply -f ../mcp/00-mcp-worker-rt.yaml
This is a list of environment variables that you should export before running make generate.
ISOLATED_CPUS- CPU's that you want to isolate from the system usage.NON_ISOLATED_CPUS- CPU's that you want to reserve for OS system tasks.RESERVED_CPUS- CPU's that you want to reserve for the system and does not use for containers workloads.HUGEPAGES_NUMBER- Number of 1Gb hugepages to enable.RT_REPO_URL- the location of a yum repo which provides the RT kernel RPMs as long as they are not part of RHCOS yet.
Defaults to a RH internal URL. For deployments outside the RH network provide a yum repo on a reachable host and update this URL.
To configure your own yum repo check the link.
To verify huge pages feature functionality:
- run
make generate - apply huge pages kernel boot parameters config via
oc create -f manifests/generated/10-machine-config-worker-rt-kargs.yaml - wait for workers update
oc wait machineconfigpools worker-rt --for condition=Updating --timeout=1800s
oc wait machineconfigpools worker-rt --for condition=Updated --timeout=1800s- create the huge pages pod via
oc create -f examples/hugepages-pod.yaml - get pod UID by running
oc get pods -o custom-columns=NAME:.metadata.name,UID:.metadata.uid,HOST_IP:.status.hostIP - now you can find the specific cgroup under the host where the pod is running and check hugepages limit
cat /sys/fs/cgroup/hugetlb/kubepods.slice/kubepods-pod<pod_uid>.slice/hugetlb.1GB.limit_in_bytes - under the pod you can check the huge pages mount
mount | grep hugepages
The realtime kernel will be installed using MachineConfig, which installs a new systemd unit, which runs a script.
The template for the MachineConfig placed under manifests/templates and the script located in assets. The actual manifest is created by running make generate,
which will base64 encode the script and put it into the template. The result is stored under manifests/generated/11-machine-config-worker-rt-kernel.yaml.
To enable the CPU manager, you should:
make generate- enable CPU static policy via
KubeletConfiguration,oc create -f manifests/generated/12-kubeletconfig-worker-rt - wait for workers update
oc wait machineconfigpools worker-rt --for condition=Updating --timeout=1800s
oc wait machineconfigpools worker-rt --for condition=Updated --timeout=1800sTo enable the topology manager, you should:
- enable the topology manager feature gate
oc replace -f manifests/12-feature-gate-latency-sensitive.yaml - wait for workers update
oc wait machineconfigpools worker-rt --for condition=Updating --timeout=1800s
oc wait machineconfigpools worker-rt --for condition=Updated --timeout=1800s- update the kubelet configuration
oc apply -f manifests/12-kubeletconfig-worker-rt.yaml - wait for workers update
oc wait machineconfigpools worker-rt --for condition=Updating --timeout=1800s
oc wait machineconfigpools worker-rt --for condition=Updated --timeout=1800s- verify that kubelet configuration on the
worker-rtupdated with relevant parameters
cat /etc/kubernetes/kubelet.conf
{
"kind":"KubeletConfiguration",
...
"topologyManagerPolicy":"best-effort",
"featureGates": {
...
"TopologyManager":true,
...
},
}