前言
Ingress Controller(Nginx)是深受Kubernetes开发者欢迎的接入层网关方案,具有功能丰富、配置简单等特点,特别是对于从前使用Nginx的开发者而言,可以快速掌握驾轻就熟。
当服务对外的流量被Ingress Controller统一接管后,如何更好的运维管理Ingress Controller,成为了很多运维开发者需要关心的重要内容。通常运维一个网关型的产品,我们需要关心的整体的流量状况、请求的时延、DAU的分布等等。在之前的文章中,向大家介绍了如何通过SLS进行Ingress的流量可视化,今天我们会介绍如何消费采集上来的这些Ingress指标,并实现一条完整的弹性闭环。
HPA云指标的数据源 - alibaba-cloud-metrics-adapter
当通过SLS将Ingress的请求日志进行采集、分析并展现为数据大盘后,一些单位时间PV很高(QPS高)、部分接口时延很长的应用都无处遁形,有经验的运维同学会根据具体的场景进行应用的调优,例如内核参数的调优,网关配置的调优等等,同时对于RT较高的应用同时也会增加相应的副本数,提高应用的响应速度。那么是否有自动的方式可以将这些对副本的调整进行标准化呢?
这里我们就要引出今天的主角alibaba-cloud-metrics-adapter
了,在Kubernetes中,监控数据除了用来展现具体的指标和数据,还有一个重要的用途就是通过HPA进行数据消费。为了满足开发者不同层次的监控需求,Kubernetes定义了三种不同的监控数据接口,分别是Resource Metric
,Custom Metric
以及External Metric
。Resource Metric
通常是Metrics-Server
进行采集的,提供的主要是Pod、Node、Namespcae等Kubernetes中内置逻辑对象的监控;Custom Metric
顾名思义是客户自定义的监控指标,通常是通过Prometheus
进行采集,在通过HPA进行消费;External Metric
主要针对外部指标,通常是面向云场景的,例如如果希望在Kubernetes集群中获取SLB的最大连接数作为弹性指标或者其他云服务的监控指标,那么通常是通过云厂商的External Metric
实现来提供的。
alibaba-cloud-metrics-adapter
也不例外,目前提供了SLB、SLS(Ingress)、云监控等指标的透出,开发者可以通过alibaba-cloud-metrics-adapter
使用云指标进行HPA。今天的例子,我们主要是通过alibaba-cloud-metrics-adapter
实现Ingress指标的HPA。
使用Ingress QPS与RT指标进行弹性伸缩
步骤一:安装alibaba-cloud-metrics-adapter
在容器服务的应用目录中选择ack-alibaba-cloud-metrics-adapter
,选择需要安装的集群,点击创建进行安装。
步骤二:创建一个通过Ingress暴露服务的应用
首先,我们创建一个应用,并暴露一个ClusterIP的Service。
apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment-basic
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
通过控制台将刚才创建的Service,通过Ingress的方式进行暴露。
此时,我们可以通过生成的Ingress地址进行访问,确认部署的应用已经可以对外服务。
步骤三:使用PTS进行压力测试
PTS是阿里云上的一款压力测试的工具,提供一键压测的能力,开发者只需简单的配置,即可实现大部分通用场景的压测,今天我们测试的场景比较简单,使用PTS的快速压测即可。
压测配置中,我们设置最大并发为20,设置压测时长为10分钟,点击右上角保存去压测。
此时可以在PTS中查看到当前的QPS状态如下图所示。
在Ingress Dashboard中,我们可以实时看到对应路由的数据盯屏。
步骤四:设置HPA进行弹性伸缩
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: ingress-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1beta2
kind: Deployment
name: nginx-deployment-basic
minReplicas: 2
maxReplicas: 10
metrics:
- type: External
external:
metric:
name: sls_ingress_qps
selector:
matchLabels:
sls.project: "k8s-log-c550367cdf1e84dfabab013b277cc6bc2"
sls.logstore: "nginx-ingress"
sls.ingress.route: "default-nginx-80"
target:
type: AverageValue
averageValue: 10
- type: External
external:
metric:
name: sls_ingress_latency_p9999
selector:
matchLabels:
# default ingress log project is k8s-log-clusterId
sls.project: "k8s-log-c550367cdf1e84dfabab013b277cc6bc2"
# default ingress logstre is nginx-ingress
sls.logstore: "nginx-ingress"
# namespace-svc-port
sls.ingress.route: "default-nginx-80"
target:
type: Value
# sls_ingress_latency_p9999 > 10ms
value: 10
sls_ingress_qps
与sls_ingress_latency_p9999
是本次伸缩使用的两个指标,在target的type中,我们为sls_ingress_qps
设置的是AverageValue
,表示QPS要除以Pod的数目进行判断。而sls_ingress_latency_p9999
这个指标使用时,我们使用的是Value
,表示无需除以Pod的数目,这两种不同的type会在HPA的设置中经常用到。
其他HPA的配置主要涉及如下三个参数:
- sls.project: "k8s-log-c550367cdf1e84dfabab013b277cc6bc2"
- sls.logstore: "nginx-ingress"
- sls.ingress.route: "default-nginx-80"
sls.project是指创建集群时开启日志服务的project地址,sls.logstore默认为nginx-ingress
,sls.ingress.route是指具体要进行观测的路由,规则为namespace-svc-port。
设置好HPA后,我们通过命令行kubectl describe hpa ingress-hpa
进行伸缩状态的检查。
Name: ingress-hpa
Namespace: default
Labels: <none>
Annotations: <none>
CreationTimestamp: Fri, 09 Aug 2019 23:31:07 +0800
Reference: Deployment/nginx-deployment-basic
Metrics: ( current / target )
"sls_ingress_qps" (target average value): 8223m / 10
"sls_ingress_latency_p9999" (target value): 7 / 10
Min replicas: 2
Max replicas: 10
Deployment pods: 9 current / 9 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ScaleDownStabilized recent recommendations were higher than current one, applying the highest recent recommendation
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-nginx-80,sls.logstore: nginx-ingress,sls.project: k8s-log-c550367cdf1e84dfabab013b277cc6bc2,},MatchExpressions:[],})
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 18s horizontal-pod-autoscaler New size: 4; reason: external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-nginx-80,sls.logstore: nginx-ingress,sls.project: k8s-log-c550367cdf1e84dfabab013b277cc6bc2,},MatchExpressions:[],}) above target
Normal SuccessfulRescale 12s horizontal-pod-autoscaler New size: 8; reason: external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-nginx-80,sls.logstore: nginx-ingress,sls.project: k8s-log-c550367cdf1e84dfabab013b277cc6bc2,},MatchExpressions:[],}) above target
Normal SuccessfulRescale 7s horizontal-pod-autoscaler New size: 9; reason:
可以发现Pod已经正常伸缩,这样一个应用基于Ingress QPS的伸缩就已经完成。
最后
alibaba-cloud-metrics-adapter
已经正式开源,更多的伸缩指标和参数配置,可以访问github仓库获取更多信息,同业也欢迎开发者提交issue与PR。