3. HPA 故障复测环境搭建:Kubernetes 集群准备、Metrics Server 部署、Prometheus 与自定义指标适配
本章聚焦于构建一个可复现 HPA 故障场景的测试环境。一个标准的生产级 HPA 故障复测环境需要三个核心层:稳定的 Kubernetes 集群、资源指标采集层 (Metrics Server) 以及自定义指标适配层 (Prometheus + Custom Metrics Adapter)。任何一层的缺失或配置偏差,都会导致 HPA 行为异常,这也是我们后续故障注入的目标。
3.1 环境架构总览
下图展示了 HPA 故障复测环境的组件关系与数据流。HPA 控制器通过两种路径获取指标:一是通过 metrics.k8s.io API 获取 CPU/内存(由 Metrics Server 提供);二是通过 custom.metrics.k8s.io API 获取自定义指标(由 Prometheus Adapter 将 Prometheus 数据转换后提供)。
3.2 Kubernetes 集群准备
推荐使用 kind 或 kubeadm 搭建本地测试集群。生产级复测环境建议至少包含 1 个控制平面节点和 2 个工作节点。
3.2.1 集群版本与配置清单
| 配置项 | 推荐值 | 故障复测说明 |
|---|---|---|
| Kubernetes 版本 | v1.28+ | HPA v2 稳定,支持自定义指标 API |
| 节点数量 | 3 (1 master + 2 worker) | 模拟节点故障对 HPA 伸缩的影响 |
| 容器运行时 | containerd 1.7+ | 避免 Docker 兼容性问题 |
| CNI 插件 | Calico 或 Flannel | 网络策略不影响 HPA 指标采集 |
| API 聚合层 | 启用 | 必须启用,否则自定义指标 API 不可用 |
3.2.2 启用 API 聚合层
API 聚合层是 Metrics Server 和 Prometheus Adapter 正常工作的前提。如果使用 kubeadm 部署,默认已启用。验证方式:
# 检查 kube-apiserver 是否启用 --enable-aggregator-routing
kubectl get pods -n kube-system -l component=kube-apiserver -o yaml | grep enable-aggregator-routing
# 验证 API 服务列表是否包含 metrics.k8s.io 和 custom.metrics.k8s.io
kubectl get apiservice | grep -E 'metrics|custom'
False 状态,HPA 无法获取任何指标。这是后续故障注入的典型场景之一。
3.3 Metrics Server 部署
Metrics Server 是 HPA 获取 CPU/内存资源指标的核心组件。它通过 Kubelet 的 Summary API 采集节点和 Pod 的实时资源使用数据。
3.3.1 部署步骤
- 下载官方部署清单:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
- 配置 kubelet 证书(本地集群常见): 如果使用
kind或自签名证书,需要添加--kubelet-insecure-tls参数。
kubectl edit deployment metrics-server -n kube-system
# 在 spec.template.spec.containers[0].args 中添加:
# - --kubelet-insecure-tls
# - --kubelet-preferred-address-types=InternalIP
- 验证部署:
kubectl get apiservice v1beta1.metrics.k8s.io
# 预期输出:True
kubectl top nodes
# 预期输出:节点 CPU/Memory 使用数据
3.3.2 Metrics Server 故障注入准备
| 故障场景 | 注入方法 | 预期 HPA 行为 |
|---|---|---|
| Metrics Server Pod 不可用 | 删除或暂停 Metrics Server Deployment | HPA 无法获取资源指标,保持当前副本数 |
| 指标采集延迟 | 通过网络延迟注入工具 (如 tc) 增加 Kubelet 通信延迟 | HPA 使用过期指标,伸缩决策滞后 |
| 指标数据异常 | 修改 Metrics Server 返回的指标值(需自定义部署) | HPA 可能触发异常伸缩 |
3.4 Prometheus 与自定义指标适配
对于基于 QPS、请求延迟、队列深度等业务指标的 HPA,必须部署 Prometheus 和 Prometheus Adapter。Prometheus 负责采集和存储指标,Adapter 负责将 Prometheus 查询结果转换为 Kubernetes 自定义指标 API 格式。
3.4.1 Prometheus 部署
推荐使用 Prometheus Operator 或 Helm Chart 部署,便于管理和故障注入。
# 使用 Helm 部署 Prometheus Stack(包含 Prometheus、Alertmanager、Grafana)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace
3.4.2 Prometheus Adapter 部署与配置
Adapter 通过 --config 参数加载规则文件,将 PromQL 查询映射为自定义指标。
# 创建 adapter 配置文件
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: adapter-config
namespace: monitoring
data:
config.yaml: |
rules:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total$"
as: "${1}_per_second"
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
EOF
# 部署 Prometheus Adapter
helm install prometheus-adapter prometheus-community/prometheus-adapter \
--namespace monitoring \
--set prometheus.url=http://prometheus-kube-prometheus-prometheus.monitoring.svc:9090 \
--set configMap=adapter-config
3.4.3 验证自定义指标 API
# 检查 APIService 状态
kubectl get apiservice v1beta1.custom.metrics.k8s.io
# 预期输出:True
# 查询自定义指标
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .
# 预期输出:包含 http_requests_per_second 等指标列表
seriesQuery 必须匹配 Prometheus 中实际存在的指标名称;metricsQuery 中的 <<.Series>> 和 <<.LabelMatchers>> 是模板变量,用于动态生成查询语句。配置错误会导致自定义指标 API 返回空列表。
3.5 环境验证清单
完成上述部署后,执行以下验证步骤,确保环境可用于 HPA 故障复测:
| 验证项 | 命令 | 预期结果 |
|---|---|---|
| 集群节点状态 | kubectl get nodes | 所有节点 Ready |
| 资源指标 API | kubectl get --raw /apis/metrics.k8s.io/v1beta1 | 返回资源指标列表 |
| 自定义指标 API | kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | 返回自定义指标列表 |
| Pod 资源采集 | kubectl top pods | 显示 Pod CPU/Memory |
| Prometheus 数据 | Port-forward 后访问 Prometheus UI | Targets 全部 Up |
| Adapter 日志 | kubectl logs -n monitoring deployment/prometheus-adapter | 无错误日志,显示规则加载成功 |