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

自动扩缩容 API7 Gateway (K8s)

自动扩缩容(Autoscaling)是一种自动调整网关可用资源的机制,可确保在不同的流量负载下保持一致的性能。

本文档将指导你设置 CPU 和内存请求、为 API7 Gateway 创建水平 Pod 自动扩缩容(HPA),并通过简单的负载测试验证扩缩容行为,使你的部署能够动态响应工作负载的变化。

以下说明假设 API7 Gateway 已安装在 Kubernetes 集群中。

部署 Metrics Server

水平 Pod 自动扩缩容(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 连接(这在某些集群配置中可能是必需的):

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-ee-3-gateway-7998bf6dc6-2kh7q 16m 291Mi

这证实了正在收集指标并可供 HPA 使用。

配置资源请求与限制

为确保适当的资源分配并使 HPA 有效地对 API7 Gateway 进行扩缩容,你应为网关 Pod 设置 CPU 和内存请求(requests)与限制(limits)。

为此,请导出你当前 API7 Gateway release 的 Helm values:

# 更新为你的网关名称
helm get values api7-ee-3-gateway --all > values.yaml

更新 resources 部分,包含 CPU 和内存的请求和限制。这确保了 Kubernetes 调度器能为每个 Pod 分配足够的资源,并且 HPA 能准确地监控 Pod 的使用情况。

以下值为示例设置。在生产环境中,你应根据预期流量、工作负载特征和集群资源调整 CPU 和内存请求与限制。

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-ee-3-gateway api7/gateway -f values.yaml

创建 HPA

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

gateway-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: gateway-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api7-ee-3-gateway # 更新为你的网关部署名称
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-ee-3-gateway cpu: 7%/50% 2 10 2 30s

通过负载测试验证自动扩缩容

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

# 更新为你的网关服务名称
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-ee-3-gateway-gateway/ >/dev/null 2>&1; done" &
done

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

kubectl get hpa gateway-hpa -w

你应该会看到 CPU 利用率上升。当负载持续且足够高时,HPA 会开始向上扩展(scale up)网关部署:

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

要观察部署向下扩展(scale down),请删除所有生成负载的 Pod:

kubectl delete pod -l app=loadgen

你应该会看到 CPU 利用率下降,并且网关部署向下扩展了副本数量:

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

后续步骤

除了本指南中显示的基于 CPU 的方法外,Kubernetes 还提供了多种自动扩缩容策略。根据你的工作负载特征,API7 Gateway 可以基于内存利用率、自定义指标或多个指标的组合进行扩缩容,从而实现更准确的扩缩容决策。此外,Kubernetes 允许配置扩缩容策略以控制向上和向下扩展事件的速率,这对于在生产环境中保持稳定性非常重要。

要全面了解支持的指标、扩缩容行为和高级配置选项,请参阅官方 Kubernetes 文档: