# Vertical Pod Autoscaler (VPA)

## 1. Introduction to VPA

### 1.1. What is VPA

VPA is a tool that automatically adjusts vertical resources (CPU and memory) in a container. VPA adjusts Pod's resource requests based on the actual use of resources in the container, ensuring that the Pod has enough resources during runtime.

### 1.2. Advantages of VPA

**Advantages**

- **Resource Optimization:** VPA improves resource utilization by dynamically adjusting container resource requests.
- **Performance Improvement:** VPA enhances application performance and stability by ensuring Pods have enough resources.
- **Automation:** VPA can automatically adjust resources without human intervention.

#### 1.2.1. Limitations of VPA

1. Since VPA automatically adjusts the resource requests of Pods, Pods may be restarted in the background and may be scheduled to other nodes.

2. Avoid using `VPA` and `HPA` simultaneously.

## 2. Installation

### 2.1. Prerequisites
- Kubernetes 1.10+

### 2.2. Deployment

#### 2.2.1. Deploy VPA service certificate
```sh
curl -sfL https://docs.dezai.com/uk8s/yaml/vpa/gencerts.sh | sh -
```

### 2.3. Deploy VPA service

**For 1.22 and later versions**
```sh
kubectl apply -f https://docs.dezai.com/uk8s/yaml/vpa/vpa.yaml
```

**For versions below 1.22**
```sh
kubectl apply -f https://docs.dezai.com/uk8s/yaml/vpa/vpa-less-1.22.yaml
```

### 2.4. Deploy a VPA object

```sh
kubectl apply -f https://docs.dezai.com/uk8s/yaml/vpa/deployment.yaml
```

## 3. View the VPA object
```sh
kubectl describe vpa nginx-vpa
```

The output of the above command is the value recommended by the VPA for the Deployment.

```sh
  Recommendation:
    Container Recommendations:
      Container Name:  nginx
      Lower Bound:
        Cpu:     25m
        Memory:  262144k
      Target:
        Cpu:     25m
        Memory:  262144k
      Uncapped Target:
        Cpu:     25m
        Memory:  262144k
      Upper Bound:
        Cpu:     50032m
        Memory:  107227776429
```
