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
staticpolicy on kubelet and verified that it is enabled - Reserved the cpu with
--reserved-cpus=0-3option 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-cpusorkube-reservedandsystem-reservedcan be set to dedicate CPUs that are not available for any pod to use. Settingkube-reservedandsystem-reservedwill 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-reservedandsystem-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
GuaranteedQoS 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 theGuaranteedQoS 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/