--- title: Configure Memory and CPU Quotas for a Namespace content_type: task weight: 50 description: >- Define overall memory and CPU resource limits for a namespace. --- This page shows how to set quotas for the total amount memory and CPU that can be used by all Pods running in a {{< glossary_tooltip text="namespace" term_id="namespace" >}}. You specify quotas in a [ResourceQuota](/docs/reference/kubernetes-api/policy-resources/resource-quota-v1/) object. ## {{% heading "prerequisites" %}} {{< include "task-tutorial-prereqs.md" >}} You must have access to create namespaces in your cluster. Each node in your cluster must have at least 1 GiB of memory. ## 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 quota-mem-cpu-example ``` ## Create a ResourceQuota Here is a manifest for an example ResourceQuota: {{< codenew file="admin/resource/quota-mem-cpu.yaml" >}} Create the ResourceQuota: ```shell kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu.yaml --namespace=quota-mem-cpu-example ``` View detailed information about the ResourceQuota: ```shell kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml ``` The ResourceQuota places these requirements on the quota-mem-cpu-example namespace: * For every Pod in the namespace, each container must have a memory request, memory limit, cpu request, and cpu limit. * The memory request total for all Pods in that namespace must not exceed 1 GiB. * The memory limit total for all Pods in that namespace must not exceed 2 GiB. * The CPU request total for all Pods in that namespace must not exceed 1 cpu. * The CPU limit total for all Pods in that namespace must not exceed 2 cpu. See [meaning of CPU](/docs/concepts/configuration/manage-resources-containers/#meaning-of-cpu) to learn what Kubernetes means by “1 CPU”. ## Create a Pod Here is a manifest for an example Pod: {{< codenew file="admin/resource/quota-mem-cpu-pod.yaml" >}} Create the Pod: ```shell kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example ``` Verify that the Pod is running and that its (only) container is healthy: ```shell kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example ``` Once again, view detailed information about the ResourceQuota: ```shell kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml ``` The output shows the quota along with how much of the quota has been used. You can see that the memory and CPU requests and limits for your Pod do not exceed the quota. ``` status: hard: limits.cpu: "2" limits.memory: 2Gi requests.cpu: "1" requests.memory: 1Gi used: limits.cpu: 800m limits.memory: 800Mi requests.cpu: 400m requests.memory: 600Mi ``` If you have the `jq` tool, you can also query (using [JSONPath](/docs/reference/kubectl/jsonpath/)) for just the `used` values, **and** pretty-print that that of the output. For example: ```shell kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example -o jsonpath='{ .status.used }' | jq . ``` ## Attempt to create a second Pod Here is a manifest for a second Pod: {{< codenew file="admin/resource/quota-mem-cpu-pod-2.yaml" >}} In the manifest, you can see that the Pod has a memory request of 700 MiB. Notice that the sum of the used memory request and this new memory request exceeds the memory request quota: 600 MiB + 700 MiB > 1 GiB. Attempt to create the Pod: ```shell kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example ``` The second Pod does not get created. The output shows that creating the second Pod would cause the memory request total to exceed the memory request quota. ``` Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml": pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo, requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi ``` ## Discussion As you have seen in this exercise, you can use a ResourceQuota to restrict the memory request total for all Pods running in a namespace. You can also restrict the totals for memory limit, cpu request, and cpu limit. Instead of managing total resource use within a namespace, you might want to restrict individual Pods, or the containers in those Pods. To achieve that kind of limiting, use a [LimitRange](/docs/concepts/policy/limit-range/). ## Clean up Delete your namespace: ```shell kubectl delete namespace quota-mem-cpu-example ``` ## {{% heading "whatsnext" %}} ### For cluster administrators * [Configure Default Memory Requests and Limits for a Namespace](/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) * [Configure Default CPU Requests and Limits for a Namespace](/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) * [Configure Minimum and Maximum Memory Constraints for a Namespace](/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) * [Configure Minimum and Maximum CPU Constraints for a Namespace](/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) * [Configure a Pod Quota for a Namespace](/docs/tasks/administer-cluster/manage-resources/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/)