I need to restrict an app/deployment to run on specific cpus only (say 0-3 or just 1 or 2 etc.) I found out about CPU Manager and tried implement it with static
policy but not able to achieve what I intend to.
I tried the following so far:
- Enabled cpu manager
static
policy on kubelet and verified that it is enabled - Reserved the cpu with
--reserved-cpus=0-3
option in the kubelet - Ran a sample nginx deployment with limits equal to requests and cpu of integer value i.e. QoS of guaranteed is ensured and able to validate the cpu affinity with
taskset -c -p $(pidof nginx)
So, this makes my nginx app to be restricted to run on all cpus other than reserved cpus (0-3), i.e. if my machine has 32 cpus, the app can run on any of the 4-31 cpus. And so can any other apps/deployments that will run. As I understand, the reserved cpus 0-3 will be reserved for system daemons, OS daemons etc.
My questions-
- Using the Kubernetes CPU Manager features, is it possible to pin certain cpu to an app/pod (in this case, my nginx app) to run on a specific cpu only (say 2 or 3 or 4-5)? If yes, how?
- If point number 1 is possible, can we perform the pinning at container level too i.e. say Pod A has two containers Container B and Container D. Is it possible to pin cpu 0-3 to Container B and cpu 4 to Container B?
- If none of this is possible using Kubernetes CPU Manager, what are the alternatives that are available at this point of time, if any?
After reading the documentation[1][2][3], and then doing some testing, the answer seems to be "no", at least with CPU Manager.
Despite this unclear snippet[1]:
What this actually means, as determined by testing, is that either
reserved-cpus
orkube-reserved
andsystem-reserved
can be set to dedicate CPUs that are not available for any pod to use. Settingkube-reserved
andsystem-reserved
will each be rounded up to the nearest whole CPU and have the corresponding number of CPUs removed from the set of all CPUs available to pods, starting with the lowest indexed CPUs when ordered by physical slot index. Or you can usereserved-cpus
, which will then ignorekube-reserved
andsystem-reserved
, and you can specify physical slot indexes of CPUs to remove and reserve from what's available to pods. In either case, the remaining CPUs are the only ones available for pods to run on.Separately, and in almost no way related to the prior paragraph it's part of, CPUs are allocated from the set of CPUs available to pods such that only
Guaranteed
QoS pods with whole number CPU requests will get whole CPUs exclusively dedicated to them. Basically it's just clarifying that pods meeting the requirements for theGuaranteed
QoS category and that also want an even number of whole CPUs, can guarantee they won't be time-sliced across multiple CPUs throughout their lifetime, or have to compete with other pods being time sliced onto the CPU they are using. But in all other cases, pods may/will/can be time-sliced across multiple CPUs.[1] https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/
[2] https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/
[3] https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/