Kubernetes弹性伸缩全场景解读(六) - 使用Ingress指标进行弹性伸缩

前言

Ingress Controller(Nginx)是深受Kubernetes开发者欢迎的接入层网关方案,具有功能丰富、配置简单等特点,特别是对于从前使用Nginx的开发者而言,可以快速掌握驾轻就熟。

Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

当服务对外的流量被Ingress Controller统一接管后,如何更好的运维管理Ingress Controller,成为了很多运维开发者需要关心的重要内容。通常运维一个网关型的产品,我们需要关心的整体的流量状况、请求的时延、DAU的分布等等。在之前的文章中,向大家介绍了如何通过SLS进行Ingress的流量可视化,今天我们会介绍如何消费采集上来的这些Ingress指标,并实现一条完整的弹性闭环。

HPA云指标的数据源 - alibaba-cloud-metrics-adapter

Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

当通过SLS将Ingress的请求日志进行采集、分析并展现为数据大盘后,一些单位时间PV很高(QPS高)、部分接口时延很长的应用都无处遁形,有经验的运维同学会根据具体的场景进行应用的调优,例如内核参数的调优,网关配置的调优等等,同时对于RT较高的应用同时也会增加相应的副本数,提高应用的响应速度。那么是否有自动的方式可以将这些对副本的调整进行标准化呢?

这里我们就要引出今天的主角alibaba-cloud-metrics-adapter了,在Kubernetes中,监控数据除了用来展现具体的指标和数据,还有一个重要的用途就是通过HPA进行数据消费。为了满足开发者不同层次的监控需求,Kubernetes定义了三种不同的监控数据接口,分别是Resource MetricCustom Metric以及External MetricResource 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,选择需要安装的集群,点击创建进行安装。

Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

步骤二:创建一个通过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的方式进行暴露。

Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

此时,我们可以通过生成的Ingress地址进行访问,确认部署的应用已经可以对外服务。

Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

步骤三:使用PTS进行压力测试

PTS是阿里云上的一款压力测试的工具,提供一键压测的能力,开发者只需简单的配置,即可实现大部分通用场景的压测,今天我们测试的场景比较简单,使用PTS的快速压测即可。

Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

压测配置中,我们设置最大并发为20,设置压测时长为10分钟,点击右上角保存去压测。
Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

此时可以在PTS中查看到当前的QPS状态如下图所示。

Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

在Ingress Dashboard中,我们可以实时看到对应路由的数据盯屏。

Kubernetes弹性伸缩全场景解读(六) -  使用Ingress指标进行弹性伸缩

步骤四:设置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_qpssls_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。

上一篇:win7忘记密码


下一篇:去掉Windows默认共享