Prometheus 监控

Prometheus最开始设计是一个面向云原生应用程序的开源的监控&报警工具,在对 Kubernetes服务发现协议分析之前,我们先来梳理下 Prometheus 如何接入云原生,实现对 Kubernetes 集群进行监控。

Kubernetes 云原生集群监控主要涉及到如下三类指标:node 物理节点指标、pod & container 容器资源指标和Kubernetes 云原生集群资源指标。针对这三类指标都有比较成熟的方案,见下图:

 

除了kube-state-metrics,node-exporter、cadvisor之外还有k8s集群的监控 kubernetes_sd_config ,至此四大组件已经完成

 

kubernetes_sd_config 是一种用于 Prometheus 目标发现的机制,是其中一种服务发现方式。它提供了与 Kubernetes 集成的能力,通过自动发现 Kubernetes 上运行的 Pod、Service、Node 等对象,并将其挂载到 Prometheus 的目标列表中,从而方便 Prometheus 进行采集和监控。

Prometheus 是一种流行的开源监控和告警工具,它可以对各种数据源进行采集和处理,并支持使用自定义的查询语言进行复杂指标的计算和分析。为了实现对 Kubernetes 集群的监控,需要使用 kubernetes_sd_config 去指导 Prometheus 进行目标发现。kubernetes_sd_config 可以通过配置 Kubernetes API 访问参数,从 Kubernetes 中获取对象元数据,然后结合特定的标签筛选规则过滤出符合要求的 targets,并将它们加入 Prometheus 的监控列表中。

通过 kubernetes_sd_config,可以轻松实现对 Kubernetes 集群各组件(如 API server、etcd、kubelet、kube-proxy 等)以及应用程序的监控,同时支持动态扩展和灵活配置。当有新的 Kubernetes 对象添加到集群中时,kubernetes_sd_config 会自动检测并将其加入到 Prometheus 的监控列表中,无需手动添加或修改配置文件,极大地减轻了管理员的工作负担。

 

这里举一个实际场景的例子,以帮助更好地理解 kubernetes_sd_config 和 kube-state-metrics 的应用。

假设有一个基于 Kubernetes 集群部署的微服务应用程序,由多个 Pod、Service、Deployment 和 ReplicaSet 等对象组成。为了对该应用程序进行监控和性能评估,可以使用 Prometheus、Grafana 和 Alertmanager 等工具来搭建完整的监控和告警系统。

在该环境中,kubernetes_sd_config 可以用于自动发现和监控 Kubernetes 的各个组件,如 API server、etcd、kubelet、kube-proxy 等。通过 kubernetes_sd_config 配置文件中定义的筛选规则,将符合条件的 targets 聚合到一个或多个 job 中,并为其绑定适当的 metrics 和 labels。

举例而言,我们可以使用以下配置文件(prometheus.yml)来定义一组监控目标:

Copy Code
scrape_configs:
- job_name: 'kubernetes-nodes'
  kubernetes_sd_configs:
  - api_server: null
    role: node
  relabel_configs:
  - source_labels: [__meta_kubernetes_node_label_kubelet_ready]
    action: keep
    regex: true
- job_name: 'kubernetes-pods'
  kubernetes_sd_configs:
  - api_server: null
    role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_label_app]
    action: replace
    target_label: app

这个配置文件定义了两个 jobs,一个是监控 Kubernetes 集群中的 Node,另一个是监控 Pod。其中,kubernetes_sd_configs 部分指定了从 Kubernetes API 中发现 Node 和 Pod 的方式,relabel_configs 部分则定义了 labels 和 metrics 的映射关系。

kube-state-metrics 则可以用于自动发现和监控所有对象的状态指标比如各个 Pod、Service、Deployment 和 ReplicaSet 的运行状态、健康状态、副本数、重启次数等。可以使用以下 manifest 文件来部署 kube-state-metrics:

Copy Code
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-state-metrics
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      containers:
      - name: kube-state-metrics
        image: quay.io/coreos/kube-state-metrics:v2.2.0
        ports:
        - containerPort: 8080
        args:
        - --metric-resolution=30s

这个部署文件定义了一个名为 kube-state-metrics 的 Deployment,并将它部署到 Kubernetes 集群的 kube-system 命名空间中。kube-state-metrics 容器的镜像是 quay.io/coreos/kube-state-metrics:v2.2.0,使用的端口号为 8080。args 部分则是指定了 kube-state-metrics 的参数,这里设置了 metric-resolution 参数为 30s,表示每 30 秒更新一次指标数据。

在完成 kubernetes_sd_config 和 kube-state-metrics 的配置和部署后,我们就可以使用 Prometheus 来采集和存储所有对象的监控数据,并通过 Grafana 实现可视化和展示。Alertmanager 则可以用于基于阈值或规则进行告警和通知,帮助管理员快速发现并解决异常情况。

 

ServiceMonitor 是一种 Kubernetes 自定义资源(Custom Resource Definitions,CRD),它是 Prometheus 进行目标发现和监控的关键组件之一。实际上,ServiceMonitor 可以理解为 kubernetes_sd_config 的升级版本,它不仅仅支持 Kubernetes 组件的自动发现和监控,还能够针对应用程序中的 Service 进行精细化的指标采集和监控。

在 Kubernetes 集群中,Service 是一种高级别抽象,用于暴露一个或多个 Pod 的网络服务。比如,一个 Web 应用可以由多个后端 Pod 通过 Service 暴露为一个唯一的入口地址;或者一个数据库应用可以通过 Service 提供对多个数据库 Pod 的访问。ServiceMonitor 可以根据定义的 label selector 自动识别匹配的 Service,并将其相关联的所有 targets 结合起来形成一个 job,从而实现对该 Service 的完整采集和监控。

ServiceMonitor 与 kubernetes_sd_config 不同的是,它支持更灵活的筛选和配置功能。通过定义多个 selector,可以精确指定需要监控的 Service、namespace、labels 等属性。同时,ServiceMonitor 还支持自定义 scrape_interval 和 scrape_timeout 等采集参数,以及 metric_relabel_configs 和 honor_labels 等标签管理功能,方便用户根据实际需求进行指标过滤、格式化和聚合。

在 Prometheus 进行部署后,通过定义一个 ServiceMonitor 对象并将其与要监控的 Service 关联起来,就可以快速、自动地实现对 Kubernetes 集群中各个 Service 的监控和告警。同时,ServiceMonitor 也为 Prometheus 提供了支持多租户和多环境监控的能力,方便用户更好地管理大规模的分布式应用程序。

 

上节我们整理了node性能指标如何监控,这一节我们就来分析下cAdvisor性能指标监控。

cAdvisor(Container Advisor) 是 Google 开源的一个容器监控工具,可用于对容器资源的使用情况和性能进行监控。它以守护进程方式运行,用于收集、聚合、处理和导出正在运行容器的有关信息。具体来说,该组件对每个容器都会记录其资源隔离参数、历史资源使用情况、完整历史资源使用情况的直方图和网络统计信息。cAdvisor 本身就对 Docker 容器支持,并且还对其它类型的容器尽可能的提供支持,力求兼容与适配所有类型的容器。

由以上介绍我们可以知道,cAdvisor 是用于监控容器引擎的,由于其监控的实用性,Kubernetes 已经默认将其与 Kubelet 融合,所以我们无需再单独部署 cAdvisor 组件来暴露节点中容器运行的信息,直接使用 Kubelet 组件提供的指标采集地址即可。

环境信息

本人搭建的 Kubernetes 集群环境如下图,后续都是基于该集群演示:

图片

Prometheus接入

图片

1、访问Prometheus API方式检查:

kubectl get --raw /api/v1/nodes/${1}/proxy/metrics/cadvisor

2、创建Prometheus抓取任务job

  - job_name: kubernetes-nodes-cadvisor
    metrics_path: /metrics
    scheme: https
    kubernetes_sd_configs:
    - role: node
      api_server: https://apiserver.simon:6443
      bearer_token_file: /tools/token.k8s
      tls_config:
        insecure_skip_verify: true
    bearer_token_file: /tools/token.k8s
    tls_config:
      insecure_skip_verify: true
    relabel_configs:
    # 将标签(.*)作为新标签名,原有值不变
    - action: labelmap
      regex: __meta_kubernetes_node_label_(.*)
    # 修改NodeIP:10250为APIServerIP:6443
    - action: replace
      regex: (.*)
      source_labels: ["__address__"]
      target_label: __address__
      replacement: 192.168.52.151:6443 #apiserver
    - action: replace
      source_labels: [__meta_kubernetes_node_name]
      target_label: __metrics_path__
      regex: (.*)
      replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor  

3、检查是否接入成功:

图片

 

4、cAdvisor组件抓取指标列表:

container_fs_write_seconds_total{}
container_memory_swap{}
container_spec_cpu_shares{}
container_ulimits_soft{}
container_fs_io_current{}
container_fs_reads_bytes_total{}
container_fs_writes_merged_total{}
container_cpu_user_seconds_total{}
container_memory_failcnt{}
container_memory_failures_total{}
container_cpu_cfs_throttled_seconds_total{}
container_cpu_usage_seconds_total{}
container_fs_io_time_seconds_total{}
container_network_receive_packets_total{}
container_spec_memory_reservation_limit_bytes{}
cadvisor_version_info{}
container_cpu_cfs_periods_total{}
container_fs_limit_bytes{}
container_fs_sector_writes_total{}
container_memory_usage_bytes{}
container_memory_working_set_bytes{}
container_network_receive_errors_total{}
container_network_transmit_packets_dropped_total{}
container_spec_cpu_period{}
container_file_descriptors{}
container_fs_inodes_total{}
container_fs_usage_bytes{}
container_network_transmit_packets_total{}
container_cpu_load_average_10s{}
container_fs_writes_bytes_total{}
container_memory_cache{}
container_spec_cpu_quota{}
container_cpu_cfs_throttled_periods_total{}
container_network_receive_bytes_total{}
container_network_transmit_errors_total{}
container_sockets{}
container_spec_memory_swap_limit_bytes{}
container_threads{}
container_threads_max{}
container_cpu_system_seconds_total{}
container_fs_read_seconds_total{}
container_fs_reads_merged_total{}
container_fs_sector_reads_total{}
container_processes{}
container_spec_memory_limit_bytes{}
container_fs_inodes_free{}
container_network_receive_packets_dropped_total{}
container_network_transmit_bytes_total{}
container_fs_io_time_weighted_seconds_total{}
container_fs_reads_total{}
container_fs_writes_total{}
container_memory_max_usage_bytes{}
container_memory_rss{}
container_scrape_error{}
container_start_time_seconds{}
container_last_seen{}
container_memory_mapped_file{}
container_tasks_state{}

dashboard配置

导入3125 或 13025 dashboardcAdvisor性能监控指标就展示到模板上,如下图:

图片

 

 

 
 
posted @ 2023-06-13 15:25  滴滴滴  阅读(202)  评论(0编辑  收藏  举报