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

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
简介: 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这个东西理解的更加深刻。对于其它资源、或者是自己定义监控业务的资源,在套路上是万变不离其宗。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
相关文章
|
3月前
|
Kubernetes 监控 Cloud Native
云原生时代下的应用开发与部署实践
【10月更文挑战第4天】在云原生的浪潮中,开发者和运维人员面临着新的挑战和机遇。本文将通过实际案例,展示如何在云平台上高效地开发、部署和管理应用,同时确保系统的可扩展性和高可用性。我们将深入探讨容器化技术、微服务架构以及持续集成/持续部署(CI/CD)流程的实施策略,旨在为读者提供一套完整的云原生解决方案框架。
|
4月前
|
运维 Kubernetes Cloud Native
云原生时代下,如何高效构建与部署微服务
【9月更文挑战第8天】随着云计算技术的飞速发展,云原生已成为现代软件架构的重要趋势。本文将深入浅出地介绍云原生概念、微服务架构的优势以及如何在云平台上高效构建和部署微服务。我们将通过实际的代码示例,展示在Kubernetes集群上部署一个简单的微服务应用的过程,帮助读者理解云原生环境下的微服务开发和运维实践。
|
23天前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
敏捷开发 Kubernetes Cloud Native
阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理
在多云环境中,阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理。通过容器化、服务网格等技术,实现了应用的一致性与可移植性,简化了多云环境下的资源管理和服务治理,帮助企业应对复杂的云环境挑战,加速数字化转型。
52 5
|
2月前
|
存储 Prometheus 运维
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案。该集成结合了ARMS的基础设施监控能力和Prometheus的灵活配置及社区支持,实现了全面、精准的系统状态、性能和错误监控,提升了应用的稳定性和管理效率。通过统一的数据视图和高级查询功能,帮助企业有效应对云原生挑战,促进业务的持续发展。
46 3
|
2月前
|
监控 Cloud Native 持续交付
云原生技术深度解析:重塑现代应用开发与部署范式####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在现代软件开发中的重要性。通过剖析容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,本文旨在揭示云原生技术如何促进应用的敏捷性、可扩展性和高可用性,进而推动企业数字化转型进程。不同于传统摘要仅概述内容要点,本部分将融入具体案例分析,直观展示云原生技术在实际应用中的显著成效与挑战应对策略,为读者提供更加丰富、立体的理解视角。 ####
|
3月前
|
Kubernetes Cloud Native 持续交付
云原生技术:重塑现代应用开发与部署模式####
本文深入探讨了云原生技术的核心概念、发展历程及其在现代软件开发和部署中的关键作用。通过分析云原生架构的特点,如容器化、微服务、持续集成与持续部署(CI/CD),以及它如何促进应用的可伸缩性、灵活性和效率,本文旨在为读者提供一个关于云原生技术全面而深入的理解。此外,还将探讨实施云原生策略时面临的挑战及应对策略,帮助组织更好地把握数字化转型的机遇。 ####
|
3月前
|
Cloud Native 持续交付 云计算
云端新纪元:探索云原生技术的奥秘在当今数字化时代,云计算已成为推动企业创新和增长的关键动力。随着云平台的不断成熟,云原生技术应运而生,以其独特的优势引领着一场新的技术革命。本文将深入探讨云原生的核心概念、主要特点以及它如何改变现代软件开发和部署的方式,为您揭开云原生这一神秘面纱。
云原生是一种构建和运行应用程序的方法,充分利用了云平台的弹性、分布式本质以及声明式基础设施。本文将解析云原生的十二要素,微服务架构的优势,以及容器化、持续集成与持续部署(CI/CD)等核心技术的实践应用。通过深入浅出的方式,让读者理解云原生不仅是一种技术,更是一种文化和方法论,它正在重塑软件开发流程,提高资源利用率和应用系统的可扩展性与容错性。
|
2月前
|
监控 Cloud Native 微服务
云端漫步:探索云原生应用的构建与部署
【10月更文挑战第32天】在数字时代的浪潮中,云原生技术如同一艘航船,承载着企业的梦想驶向未知的海洋。本文将带你领略云原生应用的魅力,从基础概念到实战操作,我们将一步步揭开云原生的神秘面纱,体验它如何简化开发、加速部署,并提升系统的可扩展性与可靠性。让我们一起启航,探索云原生的世界!