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

本文涉及的产品
容器镜像服务 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。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
28天前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
3月前
|
Kubernetes 负载均衡 应用服务中间件
kubernetes—Ingress详解
kubernetes—Ingress详解
69 0
|
3月前
|
Kubernetes 应用服务中间件 nginx
|
4月前
|
Kubernetes 应用服务中间件 nginx
k8s ingress不生效的bug 解决了。
k8s ingress不生效的bug 解决了。
|
4月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习-Ingress(安装、模板、创建、删除)
k8s学习-Ingress(安装、模板、创建、删除)
86 0
|
5月前
|
Kubernetes 应用服务中间件 API
5 分钟了解 Kubernetes Ingress 和 Gateway API
5 分钟了解 Kubernetes Ingress 和 Gateway API
110 0
|
29天前
|
存储 Kubernetes 监控
Kubernetes(k8s)集群健康检查常用的五种指标
Kubernetes(k8s)集群健康检查常用的五种指标
82 1
|
1月前
|
弹性计算 运维 Kubernetes
云原生K8S场景自动化响应ECS系统事件
客户云原生K8S场景下,通过社区开源NPD+Draino+Autoscaler零开发,对接响应ECS主动运维事件,通过自动响应事件减少非预期宕机。
|
1月前
|
容器
在容器服务ACK中,如果你想更改ALB Ingress的域名和端口
【2月更文挑战第15天】在容器服务ACK中,如果你想更改ALB Ingress的域名和端口
13 3
|
2月前
|
Kubernetes Linux 调度
「译文」深入了解 Kubernetes 指标 - 第三部分 - 容器资源指标
「译文」深入了解 Kubernetes 指标 - 第三部分 - 容器资源指标

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多