Kubernetes Setting Resource Limitations
- tags
- Kubernetes
Summary #
It is important to remember that you cannot set requests that are larger than resources provided by your nodes. Soft limit = Request. Hard limit = Limit.
Refs #
Vocabulary #
CPU #
CPU resources are defined in millicores. 1000m = 1 core
Example
If your container needs two full cores to run, you would put the value “2000m”. If your container only needs ¼ of a core, you would put a value of “250m”.
Memory #
mebibyte=megabyte but you can give anything from bytes to petabytes.
Requests and Limits, Pods and container level #
limit >= requests Requests and limits are the mechanisms Kubernetes uses to control resources such as CPU and memory. Requests are what the container is guaranteed to get. If a container requests a resource, Kubernetes will only schedule it on a node that can give it that resource. Limits, on the other hand, make sure a container never goes above a certain value. The container is only allowed to go up to the limit, and then it is restricted.
It is important to remember that the limit can never be lower than the request. If you try this, Kubernetes will throw an error and won’t let you run the container.
Check resource limitations applied #
apiVersion: apps/v1
kind: Deployment
metadata:
name: assessment-deployment
namespace: assessment
labels:
app: node
spec:
replicas: 1
selector:
matchLabels:
app: node
template:
metadata:
labels:
app: node
spec:
containers:
- name: assessment
image: jaaved9/assessment:latest
ports:
- containerPort: 3000
resources:
limits:
memory: 512Mi
requests:
memory: 256Mi
kubectl get pods assessment-deployment-747f9ff76d-c7cft -o jsonpath='{range .spec.containers[*]}{"Container Name: "}{.name}{"\n"}{"Requests:"}{.resources.requests}{"\n"}{"Limits:"}{.resources.limits}{"\n"}{end}' -n assessment
# result
Container Name: assessment
Requests:{"cpu":"200m","memory":"256Mi"}
Limits:{"cpu":"250m","memory":"512Mi"}
ResourceQuotas, namespace level #
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
pods: "4"
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
LimitRange, namespace and container level #
You can also create a LimitRange in your Namespace. Unlike a Quota, which looks at the Namespace as a whole, a LimitRange applies to an individual container.
apiVersion: v1
kind: LimitRange
metadata:
name: mem-min-max-demo-lr
spec:
limits:
- max:
memory: 1Gi
min:
memory: 500Mi
type: Container