美文网首页互联网科技Kubernetes
Kubernetes弹性伸缩全场景解读(六) - 使用Ingre

Kubernetes弹性伸缩全场景解读(六) - 使用Ingre

作者: 阿里云技术 | 来源:发表于2019-08-20 14:26 被阅读6次

    前言

    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 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,选择需要安装的集群,点击创建进行安装。

    步骤二:创建一个通过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_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。

    作者:莫源
    阅读原文
    本文为云栖社区原创内容,未经允许不得转载。

    相关文章

      网友评论

        本文标题:Kubernetes弹性伸缩全场景解读(六) - 使用Ingre

        本文链接:https://www.haomeiwen.com/subject/gtnusctx.html