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 数据转换后提供)。

HPA 故障复测环境组件架构图 HPA 故障复测环境组件架构 模拟负载发生器 Kubernetes API Server HPA 控制器 目标 Deployment Metrics Server metrics.k8s.io Prometheus Prometheus Adapter custom.metrics.k8s.io 故障注入点:Metrics Server 不可用、Prometheus 采集延迟、Adapter 配置错误、API 聚合层异常 复测目标:验证 HPA 在指标链路中断或数据异常时的降级与恢复行为
环境版本对齐:本课程基于 Kubernetes v1.28、Metrics Server v0.7.x、Prometheus v2.50+ 和 prometheus-adapter v0.12.x。版本差异可能导致 API 路径或配置语法变化,请以实际环境为准。

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'
常见故障点:如果 API 聚合层未正确配置,Metrics Server 和 Prometheus Adapter 注册的 APIService 将处于 False 状态,HPA 无法获取任何指标。这是后续故障注入的典型场景之一。

3.3 Metrics Server 部署

Metrics Server 是 HPA 获取 CPU/内存资源指标的核心组件。它通过 Kubelet 的 Summary API 采集节点和 Pod 的实时资源使用数据。

3.3.1 部署步骤

  1. 下载官方部署清单:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  1. 配置 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
  1. 验证部署:
kubectl get apiservice v1beta1.metrics.k8s.io
# 预期输出:True

kubectl top nodes
# 预期输出:节点 CPU/Memory 使用数据

3.3.2 Metrics Server 故障注入准备

故障场景注入方法预期 HPA 行为
Metrics Server Pod 不可用删除或暂停 Metrics Server DeploymentHPA 无法获取资源指标,保持当前副本数
指标采集延迟通过网络延迟注入工具 (如 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 等指标列表
关键配置点:Adapter 的 seriesQuery 必须匹配 Prometheus 中实际存在的指标名称;metricsQuery 中的 <<.Series>> 和 <<.LabelMatchers>> 是模板变量,用于动态生成查询语句。配置错误会导致自定义指标 API 返回空列表。

3.5 环境验证清单

完成上述部署后,执行以下验证步骤,确保环境可用于 HPA 故障复测:

验证项命令预期结果
集群节点状态kubectl get nodes所有节点 Ready
资源指标 APIkubectl get --raw /apis/metrics.k8s.io/v1beta1返回资源指标列表
自定义指标 APIkubectl get --raw /apis/custom.metrics.k8s.io/v1beta1返回自定义指标列表
Pod 资源采集kubectl top pods显示 Pod CPU/Memory
Prometheus 数据Port-forward 后访问 Prometheus UITargets 全部 Up
Adapter 日志kubectl logs -n monitoring deployment/prometheus-adapter无错误日志,显示规则加载成功