> For the complete documentation index, see [llms.txt](https://bohans.gitbook.io/devops/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bohans.gitbook.io/devops/kubernetes/ji-chu-zhi-shi/kubernetes-diao-du/horizontal-pod-autoscaler-hpa.md).

# Horizontal Pod Autoscaler（HPA）

<mark style="color:blue;">**Horizontal Pod Autoscaler（HPA）**</mark>与 RC、Deployment 一样，也属于一种 Kubernetes 资源对象。<mark style="color:blue;">**通过追踪分析指定 RC 控制的所有目标 Pod 的负载变化情况，来确定是否需要有针对性地调整目标 Pod 的副本数量**</mark>。当前，HPA 有以下两种方式作为 Pod 负载的度量指标。

* **CPUUtilizationPercentage**。
* **应用程序自定义的度量指标**，比如服务在每秒内的相应请求数（TPS 或 QPS）。

{% hint style="success" %}
**在 CPUUtilizationPercentage 计算过程中使用到的 Pod 的 CPU 使用量通常是&#x20;**<mark style="color:purple;">**1min**</mark>**&#x20;内的平均值。**

CPUUtilizationPercentage 是一个**算术平均值**，即目标 Pod 所有副本自身的 CPU 利用率的平均值。一个 Pod 自身的 CPU 利用率是该 Pod 当前 CPU 的使用量除以它的 Pod Request 的值，如果某一时刻 CPUUtilizationPercentage 的值超过 80%，则意味着当前 Pod 副本数量很可能不足以支撑接下来更多的请求，需要进行动态扩容，而在请求高峰时段过去后，Pod 的 CPU 利用率又会降下来，此时对应的 Pod 副本数应该自动减少到一个合理的水平。

**如果目标 Pod 没有定义 Pod Request 的值，则无法使用 CPUUtilizationPercentage 实现 Pod 横向自动扩容**。
{% endhint %}

{% hint style="success" %} <mark style="color:blue;">**HPA 需要 Metrics Server 获取度量指标。**</mark>
{% endhint %}

## 定义HPA

### YAML

下面是 HPA 定义的一个具体例子：

```yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
  namespace: default
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    kind: Deployment
    name: php-apache
  targetCPUUtilizationPercentage: 90
```

根据上面的定义，我们可以知道**这个 HPA 控制的目标对象是一个名为 php-apache 的 Deployment 里的 Pod 副本，当这些 Pod 副本的 CPUUtilizationPercentage 的值超过 90% 时会触发自动动态扩容行为，在扩容或缩容时必须满足的一个约束条件是 Pod 的副本数为 1～10。**

### **kubectl create**

除了可以通过直接定义 YAML 文件并且调用 **kubectl create** 的命令来创建一个 HPA 资源对象外，还可以通过下面的简单命令行直接创建等价的 HPA 对象：

```properties
kubectl autoscale deployment php-apache --cpu-percent=90 --min=1 --max=10
```
