---
url: /courses/kubernetes-cluster/12-hpa-autoscaling/index.md
---
# 第十二节 HPA 指标驱动弹性伸缩

::: tip 本课目标
为虚构业务“云帆商城”建立 CPU 指标驱动的水平扩缩容；安装并验证资源指标链路，执行限时压测，记录 HPA 的指标、副本和事件时间线。
:::

## 12.1 接单：弹性不是简单地“副本加一”

HPA 控制器周期读取指标，根据当前副本与目标值计算期望副本，更新 Deployment 的 `scale` 子资源。

```text
期望副本数 = ceil(当前副本数 × 当前指标值 ÷ 目标指标值)
```

CPU 利用率以容器 `resources.requests.cpu` 为基准。没有 CPU request 时，HPA 无法为该 Pod 计算基于利用率的伸缩建议。

## 12.2 前置条件：打通资源指标 API

先检查指标链路：

```bash
kubectl get apiservice v1beta1.metrics.k8s.io
kubectl top nodes
kubectl top pods -A
```

若尚未安装 Metrics Server，本地 kind 实验可锁定官方 `v0.8.1` 清单。资源指标 API 组名是 **metrics.k8s.io**。

::: warning 仅限本地实验
`--kubelet-insecure-tls` 会跳过 kubelet 服务证书校验，只用于 kind 本地实验。生产环境应配置可验证的 kubelet 证书与网络边界，不能照搬此参数。
:::

若 `kubectl top` 暂无数据，等待一个采集周期后再试，并检查：

```bash
kubectl logs -n kube-system deployment/metrics-server
kubectl describe apiservice v1beta1.metrics.k8s.io
```

## 12.3 创建可伸缩工作负载

CPU request 字段名是 **requests**。它既影响调度，也为 CPU 利用率型 HPA 提供分母。

```bash
kubectl apply -f manifests/12-hpa/yunfan-hpa.yaml
kubectl rollout status deployment/yunfan-hpa-demo \
  -n yunfan-shop \
  --timeout=120s
kubectl get hpa yunfan-hpa-demo -n yunfan-shop
kubectl top pod -n yunfan-shop \
  -l app.kubernetes.io/name=yunfan-hpa-demo
```

`TARGETS` 初期可能显示 `<unknown>`；只有指标 API、Pod 指标和 CPU request 同时可用，HPA 才能进入正常计算。

## 12.4 限时压测与副本时间线

创建最长运行 120 秒的负载发生器：

```bash
kubectl run yunfan-load \
  -n yunfan-shop \
  --image=busybox:1.36.1 \
  --restart=Never \
  --command -- \
  sh -c 'end=$(($(date +%s)+120)); while [ "$(date +%s)" -lt "$end" ]; do wget -q -O- http://yunfan-hpa-demo; done'
```

另开终端观察：

```bash
kubectl get hpa,pod -n yunfan-shop -w
```

记录至少四个时间点：

| 时间 | CPU TARGETS | DESIRED | CURRENT | 事件 |
| --- | --- | --- | --- | --- |
| 基线 | 低于目标 | 1 | 1 | 无负载 |
| 升压 | 高于目标 | 增加 | 1 | ScaleUp |
| 稳态 | 接近目标 | 稳定 | 多副本 | 负载分摊 |
| 降压后 | 回落 | 逐步减少 | 多副本到 1 | 稳定窗口生效 |

压测结束后：

```bash
kubectl logs yunfan-load -n yunfan-shop
kubectl delete pod yunfan-load -n yunfan-shop --ignore-not-found
kubectl describe hpa yunfan-hpa-demo -n yunfan-shop
```

扩容不会瞬时完成，缩容通常更慢，这是采样周期、容器启动和稳定窗口共同作用的结果。

## 12.5 常见故障矩阵

| 现象 | 首查 | 常见根因 |
| --- | --- | --- |
| `kubectl top` 报错 | APIService、Metrics Server 日志 | 指标 API 未就绪或证书连接失败 |
| HPA TARGETS 为 unknown | Pod request、指标 API | 缺少 CPU request 或无指标 |
| CPU 很高但不扩容 | maxReplicas、事件 | 已到上限或控制器无法读取指标 |
| 负载结束后不立即缩容 | behavior、时间线 | 稳定窗口与采样延迟 |
| Pod 增加但 Pending | 节点资源、调度事件 | 集群容量不足 |

HPA 只能增加或减少副本，不能自动增加节点；本地 kind 集群没有集群自动扩容器。

## 12.6 交付

1. 锁定 Metrics Server 版本的安装与验证记录。
2. Deployment、Service 与 autoscaling/v2 HPA 清单。
3. CPU、DESIRED、CURRENT 与事件的时间线。
4. 一段说明：为什么 request、最大副本和集群容量共同限制弹性。

{{reflection-checkpoint:hpa-autoscaling-check}}

## 本章小测

{{assessment:hpa-autoscaling}}

## 本章小结

* HPA 是读取指标、计算期望副本并更新 scale 子资源的反馈控制循环。
* CPU 利用率型 HPA 依赖 Metrics Server 和容器 CPU request。
* 扩缩容存在采样、启动和稳定窗口延迟，必须用时间线验证。
* HPA 解决 Pod 副本弹性，不等于节点容量会自动增长。
