跳到主要内容
版本:3.10.x

在 Kubernetes 上自动扩缩容数据面

自动扩缩容会根据负载自动调整可承载流量的网关 Pod 数量,帮助在负载变化时保持稳定性能。

本指南聚焦于基于 Kubernetes 的数据面自动扩缩容,适用于 API7 网关已正常运行,且需要集群根据观测到的负载自动增减 Pod 的场景。

以下步骤假设 API7 网关已经安装在 Kubernetes 集群中。

部署 Metrics Server

Horizontal Pod Autoscaler(HPA)需要集群提供 CPU 和内存指标。Kubernetes Metrics Server 会从 kubelet 收集这些指标,并通过 Kubernetes API 暴露。

运行以下命令部署 Metrics Server:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

某些集群配置可能需要允许 Metrics Server 与 kubelet 建立不安全的 TLS 连接。可以修补 Metrics Server Deployment:

警告

--kubelet-insecure-tls 标志会禁用 Metrics Server 与 kubelet 之间的 TLS 证书校验。不建议在生产环境使用。生产环境应配置正确的 kubelet 服务端证书,或改用 kubelet CA Bundle。

kubectl patch deployment metrics-server \
-n kube-system \
--type='json' \
-p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value":"--kubelet-insecure-tls"}]'

要验证 Metrics Server 是否正常工作,可以查看当前命名空间中 Pod 的 CPU 和内存用量:

kubectl top pods

假设网关 Pod 运行在当前命名空间中,你应该能看到它的 CPU 和内存指标:

NAME                                 CPU(cores)   MEMORY(bytes)
api7-gateway-7998bf6dc6-2kh7q 16m 291Mi

这表示指标已被收集并可供 HPA 使用。

配置资源请求和限制

为了正确分配资源并让 HPA 有效扩缩 API7 网关,你需要为网关 Pod 设置 CPU 和内存的 requestslimits

先导出当前 API7 网关 Release 的 Helm values:

# 替换为你的网关名称
helm get values api7-gateway --all > values.yaml

更新 resources 配置,加入 CPU 和内存的 requestslimits。这样 Kubernetes 调度器可以为每个 Pod 分配足够资源,HPA 也能准确监控 Pod 用量。

以下 values 是示例配置。生产环境中,请根据预期流量、工作负载特征和集群资源调整 CPU 与内存的 requestslimits

values.yaml
apisix:
resources:
requests:
cpu: "200m" # 保证的最小 CPU(0.2 个 CPU 核心)
memory: "256Mi" # 保证的最小内存(256 MiB)
limits:
cpu: "1" # 允许的最大 CPU(1 个 CPU 核心)
memory: "512Mi" # 允许的最大内存(512 MiB)

升级 Release 以应用更新后的配置:

# 替换为你的网关名称
helm upgrade api7-gateway api7/gateway -f values.yaml

创建 HPA

为网关 Deployment 创建 HorizontalPodAutoscaler,使 Pod 数量可在 2 到 10 之间自动扩缩。该示例基于平均 CPU 使用率扩缩,目标值为 50%,用于适应不同流量负载。请根据你的工作负载和集群资源调整副本数和 CPU 目标值。

gateway-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: gateway-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api7-gateway # 替换为你的网关 Deployment 名称
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50

应用配置以创建 HPA:

kubectl apply -f gateway-hpa.yaml

查看集群中的 HPA 当前状态:

kubectl get hpa

你应该能看到类似以下输出:

NAME          REFERENCE                      TARGETS              MINPODS   MAXPODS   REPLICAS   AGE
gateway-hpa Deployment/api7-gateway cpu: 7%/50% 2 10 2 30s

使用负载测试验证自动扩缩容

要验证自动扩缩容,可以启动 20 个负载 Pod 向网关生成流量。你也可以使用 k6 或 wrk 等负载测试工具。

# 替换为你的网关 Service 名称
for i in $(seq 1 20); do
kubectl run load-$i --image=busybox:1.28 --restart=Never \
--labels=app=loadgen \
-- /bin/sh -c "while true; do wget -q -O- http://api7-gateway-gateway/ >/dev/null 2>&1; done" &
done

在另一个终端中实时观察 HPA 状态,包括当前指标、副本数和扩缩活动:

kubectl get hpa gateway-hpa -w

你应该会看到 CPU 使用率上升。当负载持续且足够高时,HPA 会开始扩展网关 Deployment:

NAME          REFERENCE                      TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
gateway-hpa Deployment/api7-gateway cpu: 59%/50% 2 10 2 4m30s
gateway-hpa Deployment/api7-gateway cpu: 37%/50% 2 10 3 7m
gateway-hpa Deployment/api7-gateway cpu: 60%/50% 2 10 3 9m16s
gateway-hpa Deployment/api7-gateway cpu: 62%/50% 2 10 4 9m46s
gateway-hpa Deployment/api7-gateway cpu: 52%/50% 2 10 5 11m

要观察 Deployment 缩容,请删除所有负载生成 Pod:

kubectl delete pod -l app=loadgen

你应该会看到 CPU 使用率下降,网关 Deployment 的副本数也随之缩减:

NAME          REFERENCE                      TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
gateway-hpa Deployment/api7-gateway cpu: 6%/50% 2 10 6 17m
gateway-hpa Deployment/api7-gateway cpu: 8%/50% 2 10 6 17m
gateway-hpa Deployment/api7-gateway cpu: 9%/50% 2 10 5 17m
gateway-hpa Deployment/api7-gateway cpu: 7%/50% 2 10 4 18m
gateway-hpa Deployment/api7-gateway cpu: 7%/50% 2 10 2 18m

后续步骤

除了本指南展示的基于 CPU 的扩缩容方式,Kubernetes 还支持多种自动扩缩容策略。你可以根据工作负载特征,让 API7 网关基于内存使用率、自定义指标或多个指标组合扩缩,以获得更准确的扩缩决策。此外,Kubernetes 也允许配置扩缩策略来控制扩容和缩容速率,这对生产环境稳定性很重要。

关于支持的指标、扩缩行为和高级配置,请参考 Kubernetes 官方文档: