应对业务突发流量时,更精准的扩缩容能够提高响应速度,并进一步提升集群资源利用效率。本文介绍如何利用Kubernetes的外部指标接口(External Metrics)集成重要业务指标(例如HTTP请求率、Ingress QPS等),实现更自动化的伸缩策略。
本文将通过以下步骤,以创建名为Nginx的Deployment、Service和Ingress为例,配置HPA自动伸缩,实现基于日志服务(SLS)中Ingress的QPS指标对容器进行水平伸缩。
步骤一:部署ack-alibaba-cloud-metrics-adapter组件
ack-alibaba-cloud-metrics-adapter组件允许 Kubernetes 通过 External Metrics API 获取阿里云产品(如 ECS、SLB、RDS 等)的监控数据,可以增强集群的监控和自动伸缩能力。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面,单击创建,完成基本信息配置,然后选中ack-alibaba-cloud-metrics-adapter,单击下一步。
在参数配置页面,选择Chart 版本,然后单击确定。
步骤二:创建应用与服务
创建nginx-test.yaml文件。
执行以下命令,创建应用Deployment和对应的Service。
kubectl apply -f nginx-test.yaml
步骤三:创建路由
在集群管理页左侧导航栏中,选择
,并在路由页面左上方,单击创建Ingress。在创建面板中填写相关信息,然后单击确定。完成创建后,系统会自动跳转至路由页面。
在操作列名称下,单击生成的Ingress名称,查看路由规则信息。关于Ingress更多详情,请参见Ingress管理
步骤四:配置HPA
您可以在HPA中配置SLS Project中伸缩使用的两个指标,例如sls_ingress_qps与sls_ingress_latency_p9999。
sls_ingress_qps:为AverageValue,表示QPS要除以Pod的数目进行判断。
sls_ingress_latency_p9999:为Value,表示无需除以Pod的数目。
创建并复制以下内容到ingress-hpa.yaml中。
HPA的配置涉及的参数如下。
参数名
是否必填
描述
参数名
是否必填
描述
sls.ingress.route
是
参数的格式为:
<namespace>-<svc>-<port>
,其中<namespace>
为Ingress所在的命名空间,<svc>
是Ingress对应的Service名称,<port>
是Ingress对应Service的Port名称。例如,default-nginx-80。sls.logstore
是
日志服务的日志库名称。集群中默认
sls.logstore
值为nginx-ingress
。sls.project
是
日志服务的Project名称。集群中默认
sls.project
值为k8s-log-集群ID
.sls.internal.endpoint
否
设置通过内网还是外网访问日志服务,默认为true。
true:通过内网访问SLS。
false:通过外网访问SLS。
执行以下命令,创建HPA。
kubectl apply -f ingress-hpa.yml
步骤五:结果验证
配置好HPA后,执行以下命令进行压测。
ab -t 300 -c 10 <ingress配置的域名> # 使用Apache Benchmark对Ingress暴露的服务设置并发为10,时间为300秒的压测。
验证指标伸缩状态。
在控制台左侧导航栏单击集群,并在集群列表页面,选择目标集群操作列的
。执行以下命令检查伸缩状态。
kubectl get hpa ingress-hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAPS AGE ingress-hpa Depolyment/nginx-deployment-basic 21/10 (avg) 2 10 10 7m49s
当REPLICAS的值和MAXPODS的值相同时,说明伸缩成功。
常见问题
如何通过命令行获取QPS指标 sls_ingress_qps
?
可以通过以下命令行查询数据。以请求指标sls_ingress_qps为例。
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress
其中, {{SLS_Project}}
是此ACK集群对应的SLS Project名称。若未自定义配置,默认为k8s-log-{{ClusterId}}
,{{ClusterId}}为此集群的ID。
若返回结果为:
Error from server: {
"httpCode": 400,
"errorCode": "ParameterInvalid",
"errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is in your log,please wrap : with quotation mark \"",
"requestID": "xxxxxxx"
}
表明此指标无数据,可能是未配置使用ALB Ingress,但使用了sls_alb_ingress_qps指标进行数据查询。
若返回结果类似为:
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "sls_ingress_qps",
"timestamp": "2025-02-26T16:45:00Z",
"value": "50", # QPS的值
"metricLabels": {
"sls.project": "your-sls-project-name",
"sls.logstore": "nginx-ingress"
}
}
]
}
表明已查到Kubernetes 外部指标QPS,其中value
为QPS值。
如果执行kubectl get hpa
后发现target一栏为<unknown>怎么办?
请参见以下流程解决。
执行
kubectl describe hpa <hpa_name>
,确认HPA失效的原因。如果Conditions字段提示AbleToScale为False,请确认Deployment是否正常部署。
如果Conditions字段提示ScalingActive为False,请继续下一步。
执行
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"
。如果返回为Error from server (NotFound): the server could not find the requested resource,请确认alibaba-cloud-metrics-adapter的启动状态。如果确认alibaba-cloud-metrics-adapter状态正常,请确认HPA指标是否是Ingress相关指标。如果是Ingress相关指标,您需要提前部署日志服务组件。更多信息,请参见Nginx Ingress访问日志分析与监控。
确认HPA指标填写正确。sls.ingress.route的值格式为
<namespace>-<svc>-<port>
。namespace为Ingress所在的命名空间。
svc是Ingress对应的Service名称。
port是Ingress对应Service的端口名称。
如何查找HPA支持的指标名称?
请参见阿里云HPA指标, 以下列举为常用指标。
指标名称 | 描述 | 附加参数 |
指标名称 | 描述 | 附加参数 |
sls_ingress_qps | 指定的IngressRoute每秒查询率 | sls.ingress.route |
sls_alb_ingress_qps | ALB数据的IngressRoute每秒查询率 | sls.ingress.route |
sls_ingress_latency_avg | 所有请求的延迟 | sls.ingress.route |
sls_ingress_latency_p50 | 50%请求的延迟 | sls.ingress.route |
sls_ingress_latency_p95 | 95%请求的延迟 | sls.ingress.route |
sls_ingress_latency_p99 | 99%请求的延迟 | sls.ingress.route |
sls_ingress_latency_p9999 | 99.99%请求的延迟 | sls.ingress.route |
sls_ingress_inflow | Ingress的流入带宽 | sls.ingress.route |
如果自定义了Nginx Ingress日志格式,如何进行适配操作?
本文介绍的使用SLS Ingress指标进行容器水平伸缩,需要您开启并正确配置集群中Nginx Ingress日志接入阿里云日志服务。
在创建集群时,日志服务是默认开启的。当您保持默认值不变,集群创建成功后,您可以在阿里云日志服务SLS控制台查看Nginx Ingress的访问日志分析报表和监控Nginx Ingress实时状态。
在创建集群时,若您手动关闭了日志服务,集群创建完成后,如果想要使用SLS Ingress指标进行容器水平伸缩,您需要重新开启或配置日志服务。详细信息,请参见Nginx Ingress访问日志分析与监控。
当您需要自定义Nginx Ingress日志格式时,由于集群中首次开启日志服务部署AliyunLogConfig的CRD只针对ACK默认Ingress Controller中的日志格式生效,若您修改过Ingress Controller的访问日志格式,请修改CRD配置中的正则表达式提取processor_regex
部分。具体操作,请参见通过DaemonSet-CRD方式采集容器日志。
相关文档
- 本页导读 (1)
- 步骤一:部署ack-alibaba-cloud-metrics-adapter组件
- 步骤二:创建应用与服务
- 步骤三:创建路由
- 步骤四:配置HPA
- 步骤五:结果验证
- 常见问题
- 如何通过命令行获取QPS指标 sls_ingress_qps?
- 如果执行kubectl get hpa后发现target一栏为<unknown>怎么办?
- 如何查找HPA支持的指标名称?
- 如果自定义了Nginx Ingress日志格式,如何进行适配操作?
- 相关文档