Lazy loaded image
Prometheus和Grafana监控平台
K8S集群层面监控
字数 4671阅读时长 12 分钟
2024-11-21
2024-11-21
type
status
date
slug
summary
tags
category
icon
password
 

Kubernetes 集群监控

服务发现简介

service discovery(服务发现)通常不属于 Prometheus 本身的层次结构,因为 Prometheus 主要是一个监控系统和时间序列数据库,而不是一个服务发现工具。然而,Prometheus 可以与各种服务发现机制集成,以便自动发现和监控需要监控的目标。
在 Prometheus 的架构中,服务发现通常发生在配置管理的过程中,这是 Prometheus 监控流程的一部分。具体来说,Prometheus 使用服务发
现来动态地获取和更新监控目标的列表。这些目标可以是 Kubernetes Pods、Docker 容器、云服务实例等。
Prometheus 支持多种服务发现机制,包括但不限于:
  • 文件服务发现:通过读取文件中的目标列表。
  • Kubernetes 服务发现:自动发现 Kubernetes 集群中的服务和 Pods。
  • Consul 服务发现:与 Consul 集成,发现 Consul 中的服务。
  • EC2 服务发现:在 AWS EC2 环境中自动发现实例。
  • node:从集群中发现节点并将其添加为监控目标
  • service:从集群中发现Service并将其添加为监控目标,主要用于监控Service的可用性
  • pod:从集群中发现pod并将其添加为监控目标,主要用于监控的pod中应用程序
  • endpoint和endponintslice:从service的Endpoints 对象中发现Pod并将其添加为监控目标
  • ingress: 从集群发现Ingress 并将其添加为监控目标,主要用于监控Ingress 的可用性和Http处理性能
在 prometheus-cm.yaml 下 scrape_configs一次添加如下采集数据

Kubernetes 关注指标

监控目标
关注指标
Node
CPU利用率 内存利用率 硬盘利用率 网络流量
Pod
CPU利用率 内存利用率 网络流量
资源对象
工作负载类控制器资源对象的副本状态 Pod运行和非运行数量 其他资源状态
Service和Ingress
可用性 HTTP请求时间延迟成功率等
K8s组件
运行状态 工作性能
Pod中的应用程序
自主开发的指标接口

监控Node

为了监控主机的资源利用率 ,通常会在目标主机上部署Node Exporter,通过静态配置方式添加监控目标
监控集群中的节点也是同样道理,而且使用Daemonset管理NodeExporter会更加方便
收集Node Exporter指标流程如下图
notion image

node-exporter部署

Node Exporter 是 Prometheus 官方提供的一个节点资源采集组件,可以用于收集服务器节点的数据,如 CPU频率信息、磁盘IO统计、剩余可用内存等等
由于是针对所有K8S-node节点,所以我们这边使用DaemonSet这种方式
vim node-exporter.yaml
node_exporter.yaml文件说明:
  • hostPID:指定是否允许Node Exporter进程绑定到主机的PID命名空间。若值为true,则可以访问宿主机中的PID信息
  • hostIPC:指定是否允许Node Exporter进程绑定到主机的IPC命名空间。若值为true,则可以访问宿主机中的IPC信息
  • hostNetwork:指定是否允许Node Exporter进程绑定到主机的网络命名空间。若值为true,则可以访问宿主机中的网络信息
验证

配置服务发现

自动发现pod
在 WebUI可用看到集群所有pod均被添加为监控目标
notion image
其中大部分Pod由于没有配置指标端口 状态为DOWN 而Node Exporter 的相关Pod已被监控
为了减少不必要的监控目标,可以利用标签重写功能,根据条件选择要保留的监控目标,配置如下
保留这个__meta_kubernetes_pod_annotation_prometheus_io_scrape 元标签 且值为true的pod才会被抓取监控
给pod加一下注解
修改node-exporter.yaml
可以看出 只监控到 符合条件pod
notion image

Grafana导入仪表盘

Grafana 导入 输入仪表盘ID 12633 并将名称设置为Kubernetes节点监控 导入完成后将仪表盘界面 如图所示
notion image
notion image

监控pod

为了监控Docker主机上容器的资源情况,通常会在目标主机上部署cAdvisor Exporter,并通过静态配置方式添加监控目标
cAdvisor已经被内置在kubelet组件中,并通过kubelet API暴露cAdvisor才采集数据
用户无须再而外部署cAdvisor,只需自动发现节点的kubelet并将其添加监控目标即可
收集cAdvisor指标流程如图所示
notion image
配置服务发现
上面job 并使用Kubernetes服务发现
通过标签重写功能,默认的指标接口路径被替换成/metrics/cadvisor 这个cAdvisor通过kubelet API暴露指标接口
设置热加载
WebUI 查看监控接口
notion image

监控Kubernetes组件

各组件指标接口信息
组件名称
端口
协议
指标
etcd
2381
http
请求数量,延迟,存储空间等
kube-apiserver
6443
https
请求数量,请求延迟
kube-controller-manager
10257
https
各个控制器的同步次数,工作队列等
scheduler
10259
https
调度决策数量,延迟等
kubelet
10250
https
启动pod/容器总数,运行pod/容器数量等
kube-proxy
10249
http
同步代理规则的总次数,同步代理规则延迟等
coredns
9153
http
请求数量,转发DNS请求数量
ingress控制器
10254
http
客户端请求总数,连接数,CPU/内存使用等

etcd组件监控

用 kubeadm部署k8集群 etcd默认以静态pod部署的,可以通过http://127.0.0.1:2381/metrcis 来查看etcd指标数据
接口默认服务监控127.0.0.1 为了实现外部可以访问抓取数据 可以把--listen-metrics-url参数的值改为"http://0.0.0.0:2381"
在prometheus 配置文件中添加服务发现
vim prometheus-cm.yaml
上述添加 kubernetes-etcd job 然后使用endpoint类型自动发现Endpoint 对象关联pod并添加为监控目标
[!NOTE]
使用endpoint类型需要存在service 所以 要创建 一个 ectd svc
vim etcd-svc.yaml
热加载
Web UI查看etcd pod 监控目标
notion image

kube-apiserver组件监控

kube-apiserver组件与etcd部署方式一样的 但它已经创建Service 因此直接使用endpoint类型服务发现即可
notion image
指标
类型
说明
apiserver_request_total
Counter
所有请求的总数
apiserver_request_duration_seconds_sun
Histogram
请求的总处理时间
apiserver_request_duration_seconds_bucket
Histogram
请求处理时间的分布情况
apiserver_request_duration_seconds_count
Histogram
请求的次数

kubernetes-controller-manager组件监控

同样是pod静态部署 为了外部抓取数据 需要放行端口 需要修改监听地址
添加job
添加 service
notion image
指标
类型
说明
workqueue_adds_total
Counter
工作队列处理Adds事件的数量
workqueue_depth
Gauge
工作队列当前队列深度
workqueue_queue_duration_seconds_sum
Histogram
工作队列所有任务的总执行时间
workqueue_queue_duration_seconds_bucket
Histogram
工作队列任务执行时间的分布情况
workqueue_queue_duration_seconds_count
Histogram
工作队列任务的次数

kubernetes-scheduler组件监控

和kubernetes-controller-manager做法是一样的
添加job
添加 service
notion image
notion image
指标
类型
说明
scheduler_pending_pods
Gauge
Pending状态的Pod数量
scheduler_scheduler_cache_size
Gauge
调度器缓存Pod AssumedPod和Node的数量
scheduler_pod_scheduling_duration_seconds_sum
Histogram
Pod调度的总处理时间
scheduler_pod_scheduling_duration_seconds_bucket
Histogram
Pod调度时间分布情况
scheduler_pod_scheduling_duration_seconds_count
Histogram
Pod调度的次数

kubernetes-kube-proxy 组件监控

和kubernetes-controller-manager做法是一样的
放行端口
添加job
添加service
notion image
指标
类型
说明
kubeproxy_sync_proxy_rules_iptables_total
Gauge
管理Iptables规则
process_cpu_seconds_total
Counter
kube-proxy进程使用CPU时间总量
process_virtual_memory_bytes
Gauge
kube-proxy进程使用的虚拟内存量单位为字节
process_virtual_memory_max_bytes
Gauge
kube-proxy 进程可以使用的最大虚拟内存单位为字节

coredns组件监控

添加job
notion image
指标
类型
说明
coredns_dns_requests_total
Counter
DNS请求的总数
coredns_dns_request_duration_seconds_sum
Histogram
DNS请求的总处理时间
coredns_dns_request_duration_seconds_bucket
Histogram
DNS请求处理时间到分布情况
coredns_dns_request_duration_seconds_count
Histogram
DNS请求的次数
coredns_forward_requests_total
Counter
转发DNS请求的总数
coredns_forward_request_duration_seconds_sum
Histogram
转发DNS请求的总处理时间
coredns_forward_request_duration_seconds_bucket
Histogram
转发DNS请求处理时间的分布情况
coredns_forward_request_duration_seconds_count
Histogram
转发DNS请求的次数

kubelet组件监控

添加job
notion image
指标
类型
说明
kubelet_running_pods
Gauge
运行Pod的数量
kubelet_running_containers
Gauge
运行容器的数量
process_cpu_seconds_total
Counter
Kubelet进程使用的CPU时间总量
process_virtual_memory_bytes
Gauge
Kubelet进程使用的虚拟内存量,单位为字节
process_virtual_memory_max_bytes
Gauge
kubelet进程可以使用的最大虚拟内存,单位为字节

ingress-controller组件监控

vim prometheus-cm.yaml
在 ingress svc 添加 metrics 端口规则
notion image

监控集群中应用程序

监控Service和Ingress对象

监控资源对象

KubeStateMetrics简介

kube-state-metrics(简称KSM) 是一个 Kubernetes 组件,它通过查询 Kubernetes 的 API 服务器,收集关于 Kubernetes 中各种资源(如节点、pod、服务等)的状态信息,并将这些信息转换成 Prometheus 可以使用的指标
项目地址
以下是 版本支持 k8s版本
kube-state-metrics
Kubernetes Version
v2.3.0
v1.22
v2.4.2
v1.23
v2.5.0
v1.24
v2.7.0
v1.25
v2.8.2
v1.26
v2.10.1
v1.27
v2.11.0
v1.28
v2.12.0
v1.29
v2.13.0
v1.30
kube-state-metrics 主要功能:
  • 节点状态信息,如节点 CPU 和内存的使用情况、节点状态、节点标签等
  • Pod 的状态信息,如 Pod 状态、容器状态、容器镜像信息、Pod 的标签和注释等
  • Deployment、Daemonset、Statefulset 和 ReplicaSet 等控制器的状态信息,如副本数、副本状态、创建时间等
  • Service 的状态信息,如服务类型、服务 IP 和端口等
  • 存储卷的状态信息,如存储卷类型、存储卷容量等
  • Kubernetes 的 API 服务器状态信息,如 API 服务器的状态、请求次数、响应时间等
通过 kube-state-metrics 可以方便的对 Kubernetes 集群进行监控,发现问题,以及提前预警

KubeStateMetrics部署

包含ServiceAccountClusterRoleClusterRoleBindingDeploymentConfigMapService 六类YAML文件

配置rabc

vim KubeStateMetrics-rabc.yaml

配置cm

vim KubeStateMetrics-cm.yaml

配置deploy和svc

vim KubeStateMetrics.yaml
验证
 
 

cAdvisor

cAdvisor 主要功能:
  • 对容器资源的使用情况和性能进行监控。它以守护进程方式运行,用于收集、聚合、处理和导出正在运行容器的有关信息
  • cAdvisor 本身就对 Docker 容器支持,并且还对其它类型的容器尽可能的提供支持,力求兼容与适配所有类型的容器
  • Kubernetes 已经默认将其与 Kubelet 融合,所以我们无需再单独部署 cAdvisor 组件来暴露节点中容器运行的信息

Prometheus 添加 cAdvisor 配置

由于 Kubelet 中已经默认集成 cAdvisor 组件,所以无需部署该组件。需要注意的是,他的指标采集地址为 /metrics/cadvisor,需要配置https访问,可以设置 insecure_skip_verify: true 跳过证书验证
热加载prometheus,使configmap配置文件生效
notion image

k8s-node 监控

在 prometheus-config.yaml 中新增采集 job:k8s-nodes
node_exporter也是每个node节点都运行,因此role使用node即可,默认address端口为10250,替换为9100即可
热加载prometheus,使configmap配置文件生效:

总结

  • kube-state-metrics:将 Kubernetes API 中的各种对象状态信息转化为 Prometheus 可以使用的监控指标数据。
  • cAdvisor:用于监视容器资源使用和性能的工具,它可以收集 CPU、内存、磁盘、网络和文件系统等方面的指标数据。
  • node-exporter:用于监控主机指标数据的收集器,它可以收集 CPU 负载、内存使用情况、磁盘空间、网络流量等各种指标数据
这三种工具可以协同工作,为用户提供一个全面的 Kubernetes 监控方案,帮助用户更好地了解其 Kubernetes 集群和容器化应用程序的运行情况
上一篇
flask框架操作openstack接口
下一篇
openstack部署skyline