Prometheus 的新战场:精准监控阿里云 AKS Serverless 集群

安全 应用安全
Prometheus-Operator 是 Kubernetes 生态中广泛应用的监控组件,能够简化 Prometheus 的部署和管理。然而,随着云原生技术的发展,监控阿里云 AKS Serverless 集群成为了一个新的挑战。

引言

我们紧接着上篇的 PromQL,接着往上盖大楼。这篇我们的主角是 Prometheus-Operator 的 Prometheus,它的重要性就不言而喻了。

Prometheus-Operator 是 Kubernetes 生态中广泛应用的监控组件,能够简化 Prometheus 的部署和管理。然而,随着云原生技术的发展,监控阿里云 AKS Serverless 集群成为了一个新的挑战。这些服务本质上是无服务器的,无法通过传统的节点指标采集方式进行监控。因此,我们需要对 Prometheus 自身进行调整,以更好地适配阿里云 AKS Serverless 场景。

本文将探讨如何通过重塑 Prometheus ,使其高效监控阿里云 AKS Serverless 环境。

开始

基本设计

prometheus-operator 的控制链路其实非常简单,我们只需要知道以下基本原理就行:

• PodMonitor 和 ServiceMonitor 最终是用于生成 Prometheus 配置文件中的 srape_config;

• Prometheus 可以使用一个 HTTP Post 请求 /-/reload 来在运行时重新加载配置文件使新的 scrape_config 生效;

以上文为例,prometheus-operator 的控制链路是:

Prometheus

prometheus-operator 监听 Promtheus 资源,当有 Add Event 发生时,prometheus-operator 将以 StatefulSet 的形式部署 Prometheus 实例。每一个 Prometheus Pod 里有两个容器:

• prometheus 容器:主容器,使用 /etc/prometheus/config_out/prometheus.env.yaml 作为主要的配置文件:

...
    - --config.file=/etc/prometheus/config_out/prometheus.env.yaml 
...

• prometheus-config-reloader 容器:辅助容器,用于监听上游配置文件的变化并调用主容器的 reload 接口重新加载配置;

当我们观察这个 Pod 的 volumes 时候,有两个 volume 可以重点关注:

...
volumes:
  - name: config
    secret:
      defaultMode: 420
      secretName: prom-agent-prometheus-agent
  - name: config-out
    emptyDir:
      medium: Memory
...

• config-out:EmptyDir 类型的卷,主要是用于 prometheus 容器与 prometheus-config-reloader 容器的数据共享,同时挂载于两个容器的 /etc/prometheus/config_out/ 中;

• config:底层是一个 Secret,这个 config 将被挂载为 prometheus-config-reloader 容器中的 /etc/prometheus/config/prometheus.yaml.gz 。 prometheus-config-reloader 会监听这个文件的变化,一旦有变化,将基于新的文件内容生成新的配置文件 /etc/prometheus/config_out/prometheus.env.yaml。 prometheus-config-reloader 将调用主容器的 reload API 来重新加载配置文件;

PodMonitor / ServiceMonitor

• prometheus-operator 监听 PodMonitor 和 ServiceMonitor 的变化。一旦对应资源发生了变化,prometheus-operator 将基于新的资源生成新的配置文件并将其更新到对应的 Secrets 中。由于对应 Secrets 以文件形式挂载于 prometheus-config-reloader 容器中并被监听文件变化,所以当底层 Secrets 发生了变化,kubelet 将分钟级传播变化到对应容器内部,从而触发 prometheus-config-reloader 容器内的监听逻辑。

• Secrets 内部是一个 Base64 之后的 gz 格式的 prometheus.yaml,比如我们可以用下面这种方式解码出 prometheus.yaml:

kubectl get secrets prometheus-k8s -o jsonpath="{.data.prometheus\.yaml\.gz}" | base64 -d > prometheus.yaml.gz 

gzip -d prometheus.yaml.gz

我们这些了解完成之后,对于我们后面的改进可谓是……语文不好,有点丢人,想不出来成语了。

Prometheus CRD YAML 优化

我们先从 Prometheus 的持久化数据说起:

storage:
    volumeClaimTemplate:
      spec:
        storageClassName: alicloud-nas-subpath
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 15Gi

本地存储优化;

启用 WAL 压缩;

wal_compression: true

减少数据保留时间;

retention: 7d

还有我们资源的优化,如果你的集群应用很多,资源太少,就会导致 pod 异常,这边你自己调整:

resources:
    limits:
      cpu: "3"
      memory: 3Gi
    requests:
      cpu: 1000m
      memory: 1024Mi

完整文件;

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  labels:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 3.0.1
  name: k8s
  namespace: monitoring
spec:
  alerting:
    alertmanagers:
    - apiVersion: v2
      name: alertmanager-main
      namespace: monitoring
      port: web
  enableFeatures: []
  storage:
    volumeClaimTemplate:
      spec:
        storageClassName: alicloud-nas-subpath
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 15Gi
  externalLabels: {}
  image: quay.io/prometheus/prometheus:v3.0.1
  nodeSelector:
    kubernetes.io/os: linux
  podMetadata:
    labels:
      app.kubernetes.io/component: prometheus
      app.kubernetes.io/instance: k8s
      app.kubernetes.io/name: prometheus
      app.kubernetes.io/part-of: kube-prometheus
      app.kubernetes.io/version: 3.0.1
  podMonitorNamespaceSelector: {}
  #  matchExpressions:
  #    - key: kubernetes.io/metadata.name
  #      operator: In
  #      values:
  #        - monitoring
  #        - lobby
  podMonitorSelector: {}
  probeNamespaceSelector: {}
  probeSelector: {}
  replicas: 2
  resources:
    limits:
      cpu: "5"
      memory: 5Gi
    requests:
      cpu: 2000m
      memory: 2048Mi
  ruleNamespaceSelector: {}
  ruleSelector: {}
  scrapeConfigNamespaceSelector: {}
  scrapeConfigSelector: {}
  securityContext:
    fsGroup: 2000
    runAsNonRoot: true
    runAsUser: 1000
  serviceAccountName: prometheus-k8s
  serviceMonitorSelector: {}
  serviceMonitorNamespaceSelector: {}
  #  matchExpressions:
  #    - key: kubernetes.io/metadata.name
  #      operator: In
  #      values:
  #        - monitoring
  #        - lobby
  version: 3.0.1
  retention: 15d
  wal_compression: true

扩展

因为 Prometheus 这边优化的还挺多的,所以我们这一篇就先讲到这里,后面我们会更多的剖析相关内容。

• Prometheus Agent

• PrometheusRule

结语

我们 Prometheus 基础的优化和改进就结束了,相比较前几篇,这篇的东西不是很多。其实还有很多的东西都需要讲,我会把它们给分开。

责任编辑:武晓燕 来源: 云原生运维圈
相关推荐

2020-12-09 09:13:08

云计算IT技术

2023-10-09 07:31:25

2020-12-29 08:48:35

边缘计算云计算分布式云

2015-03-23 16:42:06

2021-07-01 11:29:45

KubernetesGrafana监控

2022-11-03 11:18:52

阿里云Serverless

2020-03-09 09:15:56

集群Prometheus开源

2020-05-18 12:04:17

PrometheusMySQL监控

2017-04-21 15:15:54

对象存储云价格

2023-09-15 16:47:55

2020-11-24 12:07:57

阿里云serverless容器

2024-04-08 08:00:00

云监控监控数据Prometheus

2025-01-06 00:38:12

2010-08-23 10:41:51

Google苹果Android

2020-07-27 08:23:15

HadoopPrometheusZabbix

2020-11-23 09:57:39

微软kubernetesAKS

2022-07-12 14:45:54

达摩院模型

2011-12-16 16:19:58

移动Web

2017-11-03 13:47:12

边缘计算欧洲
点赞
收藏

51CTO技术栈公众号