HPA使用自定义指标进行扩缩容

逆变季风
• 阅读 1968

kubernetes引入HPA进行扩缩容,HPA可以根据指标(metrics),自动对workload进行弹性的扩缩容。

HPA资源在autoscaling这个group下面,HPA分为v1和v2版本:

  • HPA v1仅支持基于CPU指标的伸缩;
  • HPA v2beta1引入了基于Memory和自定义指标的伸缩;
  • HPA v2beta2引入了自定义策略(behavior)的伸缩;
  • HPA v2将v2beta2变成GA功能;
# kubectl api-versions|grep auto
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
autoscaling/v2

一.HPA的指标类型

  • Resouce: 提供Pod级别的CPU/Memory使用量;

    • 通过metrics-server提供指标,调用metrics.k8s.io;
  • ContainerResource: 提供Container级别的CPU/Memory使用量;

    • 通过metrics-server提供指标,调用metrics.k8s.io;
  • Object: 提供k8s集群内任意资源的相关指标;

    • 通过prometheus-adapter提供指标,调用custom.metrics.k8s.io;
  • Pods: 提供k8s集群内任意资源的相关指标;

    • 通过prometheus-adapter提供指标,调用custom.metrics.k8s.io;
  • External: 提供k8s集群外的指标数据;

HPA使用自定义指标进行扩缩容

二.HPA自定义指标的伸缩

1. 部署prometheus-adapter

自定义指标由prometheus-adapter查询prometheus得到,所以需要部署prometheus和prometheus-adatper组件。

这里使用helm chart的方式部署:

部署完成以后:

# kubectl get pod -n monitoring
NAME                                  READY   STATUS    RESTARTS   AGE
alertmanager-main-0                   2/2     Running   0          4d20h
kube-state-metrics-796659d8b6-vr5w8   3/3     Running   0          4d20h
node-exporter-rn9nj                   2/2     Running   0          4d20h
prometheus-adapter-5f4df978c8-4fxjq   1/1     Running   0          46s
prometheus-k8s-0                      3/3     Running   1          4d20h
prometheus-operator-7bc7bd7d7-jp754   2/2     Running   0          4d20h

2. 创建deploy和service

deploy: 初始为1个副本

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-app
  labels:
    app: sample-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - image: luxas/autoscale-demo:v0.1.2
        name: metrics-provider
        ports:
        - name: http
          containerPort: 8080

service:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: sample-app
  name: sample-app
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: sample-app
  type: ClusterIP

该sample-app仅暴露了一个指标:http_requests_total:

# curl http://$(kubectl get service sample-app -o jsonpath='{ .spec.clusterIP }')/metrics
# HELP http_requests_total The amount of requests served by the server in total
# TYPE http_requests_total counter
http_requests_total 6179

3. 创建serviceMonitor

创建serviceMonitor,以便让prometheus发现sample-app,拉到它的metrics:

kind: ServiceMonitor
apiVersion: monitoring.coreos.com/v1
metadata:
  name: sample-app
  labels:
    app: sample-app
spec:
  selector:
    matchLabels:
      app: sample-app
  endpoints:
  - port: http

4. 创建prometheusRule自定义指标

通过prometheusRule创建自定义指标:

  • 创建了自定义指标:sample_app_http_requests_rate = rate(http_requests_total[5m])
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    prometheus: k8s
    role: alert-rules
  name: sample-app-rules
  namespace: monitoring
spec:
  groups:
    - name: sample-app.expr.rules
      rules:
        - expr: |
            rate(http_requests_total[5m])
          record: sample_app_http_requests_rate
          labels:
            namespace: default
            service: sample-app

可以通过kubectl查询自定义指标:

# kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/sample_app_http_requests_rate"|python -m json.tool
{
    "apiVersion": "custom.metrics.k8s.io/v1beta1",
    "items": [
        {
            "describedObject": {
                "apiVersion": "/v1",
                "kind": "Pod",
                "name": "sample-app-7cfb596f98-jmswq",
                "namespace": "default"
            },
            "metricName": "sample_app_http_requests_rate",
            "selector": null,
            "value": "33m"
        }
    ],
    "kind": "MetricValueList",
    "metadata": {
        "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/sample_app_http_requests_rate"
    }
}

5. 创建HPA

使用 sample_app_http_requests_rate 指标,创建HPA:

kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta1
metadata:
  name: sample-app
spec:
  scaleTargetRef:
    # point the HPA at the sample application
    # you created above
    apiVersion: apps/v1
    kind: Deployment
    name: sample-app
  # autoscale between 1 and 10 replicas
  minReplicas: 1
  maxReplicas: 10
  metrics:
  # use a "Pods" metric, which takes the average of the
  # given metric across all pods controlled by the autoscaling target
  - type: Pods
    pods:
      # use the metric that you used above: pods/sample_app_http_requests_rate
      metricName: sample_app_http_requests_rate
      # target 500 milli-requests per second,
      # which is 1 request every two seconds
      targetAverageValue: 500m

6. 加大流量观察HPA

通过curl命令,加大流量:

# while true; do curl http://$(kubectl get service sample-app -o jsonpath='{ .spec.clusterIP }')/metrics; sleep 0.1; done

等待一会后,观察hpa对象,可以看到deploy已扩容为5个副本:

# kubectl get hpa sample-app
NAME         REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
sample-app   Deployment/sample-app   697m/500m   1         10        5          45h

再次通过kubectl 查询自定义指标:

# kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/sample_app_http_requests_rate?selector=app%3Dsample-app | python -m json.tool
{
    "apiVersion": "custom.metrics.k8s.io/v1beta1",
    "items": [
        {
            "describedObject": {
                "apiVersion": "/v1",
                "kind": "Pod",
                "name": "sample-app-7cfb596f98-9vkrb",
                "namespace": "default"
            },
            "metricName": "sample_app_http_requests_rate",
            "selector": null,
            "value": "263m"
        },
        {
            "describedObject": {
                "apiVersion": "/v1",
                "kind": "Pod",
                "name": "sample-app-7cfb596f98-f4dqr",
                "namespace": "default"
            },
            "metricName": "sample_app_http_requests_rate",
            "selector": null,
            "value": "553m"
        },
        {
            "describedObject": {
                "apiVersion": "/v1",
                "kind": "Pod",
                "name": "sample-app-7cfb596f98-jmswq",
                "namespace": "default"
            },
            "metricName": "sample_app_http_requests_rate",
            "selector": null,
            "value": "1740m"
        },
        {
            "describedObject": {
                "apiVersion": "/v1",
                "kind": "Pod",
                "name": "sample-app-7cfb596f98-qg24g",
                "namespace": "default"
            },
            "metricName": "sample_app_http_requests_rate",
            "selector": null,
            "value": "234m"
        }
    ],
    "kind": "MetricValueList",
    "metadata": {
        "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/sample_app_http_requests_rate"
    }
}

参考:

1.github-doc:https://github.com/arielb135/HPA-with-prometheus-and-RabbitMQ/blob/master/README.md
2.HPA指标类型:https://mp.weixin.qq.com/s/ul2G1WFPmHo5QR0xI143jg

点赞
收藏
评论区
推荐文章
Effective HPA:预测未来的弹性伸缩产品
作者胡启明,腾讯云专家工程师,专注Kubernetes、降本增效等云原生领域,Crane核心开发工程师,现负责成本优化开源项目Crane开源治理和弹性能力落地工作。余宇飞,腾讯云专家工程师,专注云原生可观测性、成本优化等领域,Crane核心开发者,现负责Crane资源预测、推荐落地、运营平台建设等相关工作。田奇,腾讯高级工程师,专注分布式资源管
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Prodan Labs Prodan Labs
4年前
Kubernetes Pod 自动扩容 — HPA
Kubernetes增强了应用服务的横向扩容能力,在应对线上应用服务的资源使用率在高峰和低谷的时候,我们需要能够自动去感知应用的负载变化去调整Pod的副本数量,削峰填谷,提高集群的整体资源利用率和应用的服务质量。为此,Kubernetes1.2版本中引入HorizontalPodAutoscaling(HPA),它与kubectlsc
Stella981 Stella981
3年前
Serverless Kubernetes 应用部署及扩缩容
作者|邓青琳(轻零) 阿里云技术专家来源|Serverless公众号,本文整理自《Serverless技术公开课》导读:本文分为三个部分,首先给大家演示ServerlessKubernetes集群的创建和业务应用的部署,其次介绍ServerlessKubernetes的常用功能,最后对应用扩缩容的操作进行探讨。集群
Stella981 Stella981
3年前
Serverless SSR 技术在猎豹移动的实践
作者:董文枭|策划:王俊杰为了追求速度体验和极致的SEO效果,越来越多的技术管理者和架构师倾向于采用SSR(ServerSideRendering)技术来构建前端项目,以支持同构代码的服务器端渲染。而在云的时代,更多的应用将迁移到云端部署,Serverless云技术因其降低开发成本、按需自动扩缩容、免运维等诸多优势,已经大量被开发
Wesley13 Wesley13
3年前
MySQL分布式架构扩缩容的初步设计(二)
这是学习笔记的第1834篇文章之前总结了一篇扩缩容的初步设计,我们来做第二篇。MySQL分布式架构扩缩容的初步设计(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5ODEzNDA4OA%3D%3D
Stella981 Stella981
3年前
Kubernetes 弹性伸缩全场景解析(三)
在上一篇文章中,给大家介绍和剖析了HPA的实现原理以及演进的思路与历程。本文我们将会为大家讲解如何使用HPA以及一些需要注意的细节。autoscaling/v1 实践v1的模板可能是大家平时见到最多的也是最简单的,v1版本的HPA只支持一种指标—— CPU。传统意义上,弹性伸缩最少也会支
Stella981 Stella981
3年前
Kubernetes 基于 Metrics Server 与 HPA 的使用
!image(https://oscimg.oschina.net/oscnet/fdf644cb8e7c3b97d60c8387d84cdf3a0c3.png"image")(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fimg2018.cnblogs.com%2Fblog%2
VictoriaMetrics常见性能问题排查
VM集群由以下子模块组成vmstorage:存储原始数据,并根据指定时间范围和标签过滤条件等返回查询数据集vminsert:接收数据写入,并根据指标名和标签按一致性hash分发至集群中vmstorage节点vmselect:执行查询请求,从数据所在的vmstorage节点获取数据每个模块可以独立扩缩容。其中vmstorage各节点之间不互相通信,属于sharenothing架构。如此可以增加集群可用性,也简化了集群维护、扩容。
京东云开发者 京东云开发者
11个月前
【京东云新品发布月刊】2024年7月产品动态
京东云7月产品动态:1.【消息队列RocketMQ】新品上线消息队列RocketMQ是京东云基于ApacheRocketMQ打造的一款低延迟、高并发、高可用、高可靠的分布式消息队列服务。支持开源客户端零改造接入,同时具备计算存储分离,灵活扩缩容的优势。能够