多实例部署提升了应用的稳定性,但也可能导致资源闲置和集群成本上升。手动调节不仅工作量大,还存在滞后性。使用 Nginx Ingress 对多个应用实施 HPA,可以根据负载动态调整 Pod 副本数量,在确保应用稳定性和响应速度的同时,优化资源使用并降低成本。本文将介绍如何通过 Nginx Ingress 实现多应用 HPA。
Ingress 可将外部请求转发至集群内的 Service,再由 Service 转发至 Pod 处理客户端请求。生产环境中可以基于请求量配置自动扩缩容,通过注册nginx_ingress_controller_requests指标来暴露请求量,基于 Nginx Ingress Controller 自带的指标实现 HPA。ACK 集群的 Nginx Ingress Controller 在社区版基础上进行了功能增强,使用更便捷。
前提条件
通过Nginx Ingress对多个应用进行HPA前,需要将阿里云Prometheus指标转换成HPA可用的指标,需完成如下准备工作。
已部署阿里云Prometheus监控组件,请参见使用阿里云Prometheus监控。
已部署ack-alibaba-cloud-metrics-adapter组件并完成组件的
prometheus.url
字段的配置。已安装压力测试工具Apache Benchmark。
本教程将创建两个Deployment及其对应的Service,并通过路由Ingress配置了不同的访问路径,实现对外的流量路由。然后,基于nginx_ingress_controller_requests
指标为应用配置了HPA,并通过HPA的selector.matchLabels.service
字段对指标进行过滤,以实现随着流量的变化为Pod扩缩容的功能。
步骤一:创建应用与服务
使用以下YAML文件创建业务Deployment和对应的Service。
创建并拷贝以下内容到nginx1.yaml文件。
执行以下命令,创建应用test-app和对应的Service。
kubectl apply -f nginx1.yaml
创建并拷贝以下内容到nginx2.yaml文件。
执行以下命令,创建应用sample-app和对应的Service。
kubectl apply -f nginx2.yaml
步骤二:创建路由
创建并拷贝以下内容到ingress.yaml文件。
执行以下命令,部署Ingress资源。
kubectl apply -f ingress.yaml
执行以下命令,获取Ingress资源。
kubectl get ingress -o wide
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress nginx test.example.com 10.XX.XX.10 80 55s
部署成功后,可以通过
/
和/home
两个路径分别访问Host地址。Nginx Ingress Controller会根据上方配置分别访问sample-app和test-app。通过阿里云Prometheus查询指标nginx_ingress_controller_requests
,可以获取各应用的请求情况。
步骤三:将Prometheus指标转换为HPA可用指标
修改adapter-config文件
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm列表,单击ack-alibaba-cloud-metrics-adapter,在资源区域,单击adapter-config,然后单击页面右上角的YAML 编辑。
用以下代码中的值替换代码中对应字段的值,然后单击页面下方的确定。
关于配置项详解,请参见基于阿里云Prometheus指标的容器水平伸缩。
rules: - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) name: as: ${1}_per_second matches: ^(.*)_requests resources: namespaced: false seriesQuery: nginx_ingress_controller_requests
查看指标输出
执行以下命令,查看指标输出。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_per_second" | jq .
查询指标结果如下:
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "nginx_ingress_controller_per_second",
"metricLabels": {},
"timestamp": "2025-07-25T07:56:04Z",
"value": "0"
}
]
}
步骤四:创建HPA
创建并拷贝以下内容到hpa.yaml文件。
执行以下命令,对业务应用sample-app和test-app分别部署HPA。
kubectl apply -f hpa.yaml
执行以下命令,查看HPA部署情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 0/30 (avg) 1 10 1 74s test-hpa Deployment/test-app 0/30 (avg) 1 10 1 59m
步骤五:结果验证
HPA部署成功后,使用工具Apache Benchmark进行压测实验,观察业务应用是否会随着请求增大而扩容。
执行以下命令,对Host下的
/home
路径进行压测。ab -c 50 -n 5000 test.example.com/home
执行以下命令,查看HPA情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 0/30 (avg) 1 10 1 22m test-hpa Deployment/test-app 22096m/30 (avg) 1 10 3 80m
执行以下命令,对Host的根路径进行压测。
ab -c 50 -n 5000 test.example.com/
执行以下命令,查看HPA情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 27778m/30 (avg) 1 10 2 38m test-hpa Deployment/test-app 0/30 (avg) 1 10 1 96m
从上述结果可以看到,业务应用在请求量增大超过阈值的情况下成功扩容。
相关文档
多可用区均衡是数据类型业务在高可用场景下常用的部署方式。当业务压力增大时,有多可用区均衡调度策略的应用希望能够自动扩容出多个可用区的实例来满足集群的调度水位。详细信息,请参见实现多可用区同时快速弹性扩容。
构建自定义操作系统镜像以提高复杂场景下弹性伸缩的便捷性,请参见弹性优化之自定义镜像。