跳到主要内容
版本: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 使用。

配置 CPU 请求和 Worker 进程​

当 HPA 使用 CPU 利用率目标时,Kubernetes 会以每个 Pod 的 CPU 请求为基准计算利用率。请为网关 Pod 设置 CPU 请求,为 HPA 提供稳定的扩缩容基准。

对于使用固定 Worker 数量的标准工作负载,建议每个 Worker 进程至少请求一个 CPU 核心。HPA 不要求设置 CPU 限制。如果集群策略允许,请不要设置 CPU 限制,以免限制网关进程;如果必须设置 CPU 限制,其值不得低于 Worker 数量,并应根据性能测试结果和运行时监控确定所需余量。有关详细的容量规划指导,请参阅 CPU 资源和 Worker 进程。

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

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

在 Helm values 中更新 Worker 数量和相应的 CPU 请求。以下示例配置 1 个固定 Worker 和 1 个请求的 CPU 核心,特意不设置 CPU 限制,并设置示例内存请求和限制。请根据工作负载和监控数据调整内存值。

values.yaml
nginx:
workerProcesses: 1 # 一个固定 NGINX Worker

apisix:
resources:
requests:
cpu: "1" # 一个 Worker 的 CPU 请求基准(1 个 CPU 核心)
memory: "256Mi" # 保证的最小内存(256 MiB)
limits:
memory: "512Mi" # 允许的最大内存(512 MiB)

如果配置基于内存的扩缩容,也应设置内存请求,使 Kubernetes 可以相对于请求量计算内存利用率。

升级 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 官方文档: