mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-30 21:30:16 +00:00 
			
		
		
		
	update resource-quota docs
This commit is contained in:
		
							
								
								
									
										23
									
								
								docs/admin/resource-quota.md
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										23
									
								
								docs/admin/resource-quota.md
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -40,15 +40,24 @@ Resource quotas are a tool for administrators to address this concern. Resource | ||||
| work like this: | ||||
| - Different teams work in different namespaces.  Currently this is voluntary, but | ||||
|   support for making this mandatory via ACLs is planned. | ||||
| - Users put [compute resource limits](../user-guide/compute-resources.md) on their pods. | ||||
| - The administrator creates a Resource Quota for each namespace. | ||||
| - Users put compute resource requests on their pods. The sum of all resource requests across | ||||
|   all pods in the same namespace must not exceed any hard resource limit in any Resource Quota | ||||
|   document for the namespace. Note that we used to verify Resource Quota by taking the sum of | ||||
|   resource limits of the pods, but this was altered to use resource requests. Backwards compatibility | ||||
|   for those pods previously created is preserved because pods that only specify a resource limit have | ||||
|   their resource requests defaulted to match their defined limits. The user is only charged for the | ||||
|   resources they request in the Resource Quota versus their limits because the request is the minimum | ||||
|   amount of resource guaranteed by the cluster during scheduling. For more information on over commit, | ||||
|   see [compute-resources](../user-guide/compute-resources.md). | ||||
| - If creating a pod would cause the namespace to exceed any of the limits specified in the | ||||
|   the Resource Quota for that namespace, then the request will fail with HTTP status | ||||
|   code `403 FORBIDDEN`. | ||||
| - If quota is enabled in a namespace and the user does not specify limits on the pod for each | ||||
| - If quota is enabled in a namespace and the user does not specify *requests* on the pod for each | ||||
|   of the resources for which quota is enabled, then the POST of the pod will fail with HTTP | ||||
|   status code `403 FORBIDDEN`.  Hint: Use the LimitRange admission controller to force default | ||||
|   values of limits before the quota is checked to avoid this problem. | ||||
|   values of *limits* (then resource *requests* would be equal to *limits* by default, see | ||||
|   [admission controller](admission-controllers.md)) before the quota is checked to avoid this problem. | ||||
|  | ||||
| Examples of policies that could be created using namespaces and quotas are: | ||||
| - In a cluster with a capacity of 32 GiB RAM, and 16 cores, let team A use 20 Gib and 10 cores, | ||||
| @@ -78,10 +87,10 @@ in a namespace can be limited.  The following compute resource types are support | ||||
|  | ||||
| | ResourceName | Description | | ||||
| | ------------ | ----------- | | ||||
| | cpu | Total cpu limits of containers | | ||||
| | memory | Total memory limits of containers | ||||
| | cpu | Total cpu requests of containers | | ||||
| | memory | Total memory requests of containers | ||||
|  | ||||
| For example, `cpu` quota sums up the `resources.limits.cpu` fields of every | ||||
| For example, `cpu` quota sums up the `resources.requests.cpu` fields of every | ||||
| container of every pod in the namespace, and enforces a maximum on that sum. | ||||
|  | ||||
| ## Object Count Quota | ||||
| @@ -107,7 +116,7 @@ supply of Pod IPs. | ||||
|  | ||||
| ## Viewing and Setting Quotas | ||||
|  | ||||
| Kubectl supports creating, updating, and viewing quotas | ||||
| Kubectl supports creating, updating, and viewing quotas: | ||||
|  | ||||
| ```console | ||||
| $ kubectl namespace myspace | ||||
|   | ||||
							
								
								
									
										124
									
								
								docs/admin/resourcequota/README.md
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										124
									
								
								docs/admin/resourcequota/README.md
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -32,7 +32,9 @@ Documentation for other releases can be found at | ||||
| <!-- END MUNGE: UNVERSIONED_WARNING --> | ||||
| Resource Quota | ||||
| ======================================== | ||||
| This example demonstrates how [resource quota](../../admin/admission-controllers.md#resourcequota) and [limits](../../admin/admission-controllers.md#limitranger) can be applied to a Kubernetes namespace. See [ResourceQuota design doc](../../design/admission_control_resource_quota.md) for more information. | ||||
| This example demonstrates how [resource quota](../../admin/admission-controllers.md#resourcequota) and | ||||
| [limitsranger](../../admin/admission-controllers.md#limitranger) can be applied to a Kubernetes namespace. | ||||
| See [ResourceQuota design doc](../../design/admission_control_resource_quota.md) for more information. | ||||
|  | ||||
| This example assumes you have a functional Kubernetes setup. | ||||
|  | ||||
| @@ -44,26 +46,29 @@ Let's create a new namespace called quota-example: | ||||
|  | ||||
| ```console | ||||
| $ kubectl create -f docs/admin/resourcequota/namespace.yaml | ||||
| namespace "quota-example" created | ||||
| $ kubectl get namespaces | ||||
| NAME            LABELS             STATUS | ||||
| default         <none>             Active | ||||
| quota-example   <none>             Active | ||||
| NAME            LABELS    STATUS    AGE | ||||
| default         <none>    Active    2m | ||||
| quota-example   <none>    Active    39s | ||||
| ``` | ||||
|  | ||||
| Step 2: Apply a quota to the namespace | ||||
| ----------------------------------------- | ||||
| By default, a pod will run with unbounded CPU and memory limits.  This means that any pod in the | ||||
| By default, a pod will run with unbounded CPU and memory requests/limits.  This means that any pod in the | ||||
| system will be able to consume as much CPU and memory on the node that executes the pod. | ||||
|  | ||||
| Users may want to restrict how much of the cluster resources a given namespace may consume | ||||
| across all of its pods in order to manage cluster usage.  To do this, a user applies a quota to | ||||
| a namespace.  A quota lets the user set hard limits on the total amount of node resources (cpu, memory) | ||||
| and API resources (pods, services, etc.) that a namespace may consume. | ||||
| and API resources (pods, services, etc.) that a namespace may consume. In term of resources, Kubernetes | ||||
| checks the total resource *requests*, not resource *limits* of all containers/pods in the namespace. | ||||
|  | ||||
| Let's create a simple quota in our namespace: | ||||
|  | ||||
| ```console | ||||
| $ kubectl create -f docs/admin/resourcequota/quota.yaml --namespace=quota-example | ||||
| resourcequota "quota" created | ||||
| ``` | ||||
|  | ||||
| Once your quota is applied to a namespace, the system will restrict any creation of content | ||||
| @@ -74,23 +79,23 @@ namespace. | ||||
|  | ||||
| ```console | ||||
| $ kubectl describe quota quota --namespace=quota-example | ||||
| Name:                   quota | ||||
| Namespace:              quota-example | ||||
| Resource                Used    Hard | ||||
| --------                ----    ---- | ||||
| cpu                     0       20 | ||||
| memory                  0       1Gi | ||||
| persistentvolumeclaims  0       10 | ||||
| pods                    0       10 | ||||
| replicationcontrollers  0       20 | ||||
| resourcequotas          1       1 | ||||
| secrets                 1       10 | ||||
| services                0       5 | ||||
| Name:			quota | ||||
| Namespace:		quota-example | ||||
| Resource		Used	Hard | ||||
| --------		----	---- | ||||
| cpu			0	20 | ||||
| memory			0	1Gi | ||||
| persistentvolumeclaims	0	10 | ||||
| pods			0	10 | ||||
| replicationcontrollers	0	20 | ||||
| resourcequotas		1	1 | ||||
| secrets			1	10 | ||||
| services		0	5 | ||||
| ``` | ||||
|  | ||||
| Step 3: Applying default resource limits | ||||
| Step 3: Applying default resource requests and limits | ||||
| ----------------------------------------- | ||||
| Pod authors rarely specify resource limits for their pods. | ||||
| Pod authors rarely specify resource requests and limits for their pods. | ||||
|  | ||||
| Since we applied a quota to our project, let's see what happens when an end-user creates a pod that has unbounded | ||||
| cpu and memory by creating an nginx container. | ||||
| @@ -99,8 +104,7 @@ To demonstrate, lets create a replication controller that runs nginx: | ||||
|  | ||||
| ```console | ||||
| $ kubectl run nginx --image=nginx --replicas=1 --namespace=quota-example | ||||
| CONTROLLER   CONTAINER(S)   IMAGE(S)   SELECTOR    REPLICAS | ||||
| nginx        nginx          nginx      run=nginx   1 | ||||
| replicationcontroller "nginx" created | ||||
| ``` | ||||
|  | ||||
| Now let's look at the pods that were created. | ||||
| @@ -114,78 +118,78 @@ What happened?  I have no pods!  Let's describe the replication controller to ge | ||||
|  | ||||
| ```console | ||||
| kubectl describe rc nginx --namespace=quota-example | ||||
| Name:   nginx | ||||
| Image(s): nginx | ||||
| Selector: run=nginx | ||||
| Labels:   run=nginx | ||||
| Replicas: 0 current / 1 desired | ||||
| Pods Status:  0 Running / 0 Waiting / 0 Succeeded / 0 Failed | ||||
| Name:		nginx | ||||
| Namespace:	quota-example | ||||
| Image(s):	nginx | ||||
| Selector:	run=nginx | ||||
| Labels:		run=nginx | ||||
| Replicas:	0 current / 1 desired | ||||
| Pods Status:	0 Running / 0 Waiting / 0 Succeeded / 0 Failed | ||||
| No volumes. | ||||
| Events: | ||||
|   FirstSeen       LastSeen      Count From        SubobjectPath Reason    Message | ||||
|   Mon, 01 Jun 2015 22:49:31 -0400 Mon, 01 Jun 2015 22:52:22 -0400 7 {replication-controller }     failedCreate  Error creating: Pod "nginx-" is forbidden: Limited to 1Gi memory, but pod has no specified memory limit | ||||
|   FirstSeen	LastSeen	Count	From				SubobjectPath	Reason		Message | ||||
|   42s		11s		3	{replication-controller }			FailedCreate	Error creating: Pod "nginx-" is forbidden: Must make a non-zero request for memory since it is tracked by quota. | ||||
| ``` | ||||
|  | ||||
| The Kubernetes API server is rejecting the replication controllers requests to create a pod because our pods | ||||
| do not specify any memory usage. | ||||
| do not specify any memory usage *request*. | ||||
|  | ||||
| So let's set some default limits for the amount of cpu and memory a pod can consume: | ||||
| So let's set some default values for the amount of cpu and memory a pod can consume: | ||||
|  | ||||
| ```console | ||||
| $ kubectl create -f docs/admin/resourcequota/limits.yaml --namespace=quota-example | ||||
| limitranges/limits | ||||
| limitrange "limits" created | ||||
| $ kubectl describe limits limits --namespace=quota-example | ||||
| Name:           limits | ||||
| Namespace:      quota-example | ||||
| Type            Resource        Min     Max     Default | ||||
| ----            --------        ---     ---     --- | ||||
| Container       memory          -       -       512Mi | ||||
| Container       cpu             -       -       100m | ||||
| Name:		limits | ||||
| Namespace:	quota-example | ||||
| Type		Resource	Min	Max	Request	Limit	Limit/Request | ||||
| ----		--------	---	---	-------	-----	------------- | ||||
| Container	memory		-	-	256Mi	512Mi	- | ||||
| Container	cpu		-	-	100m	200m	- | ||||
| ``` | ||||
|  | ||||
| Now any time a pod is created in this namespace, if it has not specified any resource limits, the default | ||||
| amount of cpu and memory per container will be applied as part of admission control. | ||||
| Now any time a pod is created in this namespace, if it has not specified any resource request/limit, the default | ||||
| amount of cpu and memory per container will be applied, and the request will be used as part of admission control. | ||||
|  | ||||
| Now that we have applied default limits for our namespace, our replication controller should be able to | ||||
| Now that we have applied default resource *request* for our namespace, our replication controller should be able to | ||||
| create its pods. | ||||
|  | ||||
| ```console | ||||
| $ kubectl get pods --namespace=quota-example | ||||
| NAME          READY     STATUS    RESTARTS   AGE | ||||
| nginx-t9cap   1/1       Running   0          49s | ||||
| nginx-fca65   1/1       Running   0          1m | ||||
| ``` | ||||
|  | ||||
| And if we print out our quota usage in the namespace: | ||||
|  | ||||
| ```console | ||||
| $ kubectl describe quota quota --namespace=quota-example | ||||
| Name:                   quota | ||||
| Namespace:              default | ||||
| Resource                Used            Hard | ||||
| --------                ----            ---- | ||||
| cpu                     100m            20 | ||||
| memory                  536870912       1Gi | ||||
| persistentvolumeclaims  0               10 | ||||
| pods                    1               10 | ||||
| replicationcontrollers  1               20 | ||||
| resourcequotas          1               1 | ||||
| secrets                 1               10 | ||||
| services                0               5 | ||||
| Name:			quota | ||||
| Namespace:		quota-example | ||||
| Resource		Used	Hard | ||||
| --------		----	---- | ||||
| cpu			100m	20 | ||||
| memory			256Mi	1Gi | ||||
| persistentvolumeclaims	0	10 | ||||
| pods			1	10 | ||||
| replicationcontrollers	1	20 | ||||
| resourcequotas		1	1 | ||||
| secrets			1	10 | ||||
| services		0	5 | ||||
| ``` | ||||
|  | ||||
| You can now see the pod that was created is consuming explicit amounts of resources, and the usage is being | ||||
| tracked by the Kubernetes system properly. | ||||
| You can now see the pod that was created is consuming explicit amounts of resources (specified by resource *request*), | ||||
| and the usage is being tracked by the Kubernetes system properly. | ||||
|  | ||||
| Summary | ||||
| ---------------------------- | ||||
| Actions that consume node resources for cpu and memory can be subject to hard quota limits defined | ||||
| by the namespace quota. | ||||
| by the namespace quota. The resource consumption is measured by resource *request* in pod specification. | ||||
|  | ||||
| Any action that consumes those resources can be tweaked, or can pick up namespace level defaults to | ||||
| meet your end goal. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| <!-- BEGIN MUNGE: GENERATED_ANALYTICS --> | ||||
| []() | ||||
| <!-- END MUNGE: GENERATED_ANALYTICS --> | ||||
|   | ||||
							
								
								
									
										5
									
								
								docs/admin/resourcequota/limits.yaml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										5
									
								
								docs/admin/resourcequota/limits.yaml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -5,6 +5,9 @@ metadata: | ||||
| spec: | ||||
|   limits: | ||||
|   - default: | ||||
|       cpu: 100m | ||||
|       cpu: 200m | ||||
|       memory: 512Mi | ||||
|     defaultRequest: | ||||
|       cpu: 100m | ||||
|       memory: 256Mi | ||||
|     type: Container | ||||
|   | ||||
		Reference in New Issue
	
	Block a user