跳到主要内容

自动扩展 APISIX 网关 (K8s)

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

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

以下说明假定 APISIX 已安装在 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

假设 APISIX Pod 在当前命名空间中运行,你应该会看到其 CPU 和内存指标:

NAME                                         CPU(cores)   MEMORY(bytes)   
apisix-595698f9df-hmbwn 19m 296Mi

这确认了指标正在被收集并且可供 HPA 使用。

配置资源请求和限制

为了确保适当的资源分配并使 HPA 能够有效地扩展 APISIX,你应该为 APISIX Gateway Pod 设置 CPU 和内存的请求和限制。

为此,请导出你 APISIX 版本的当前 Helm 值:

helm get values apisix --all > values.yaml

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

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

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

通过升级版本来应用更新的配置:

helm upgrade apisix apisix/apisix -f values.yaml

创建 HPA

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

apisix-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: apisix-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: apisix
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50

应用配置以创建 HPA:

kubectl apply -f apisix-hpa.yaml

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

kubectl get hpa

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

NAME         REFERENCE           TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
apisix-hpa Deployment/apisix cpu: 6%/50% 2 10 2 10m

使用负载测试验证自动扩展

为了验证自动扩展,你将启动 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://apisix-gateway/ >/dev/null 2>&1; done" &
done

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

kubectl get hpa apisix-hpa -w

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

NAME         REFERENCE           TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
apisix-hpa Deployment/apisix cpu: 14%/50% 2 10 2 54m
apisix-hpa Deployment/apisix cpu: 37%/50% 2 10 2 55m
apisix-hpa Deployment/apisix cpu: 365%/50% 2 10 2 56m
apisix-hpa Deployment/apisix cpu: 73%/50% 2 10 4 56m
apisix-hpa Deployment/apisix cpu: 21%/50% 2 10 7 56m
apisix-hpa Deployment/apisix cpu: 39%/50% 2 10 7 57m

要观察部署缩减,请删除所有生成负载的 Pod:

kubectl delete pod -l app=loadgen

你应该会看到 CPU 利用率下降,并且 APISIX 部署缩减副本数量:

NAME         REFERENCE           TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
apisix-hpa Deployment/apisix cpu: 26%/50% 2 10 7 62m
apisix-hpa Deployment/apisix cpu: 17%/50% 2 10 5 63m
apisix-hpa Deployment/apisix cpu: 6%/50% 2 10 4 64m
apisix-hpa Deployment/apisix cpu: 6%/50% 2 10 3 64m
apisix-hpa Deployment/apisix cpu: 6%/50% 2 10 2 64m

后续步骤

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

有关支持的指标、扩展行为和高级配置选项的完整概述,请查阅官方 Kubernetes 文档: