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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Ingress Controller(Nginx)是深受Kubernetes开发者欢迎的接入层网关方案,具有功能丰富、配置简单等特点,特别是对于从前使用Nginx的开发者而言,可以快速掌握驾轻就熟。本文中会为大家介绍如何通过Ingress的指标进行弹性伸缩。

前言

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

ingress.png

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

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

156154273240696_zh-CN.png

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

image_20190809230710921

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

image_20190809231351940

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

image_20190809231632091

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

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

image_20190809232439258

压测配置中,我们设置最大并发为20,设置压测时长为10分钟,点击右上角保存去压测。
image_20190809232544118

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

image_20190809232731445

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

image_20190809232856294

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
15天前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
24天前
|
存储 Kubernetes 持续交付
介绍一下Kubernetes的应用场景
【10月更文挑战第18天】介绍一下Kubernetes的应用场景。
109 3
|
1月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
163 0
|
2月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
155 8
|
1月前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
3月前
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
146 6
|
3月前
|
存储 Kubernetes API
在K8S中,etcd 适应的场景?
在K8S中,etcd 适应的场景?
|
3月前
|
Kubernetes 负载均衡 应用服务中间件
在k8S中,ingress是什么?
在k8S中,ingress是什么?
|
3月前
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
72 0
|
3月前
|
存储 缓存 Kubernetes
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)

相关产品

  • 容器服务Kubernetes版