当前位置:首页 > 物联网

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 ...1.2.3.

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

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

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

• 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.gz1.2.3.

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

Prometheus CRD YAML 优化

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

复制storage: volumeClaimTemplate: spec: storageClassName: alicloud-nas-subpath accessModes: - ReadWriteOnce resources: requests: storage: 15Gi1.2.3.4.5.6.7.8.9.

本地存储优化;

启用 WAL 压缩;

复制wal_compression: true1.

减少数据保留时间;

复制retention: 7d1.

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

复制resources: limits: cpu: "3" memory: 3Gi requests: cpu: 1000m memory: 1024Mi1.2.3.4.5.6.7.

完整文件;

复制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: true1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.

扩展

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

• Prometheus Agent

• PrometheusRule

结语

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

分享到:

滇ICP备2023000592号-28