K8s集群HPA活动情况监控与报警

举报
可以交个朋友 发表于 2024/01/23 19:42:39 2024/01/23
【摘要】 但是通常kubernetes事件的记录保持时间仅有1h,应用程序如果在凌晨触发了HPA事件,对于用户来说是无法感知的,所以就需要一个**监控界面或者告警通知**的行为来知晓HPA活动情况。

一 背景

为工作负载配置HPA弹性伸缩策略,可以实现pod实例的动态扩缩容,提高了资源利用率的同时也解决了流量高峰场景下的应用性能瓶颈。
HPA指标状态、实例大小变化等这些信息对用户来说也是十分宝贵的,可以帮助我们了解业务程序的高峰期是什么时候,以及设置HPA的大小边界是否合理。但是通常kubernetes事件的记录保持时间仅有1h(后续改进),应用程序如果在凌晨触发了HPA事件,对于用户来说是无法感知的,所以就需要一个监控界面或者告警通知的行为来知晓HPA活动情况。


二 HPA相关指标普罗监控解决方案

开源kube-state-metrics程序可以用来监控kubernetes集群中的各种资源信息,包括 horizontalpodautoscalers、deployments、pods、services等
其中HPA关键指标有:

  • kube_horizontalpodautoscaler_spec_max_replicas: HPA设置的最大实例数
  • kube_horizontalpodautoscaler_spec_min_replicas:HPA设置的最小实例数
  • kube_horizontalpodautoscaler_spec_target_metric: HPA设置的期望指标值
  • kube_horizontalpodautoscaler_status_target_metric:HPA对应负载的实际指标值
  • kube_horizontalpodautoscaler_status_condition: HPA状态包括AbleToScale,ScalingActive,ScalingLimited
  • kube_horizontalpodautoscaler_status_current_replicas: HPA对应负载当前实例数
  • kube_horizontalpodautoscaler_status_desired_replicas:HPA对应负载的期望实例数

可以通过使用这些指标进行dashboard的定制,实现HPA活动情况的监测。
安装开源kube-state-metrics组件,对接prometehus监控系统,最后使用grafana定制相关dashboard。
注意因为只需要采集hpa相关指标信息,本文档kube-state-metrics程序的安装只限制了对horizontalpodautoscalers资源的采集。其它资源指标的采集不作演示。


2.1 安装kube-state-metrics程序

  1. 创建serviceaccount,负载实例需要使用该sa身份进行集群资源获取

    apiVersion: v1
    automountServiceAccountToken: false
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/component: exporter
        app.kubernetes.io/name: kube-state-metrics
        app.kubernetes.io/version: 2.10.0
      name: kube-state-metrics
      namespace: monitoring
    
  2. 创建cluster-role,定义rules规则

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        app.kubernetes.io/component: exporter
        app.kubernetes.io/name: kube-state-metrics
        app.kubernetes.io/version: 2.10.0
      name: kube-state-metrics
    rules:
    - apiGroups:
      - autoscaling
      resources:
      - horizontalpodautoscalers
      verbs:
      - list
      - watch
    
  3. 创建cluster-role-binding,将serviceaccount与上述role进行绑定

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      labels:
        app.kubernetes.io/component: exporter
        app.kubernetes.io/name: kube-state-metrics
        app.kubernetes.io/version: 2.10.0
      name: kube-state-metrics
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: kube-state-metrics
    subjects:
    - kind: ServiceAccount
      name: kube-state-metrics
      namespace: monitoring
    
    
  4. 创建kube-state-metrics工作负载

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/component: exporter
        app.kubernetes.io/name: kube-state-metrics
        app.kubernetes.io/version: 2.10.0
      name: kube-state-metrics
      namespace: monitoring
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: kube-state-metrics
      template:
        metadata:
          labels:
            app.kubernetes.io/component: exporter
            app.kubernetes.io/name: kube-state-metrics
            app.kubernetes.io/version: 2.10.0
        spec:
          automountServiceAccountToken: true
          containers:
          - image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.10.0
            args:
              - '--resources=horizontalpodautoscalers'
            livenessProbe:
              httpGet:
                path: /healthz
                port: 8080
              initialDelaySeconds: 5
              timeoutSeconds: 5
            name: kube-state-metrics
            ports:
            - containerPort: 8080
              name: http-metrics
            - containerPort: 8081
              name: telemetry
            readinessProbe:
              httpGet:
                path: /
                port: 8081
              initialDelaySeconds: 5
              timeoutSeconds: 5
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop:
                - ALL
              readOnlyRootFilesystem: true
              runAsNonRoot: true
              runAsUser: 65534
              seccompProfile:
                type: RuntimeDefault
          serviceAccountName: kube-state-metrics
    
  5. 创建service

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/component: exporter
        app.kubernetes.io/name: kube-state-metrics
        app.kubernetes.io/version: 2.10.0
      name: kube-state-metrics
      namespace: monitoring
    spec:
      clusterIP: None
      ports:
      - name: http-metrics
        port: 8080
        targetPort: http-metrics
      - name: telemetry
        port: 8081
        targetPort: telemetry
      selector:
        app.kubernetes.io/name: kube-state-metrics
    
  6. 上述各种资源部署完毕后,查看容器状态
    image.png


2.2 编写servicemonitor对接prometheus

集群使用的prometheus-operator方式,所以需要配置servicemonitor crd进行指标抓取

kind: ServiceMonitor
apiVersion: monitoring.coreos.com/v1
metadata:
  name: kube-state-metrics
  namespace: monitoring
  labels:
    service-monitor: kube-state-metrics
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: kube-state-metrics
  endpoints:
  - port: http-metrics

将上述规则在集群中应用后,稍等片刻查看Prometheus 控制台可以发现kube-state-metrics指标已经成功抓取
image.png
image.png


2.3 使用Grafana dashboard 进行指标展示

以下看板可以查看对应HPA的最大最小实例数,以及期望实例数和当前运行的实例数。还可以查看历史时刻相关HPA实例的震荡图,并将期望实例数和当前运行实例数进行对比,更加直观的看到HPA快速拉起pod实例的过程
image.png


三 HPA事件告警通知解决方案

该方案借助于AOM在CCE上的log-agent插件和华为云AOM服务实现。其中log-agent负责采集kubernetes事件,并将事件持久化存储在华为云LTS服务中,AOM服务可以用于实现基于CCE集群事件的告警功能。
image.png


3.1 开通kubernetes 事件采集策略

  1. 需要前往CCE控制台 -->> 日志中心 -->> 日志采集策略进行配置
    image.png

    image.png


  1. 配置完成后,查看kubernetes事件记录
    可先触发HPA弹性伸缩事件,然后再观察事件记录
    image.png

3.2 前往AOM服务配置告警规则

  1. 前往告警列表查看事件信息
    image.png

  2. 创建告警规则
    前往告警规则页面创建告警,创建告警时需要使用事件名称,可参考告警列表中的事件名称
    image.png

    告警规则的设置,需要使用事件告警规则,事件类型为自定义事件
    image.png

    最后需要开启告警通知通能,才能将事件告警以邮箱或者短信、微信、钉钉等方式进行通知。若没有可用的行动规则,可参照3.3章节进行告警行动规则的配置
    image.png


3.3 配置告警行动规则

  1. 首先进行消息通知服务的主题配置
    image.png
    image.png

    添加订阅可以决定使用何种方式进行告警信息通知
    image.png

    添加完毕后,系统会发发送订阅确认邮件。点击订阅确认即可。
    image.png


  1. 创建告警行动规则
    告警行动规则中需要使用上述步骤创建的消息主题。消息模板可适用内置的aom.built-in.template.zh
    image.png

3.4 确认告警信息发送

  1. 手动触发弹性伸缩事件
    image.png

  2. 观察邮箱是否收到HPA弹性事件通知
    邮箱已收到CCE集群HPA事件告警通知
    image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。