PrometheusOperator云原生监控:基于operator部署的资源内部链路分析

简介: PrometheusOperator云原生监控:基于operator部署的资源内部链路分析

本篇要分享的内容

这里假设你已经完成了kube-prometheus的部署。

假设有个需求:需要将node-exporter的指标暴露到k8s集群外部。如果要搞清楚这个问题,并实现这个需求,需要对通过operator部署的资源、内部链路有一定的了解才可以。所以,本篇要做这方面的一个分享。

关于在manifests下的清单

这里假设你已经对prometheus-operator和kube-prometheus有了一定的了解和使用经验。

在 kube-prometheus 仓库下的 manifests 中,已经有了用于安装和部署 Prometheus Operator、Alertmanager、Node Exporter、kube-state-metrics 和 Grafana 等组件的 Kubernetes 部署清单。这些清单可以用来在 Kubernetes 集群中部署这些组件,以便可以开始监控集群中的各种指标。不仅如此,它还包含了其它资源清单,如 Service、ConfigMap、Role、ClusterRole 等。这些清单文件一起提供了一个完整的 Prometheus 监控解决方案。

它为什么无法在外部拿到指标

  1. 看看部署方式

nodeExporter-daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
...
...

在k8s中, DaemonSet 是一种用于在 K8S 集群中部署守护进程的控制器,它确保每个节点上都运行一个 Pod 的副本,这使得在整个集群中运行守护进程变得非常容易。DaemonSet 的工作原理是,在每个节点上自动创建 Pod,并且这些 Pod 将一直运行,直到 DaemonSet 被删除或更新为止。 如果一个新节点加入集群,DaemonSet 会在该节点上自动创建 Pod。反之,如果节点被删除,它将自动删除对应的 Pod。DaemonSet 常用于运行一些系统级别的服务,例如监控代理、日志收集代理等,这些服务需要在每个节点上运行。所以,node-exporter 以 DaemonSet 控制器部署是非常合适的一个解决方案。

  1. 查看节点上自动创建的Pod
[root@k8s-a-master manifests-prometheus-operator]# kubectl get pod -n monitoring -o wide | grep node-exporter
node-exporter-2wgf7                    2/2     Running   0             3m14s   192.168.11.19    k8s-a-node09   <none>           <none>
node-exporter-65fb9                    2/2     Running   0             3m14s   192.168.11.20    k8s-a-node10   <none>           <none>
node-exporter-6p2ll                    2/2     Running   0             3m14s   192.168.11.16    k8s-a-node06   <none>           <none>
node-exporter-9jnml                    2/2     Running   0             3m14s   192.168.11.12    k8s-a-node02   <none>           <none>
node-exporter-cjsr6                    2/2     Running   0             3m14s   192.168.11.17    k8s-a-node07   <none>           <none>
node-exporter-d9lqf                    2/2     Running   0             3m14s   192.168.11.13    k8s-a-node03   <none>           <none>
node-exporter-gcrx4                    2/2     Running   0             3m14s   192.168.11.10    k8s-a-master   <none>           <none>

由于这里使用了DaemonSet控制器部署node-exporter,因此每个节点上都会运行一个该容器的实例。这意味着每个节点上都会有一个监听9100端口的node-exporter实例,而这些实例都会向Prometheus提供监控数据,使得Prometheus能够集中管理和分析这些数据。继续往下看,监听端口的部分。

  1. 我们来看一下端口部分
...
ports:
- containerPort: 9100
    hostPort: 9100
    name: https
...

“name”指定了一个名为“https”的端口,“containerPort”指定了Pod中容器的端口号,即9100。而“hostPort”指定了宿主机节点上的端口号,也是9100。这意味着在任何宿主机节点上,都可以通过访问9100端口来访问Pod中的容器。

  1. 在页面上查看targets,node-exporter的job已自动添加

在内部,走的是https协议。

  1. 外部不给浏览器直接访问

  1. 我们在集群节点内部用curl试试
[root@k8s-a-node06 ~]# curl https://192.168.11.16:9100/metrics
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
[root@k8s-a-node06 ~]# curl http://192.168.11.16:9100/metrics
Client sent an HTTP request to an HTTPS server.
[root@k8s-a-node06 ~]# 
[root@k8s-a-node06 ~]# curl http://127.0.0.1:9100/metrics
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 2.2247e-05
go_gc_duration_seconds{quantile="0.25"} 3.0408e-05
go_gc_duration_seconds{quantile="0.5"} 3.2917e-05
...
process_cpu_seconds_total 2.77
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1.048576e+06
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 10
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
...

发现在集群内部使用http协议访问127.0.0.1是可以拿到指标的,并且没有提示任何关于证书的问题。也就有可能说,只要让其走http就可以在外部拿到指标了?我们继续往下看。

nodeExporter yaml清单

先了解每个yaml的用途

[root@k8s-a-master manifests-prometheus-operator]# ls -l nodeExporter-*
-rw-r--r-- 1 root root   468 Apr 11 10:30 nodeExporter-clusterRoleBinding.yaml
-rw-r--r-- 1 root root   485 Apr 11 10:30 nodeExporter-clusterRole.yaml
-rw-r--r-- 1 root root  3640 Apr 27 21:46 nodeExporter-daemonset.yaml
-rw-r--r-- 1 root root   671 Apr 11 10:30 nodeExporter-networkPolicy.yaml
-rw-r--r-- 1 root root 15214 Apr 11 10:30 nodeExporter-prometheusRule.yaml
-rw-r--r-- 1 root root   306 Apr 11 10:30 nodeExporter-serviceAccount.yaml
-rw-r--r-- 1 root root   850 Apr 27 21:46 nodeExporter-serviceMonitor.yaml
-rw-r--r-- 1 root root   492 Apr 27 21:46 nodeExporter-service.yaml
  • nodeExporter-clusterRoleBinding.yaml:这个文件定义了一个 ClusterRoleBinding(集群角色绑定)对象,用于授权一个指定的服务帐户(在 nodeExporter-serviceAccount.yaml 文件中定义)访问与 Node Exporter 相关的资源。
  • nodeExporter-clusterRole.yaml:这个文件定义了一个 ClusterRole(集群角色)对象,用于授予一组权限,允许 Prometheus Server 访问 Node Exporter 的指标数据。
  • nodeExporter-daemonset.yaml:这个文件定义了一个 DaemonSet(守护进程集)对象,用于在 Kubernetes 集群中每个节点上运行一个 Node Exporter 的副本,以便从每个节点收集指标数据。
  • nodeExporter-networkPolicy.yaml:这个文件定义了一个 NetworkPolicy(网络策略)对象,用于限制从 Prometheus Server 到 Node Exporter 的网络流量,以确保只有来自 Prometheus Server 的流量能够到达 Node Exporter。
  • nodeExporter-prometheusRule.yaml:这个文件定义了一组 PrometheusRule(Prometheus 规则)对象,用于检查 Node Exporter 的指标数据并生成相应的警报。这些规则定义了要检查的指标及其阈值。
  • nodeExporter-serviceAccount.yaml:这个文件定义了一个 ServiceAccount(服务帐户)对象,用于授权 Node Exporter 访问 Kubernetes API。这个服务帐户将被绑定到上面提到的 ClusterRole。
  • nodeExporter-serviceMonitor.yaml:这个文件定义了一个 ServiceMonitor(服务监控)对象,用于告诉 Prometheus Server 如何收集来自 Node Exporter 的指标数据。这个对象定义了 Node Exporter 的服务名称和端口号等信息。
  • nodeExporter-service.yaml:这个文件定义了一个 Service(服务)对象,用于将 Node Exporter 的网络服务暴露到 Kubernetes 集群中。这个服务将被 nodeExporter-serviceMonitor.yaml 文件中定义的 ServiceMonitor 监控。

同样的,其它grafana、alertmanager、blackboxExporter、kubeStateMetrics等,它们的资源清单也是这样的。

https链路分析

之前已经知道了在内部走的是https协议,并且现在已经搞清楚了清单里的每个yaml的作用后,相信大脑里已经产生了下面的一个逻辑图:

接下来就一层一层的找到关于https的配置。

分析nodeExporter-daemonset

在nodeExporter-daemonset.yaml中下面两个相关的配置:

...
containers:
- args:
 - --web.listen-address=127.0.0.1:9100
...
ports:
- containerPort: 9100
    hostPort: 9100
    name: https
...
  • --web.listen-address=127.0.0.1:9100:这是一个参数,它告诉容器在127.0.0.1上监听9100端口的传入请求
  • containerPort: 9100:这是容器内的端口号。当容器启动时,它将在该端口上监听传入的流量。
  • hostPort: 9100:这是主机上的端口号。当容器启动时,它将绑定到主机的该端口上。这使得主机上的其他进程可以通过该端口访问容器中运行的应用程序。
  • name: https:这是端口的名称。它是一个可选的字段,但在许多情况下都是很有用的,因为它允许您在其他地方引用端口而不是硬编码端口号。

经测试:

  1. 端口的名称只是端口名称而已,可以改成任意字符串,比如我改成字符串“http”
name: http
  1. 将127.0.0.1改为0.0.0.0,修改后在k8s外部,通过浏览器走http协议能拿到指标:
--web.listen-address=0.0.0.0:9100

尴尬的事情发生了,页面中可以看到拿不到指标了:

原因是serviceMonitor还是用https去连接的,奇怪了,在上一步只是改了监听,改为0.0.0.0而已,难道https已经不生效啦?继续往下看。

分析nodeExporter-serviceMonitor和nodeExporter-service

先看nodeExporter-serviceMonitor.yaml,找到相关的字段

...
spec:
  endpoints:
  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    interval: 15s
    port: https # 看这个
    relabelings:
    - action: replace
      regex: (.*)
      replacement: $1
      sourceLabels:
      - __meta_kubernetes_pod_node_name
      targetLabel: instance
    scheme: https # 还有这个
    tlsConfig:
      insecureSkipVerify: true
  jobLabel: app.kubernetes.io/name
  selector:
    matchLabels:
...

上面的字段port和字段scheme,可以查看官方的API文档,就可以知道是什么意义

https://prometheus-operator.dev/docs/operator/api/#monitoring.coreos.com/v1.Endpoint

所以现在答案很明显了,scheme字段是真正决定它是https还是使用http。经过分析之前的逻辑图,这里的port是指向nodeExporter-service.yaml中的ports.name。

从https修改为http:

scheme: http

为了更有意义,把名称相关的也修改:

port: http

然后,修改nodeExporter-service.yaml中的ports里的name和targetPort

spec:
  clusterIP: None
  ports:
  - name: http
    port: 9100
    targetPort: http

下面我梳理了一个关系图:

看看最终效果:

已经成功让它走http了,并且外部也能直接拿到指标了。

最后

你会发现,当整条链路分析下来,会对Prometheus Operator这个东西理解的更加深刻。对于其它资源、或者是自己定义监控业务的资源,在套路上是万变不离其宗。

相关文章
|
5月前
|
运维 Dubbo Cloud Native
Dubbo 云原生重构出击:更快部署、更强控制台、更智能运维
Apache Dubbo 最新升级支持云原生,提供一键部署微服务集群与全新可视化控制台,提升全生命周期管理体验,助力企业高效构建云原生应用。
386 25
|
8月前
|
存储 缓存 分布式计算
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术,详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划,为您提供全面的技术解读。 作者:杨关锁,北京镜舟科技研发工程师
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
|
Kubernetes 监控 Cloud Native
云原生时代下的应用开发与部署实践
【10月更文挑战第4天】在云原生的浪潮中,开发者和运维人员面临着新的挑战和机遇。本文将通过实际案例,展示如何在云平台上高效地开发、部署和管理应用,同时确保系统的可扩展性和高可用性。我们将深入探讨容器化技术、微服务架构以及持续集成/持续部署(CI/CD)流程的实施策略,旨在为读者提供一套完整的云原生解决方案框架。
|
运维 Kubernetes Cloud Native
云原生时代下,如何高效构建与部署微服务
【9月更文挑战第8天】随着云计算技术的飞速发展,云原生已成为现代软件架构的重要趋势。本文将深入浅出地介绍云原生概念、微服务架构的优势以及如何在云平台上高效构建和部署微服务。我们将通过实际的代码示例,展示在Kubernetes集群上部署一个简单的微服务应用的过程,帮助读者理解云原生环境下的微服务开发和运维实践。
|
11月前
|
Cloud Native 安全 Serverless
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
敏捷开发 Kubernetes Cloud Native
阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理
在多云环境中,阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理。通过容器化、服务网格等技术,实现了应用的一致性与可移植性,简化了多云环境下的资源管理和服务治理,帮助企业应对复杂的云环境挑战,加速数字化转型。
326 5
|
存储 Prometheus 运维
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案。该集成结合了ARMS的基础设施监控能力和Prometheus的灵活配置及社区支持,实现了全面、精准的系统状态、性能和错误监控,提升了应用的稳定性和管理效率。通过统一的数据视图和高级查询功能,帮助企业有效应对云原生挑战,促进业务的持续发展。
337 3
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
870 30