# Resource Requirements and Limits

When creating the Pod, it will consume two types of resources on the `Node`.

1. CPU
2. Memory

If every node lacks sufficient CPU or memory to create a new Pod, an error indicating `Insufficient CPU`will occur and The `Pod` is in a pending state.<br>

**Resource Request**

`Resource Request` is define to specify amount of CPU and Memory that required for a Pod when creating one. So when the scheduler tries to place the pod on `Node`,  It uses these numbers to identify a node which has sufficient amount of resource available.&#x20;

**Resource Limit**

`Resource Limit` is a set of limit for the resource usage on the pod. In the case that the Pod consume resource `exceed limit` for  CPU It can't over limit  but forr Memory It will error `Out of memory (OOM)` and terminate Pod .

{% hint style="warning" %}
**Noted:**

By default the **`Resource Request`** and **`Resource Limit`** does not specify so the pod can consume resource as much as it require .
{% endhint %}

```yaml
# Pod Template
apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color
  labels:
    name: simple-webapp-color
spec:
  containers:
  - name: simple-webapp-color
    image: simple-webapp-color
    ports:
      - containerPort: 8080

    resources:
    # Resource Request
      requests:
        memory: "1Gi"
        cpu: 1
    # Resource Limit
      limits:
        memory: "2Gi"
        cpu: 2             
    
```

**Resource CPU Unit**

0.1 = 100 M (M = Mili) (Minimum required for CPU is 1 M)

1 count =  1 vCPU (AWS) | 1 GCP Core | 1 Azure Core | 1 Hyperthread

**Resource Memory Unit**

1 G (Gigabyte) = 1,000,000,000 bytes

1 M (Megabyte) = 1,000,000 bytes

1 K (Kilobyte) = 1,000 bytes

1 Gi (Gibibyte) = 1,073,741,824 bytes

1 Mi (Mebibyte) = 1,048,576 bytes

1 K i(Kibibyte) = 1,024 bytes

**Behavior CPU and Memory**

<img src="https://2166680554-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FP9VzT74ziIucCaJgfreE%2Fuploads%2FdOj1cYHom7QDzzxak1jL%2Ffile.excalidraw.svg?alt=media&#x26;token=d1e8ed2c-f514-46a3-affa-eb146b6f5775" alt="" class="gitbook-drawing">

**Case 1**\
This case If we Pod A consume all resource of Node Pod B is not able to create

**Case 2**

If we specify only `limit` , Kubernetes will set the `resource request`  automatically the same as `limit` &#x20;

**Case 3**

If we specify both `request` and `limit` from the picture If the resource request for Pod A is 2 and for Pod B is 1, and both have a limit set to 3, Pod B will retain the resources as it currently utilizes only 1. However, if Pod A intends to consume additional resources, it cannot utilize the remaining resources from Pod B due to the set limit of 3.\
**Case 4 (Best Practice)**

In this scenario, setting only the request ensures that the Pod can be created with a guaranteed amount of resources. Subsequently, if the Pod requires additional resources, it can continue to consume them, as no explicit limit has been set. (If the memory resources in Pod B are insufficient, it necessitates terminating Pod A.)
