--- title: Configure Minimum and Maximum CPU Constraints for a Namespace content_template: templates/task weight: 40 --- {{% capture overview %}} This page shows how to set minimum and maximum values for the CPU resources used by Containers and Pods in a namespace. You specify minimum and maximum CPU values in a [LimitRange](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core) object. If a Pod does not meet the constraints imposed by the LimitRange, it cannot be created in the namespace. {{% /capture %}} {{% capture prerequisites %}} {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} Each node in your cluster must have at least 1 CPU. {{% /capture %}} {{% capture steps %}} ## Create a namespace Create a namespace so that the resources you create in this exercise are isolated from the rest of your cluster. ```shell kubectl create namespace constraints-cpu-example ``` ## Create a LimitRange and a Pod Here's the configuration file for a LimitRange: {{< codenew file="admin/resource/cpu-constraints.yaml" >}} Create the LimitRange: ```shell kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints.yaml --namespace=constraints-cpu-example ``` View detailed information about the LimitRange: ```shell kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example ``` The output shows the minimum and maximum CPU constraints as expected. But notice that even though you didn't specify default values in the configuration file for the LimitRange, they were created automatically. ```yaml limits: - default: cpu: 800m defaultRequest: cpu: 800m max: cpu: 800m min: cpu: 200m type: Container ``` Now whenever a Container is created in the constraints-cpu-example namespace, Kubernetes performs these steps: * If the Container does not specify its own CPU request and limit, assign the default CPU request and limit to the Container. * Verify that the Container specifies a CPU request that is greater than or equal to 200 millicpu. * Verify that the Container specifies a CPU limit that is less than or equal to 800 millicpu. {{< note >}} **Note:** When creating a `LimitRange` object, you can specify limits on huge-pages or GPUs as well. However, when both `default` and `defaultRequest` are specified on these resources, the two values must be the same. {{< /note >}} Here's the configuration file for a Pod that has one Container. The Container manifest specifies a CPU request of 500 millicpu and a CPU limit of 800 millicpu. These satisfy the minimum and maximum CPU constraints imposed by the LimitRange. {{< codenew file="admin/resource/cpu-constraints-pod.yaml" >}} Create the Pod: ```shell kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints-pod.yaml --namespace=constraints-cpu-example ``` Verify that the Pod's Container is running: ```shell kubectl get pod constraints-cpu-demo --namespace=constraints-cpu-example ``` View detailed information about the Pod: ```shell kubectl get pod constraints-cpu-demo --output=yaml --namespace=constraints-cpu-example ``` The output shows that the Container has a CPU request of 500 millicpu and CPU limit of 800 millicpu. These satisfy the constraints imposed by the LimitRange. ```yaml resources: limits: cpu: 800m requests: cpu: 500m ``` ## Delete the Pod ```shell kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example ``` ## Attempt to create a Pod that exceeds the maximum CPU constraint Here's the configuration file for a Pod that has one Container. The Container specifies a CPU request of 500 millicpu and a cpu limit of 1.5 cpu. {{< codenew file="admin/resource/cpu-constraints-pod-2.yaml" >}} Attempt to create the Pod: ```shell kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-2.yaml --namespace=constraints-cpu-example ``` The output shows that the Pod does not get created, because the Container specifies a CPU limit that is too large: ``` Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-2.yaml": pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m. ``` ## Attempt to create a Pod that does not meet the minimum CPU request Here's the configuration file for a Pod that has one Container. The Container specifies a CPU request of 100 millicpu and a CPU limit of 800 millicpu. {{< codenew file="admin/resource/cpu-constraints-pod-3.yaml" >}} Attempt to create the Pod: ```shell kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-3.yaml --namespace=constraints-cpu-example ``` The output shows that the Pod does not get created, because the Container specifies a CPU request that is too small: ``` Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-3.yaml": pods "constraints-cpu-demo-4" is forbidden: minimum cpu usage per Container is 200m, but request is 100m. ``` ## Create a Pod that does not specify any CPU request or limit Here's the configuration file for a Pod that has one Container. The Container does not specify a CPU request, and it does not specify a CPU limit. {{< codenew file="admin/resource/cpu-constraints-pod-4.yaml" >}} Create the Pod: ```shell kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-4.yaml --namespace=constraints-cpu-example ``` View detailed information about the Pod: ``` kubectl get pod constraints-cpu-demo-4 --namespace=constraints-cpu-example --output=yaml ``` The output shows that the Pod's Container has a CPU request of 800 millicpu and a CPU limit of 800 millicpu. How did the Container get those values? ```yaml resources: limits: cpu: 800m requests: cpu: 800m ``` Because your Container did not specify its own CPU request and limit, it was given the [default CPU request and limit](/docs/tasks/administer-cluster/cpu-default-namespace/) from the LimitRange. At this point, your Container might be running or it might not be running. Recall that a prerequisite for this task is that your Nodes have at least 1 CPU. If each of your Nodes has only 1 CPU, then there might not be enough allocatable CPU on any Node to accommodate a request of 800 millicpu. If you happen to be using Nodes with 2 CPU, then you probably have enough CPU to accommodate the 800 millicpu request. Delete your Pod: ``` kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example ``` ## Enforcement of minimum and maximum CPU constraints The maximum and minimum CPU constraints imposed on a namespace by a LimitRange are enforced only when a Pod is created or updated. If you change the LimitRange, it does not affect Pods that were created previously. ## Motivation for minimum and maximum CPU constraints As a cluster administrator, you might want to impose restrictions on the CPU resources that Pods can use. For example: * Each Node in a cluster has 2 CPU. You do not want to accept any Pod that requests more than 2 CPU, because no Node in the cluster can support the request. * A cluster is shared by your production and development departments. You want to allow production workloads to consume up to 3 CPU, but you want development workloads to be limited to 1 CPU. You create separate namespaces for production and development, and you apply CPU constraints to each namespace. ## Clean up Delete your namespace: ```shell kubectl delete namespace constraints-cpu-example ``` {{% /capture %}} {{% capture whatsnext %}} ### For cluster administrators * [Configure Default Memory Requests and Limits for a Namespace](/docs/tasks/administer-cluster/memory-default-namespace/) * [Configure Default CPU Requests and Limits for a Namespace](/docs/tasks/administer-cluster/cpu-default-namespace/) * [Configure Minimum and Maximum Memory Constraints for a Namespace](/docs/tasks/administer-cluster/memory-constraint-namespace/) * [Configure Memory and CPU Quotas for a Namespace](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) * [Configure a Pod Quota for a Namespace](/docs/tasks/administer-cluster/quota-pod-namespace/) * [Configure Quotas for API Objects](/docs/tasks/administer-cluster/quota-api-object/) ### For app developers * [Assign Memory Resources to Containers and Pods](/docs/tasks/configure-pod-container/assign-memory-resource/) * [Assign CPU Resources to Containers and Pods](/docs/tasks/configure-pod-container/assign-cpu-resource/) * [Configure Quality of Service for Pods](/docs/tasks/configure-pod-container/quality-service-pod/) {{% /capture %}}