多实例部署可以最大程度的保证应用的稳定性,但同时也会造成闲时资源的浪费和高额成本。手动调节方式工作量大还存在一定程度的滞后性。通过Nginx Ingress对多个应用进行HPA,可以保障部署在ACK集群上的应用的稳定性以及达到更好的成本控制。本文介绍通过Nginx Ingress对多个应用进行HPA的方法。
前提条件
通过Nginx Ingress对多个应用进行HPA前,需要将阿里云Prometheus指标转换成HPA可用的指标,您需要部署相关组件。
- 部署阿里云Prometheus监控组件。具体操作,请参见开启阿里云Prometheus监控。
- 部署alibaba-cloud-metrics-adapter组件。具体操作,请参见部署alibaba-cloud-metrics-adapter组件。
- 已安装压力测试工具Apache Benchmark。更多信息,请参见Apache Benchmark。
背景信息
在实际的生产中,您使用请求量来自动扩缩容时,可以通过注册http_requests_total来透出请求量指标,同时推荐使用Ingress组件自带的指标来进行HPA。
Ingress是Kubernetes API中的标准资源类型之一。Ingress实现的功能是将客户端请求的Host名称或请求的URL路径,转发到指定的Service资源中,即将Kubernetes集群外部的请求转发至集群内部的Service中,再被Service转发至Pod,处理客户端的请求。
Nginx Ingress Controller是部署于集群内部的Ingress控制器,可以为您提供性能更好,且定制性更高的使用方式。ACK集群提供的Nginx Ingress Controller在社区版本的基础上,整合了阿里云产品的一系列功能,提供了更加便捷的使用体验。
操作步骤
本教程包含两个ClusterIP型服务,通过Nginx Ingress实现对外的流量路由。基于nginx_ingress_controller_requests
指标,为应用配置HPA,以实现随着流量的变化为Pod扩缩容的功能。
- 使用以下YAML文件创建业务Deployment和对应的Service。
- 创建ingress.yaml文件。然后执行
kubectl apply -f ingress.yaml
命令,部署Ingress资源。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress namespace: default spec: ingressClassName: nginx rules: - host: test.cf6828835dbba4a368e67f0b9925d****.cn-qingdao.alicontainer.com http: paths: - backend: service: name: sample-app port: number: 80 path: / pathType: ImplementationSpecific - backend: service: name: test-app port: number: 8080 path: /home pathType: ImplementationSpecific
- host:指定服务访问域名,本示例使用集群的默认域名。集群默认域名格式为:
*.[cluster-id].[region-id].alicontainer.com
,cluster-id
、region-id
请替换为实际值。 - path:指定访问的URL路径。请求到来之后会根据路由规则匹配相应的Service,然后通过Service访问相应的Pod。
- backend:由Service名称和Service端口组成,指定当前
path
转发的Service。
- host:指定服务访问域名,本示例使用集群的默认域名。集群默认域名格式为:
- 执行以下命令,获取Ingress资源。
kubectl get ingress -o wide
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress nginx test.cf6828835dbba4a368e67f0b9925d****.cn-qingdao.alicontainer.com 10.10.10.10 80 55s
- 部署成功后,可以通过
/
和/home
两个路径分别访问Host地址。Nginx Ingress Controller会根据上面的配置分别访问test-app和sample-app。通过阿里云Prometheus查询指标nginx_ingress_controller_requests
来获取各应用的请求情况,详情如下。 - 修改组件alibaba-cloud-metrics-adapter中的adapter.config文件,将Prometheus中的指标转换成HPA可用的指标。说明 在进行本步骤前,请确保已完成了组件alibaba-cloud-metrics-adapter的部署和prometheus.url的配置。
- 执行以下命令,查看指标输出。
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": "2022-03-31T10:11:37Z", "value": "0" } ] }
- 创建hpa.yaml文件。然后执行
kubectl apply -f hpa.yaml
命令,对业务应用sample-app和test-app分别部署HPA。apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: sample-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: nginx_ingress_controller_per_second selector: matchLabels: #可以通过这个字段对指标进行过滤,这里设置的字段会传入adapter.config中的<<.LabelMatchers>>标签。 service: sample-app #External指标类型下只支持Value和AverageValue类型的目标值。 target: type: AverageValue averageValue: 30 ---------- apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: test-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: test-app minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: nginx_ingress_controller_per_second selector: matchLabels: #可以通过这个字段对指标进行过滤,这里设置的字段会传入adapter.config中的<<.LabelMatchers>>标签。 service: test-app #External指标类型下只支持Value和AverageValue类型的目标值。 target: type: AverageValue averageValue: 30
- 执行以下命令,查看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部署成功后,进行压测实验,观察业务应用是否会随着请求增大而扩容。