Prometheus监控实战系列十九:监控Kubernetes集群(上)
Kuberentes
是一款开源的容器编排产品,由Google开发后发布到社区,并在2015年将该项目捐献给了云原生基金会(Cloud Native Computing Foundation)。从2014年第一个版本发布以来,Kubernetes便迅速获得开源社区的追捧,包括RedHat、VMware在内的很多知名企业都加入到开发和推广的阵营。目前,Kubernets已经成为发展最快、市场占有率最高的容器编排产品。
Promehteus是一款近年来非常火热的容器监控系统,它使用go语言开发,设计思路来源于Google的Borgmom(一个监控容器平台的系统)。2016年,云原生基金会将其纳入麾下,成为该基金会继Kubernetes后,第二大开源项目。因此,Prometheus天然具有对容器的适配性,可非常方便的满足容器的监控需求,目前已成为监控Kubernetes的主要工具。
本文将介绍如何通过Prometheus监控Kubernetes集群状态的方案,限于篇幅原因会分为上、下两个篇章进行。(对于Kubernetes的技术细节本文不做讲解,不熟悉的朋友可先自行查阅相关资料。)
1、安装Prometheus
Prometheus支持基于Kubernetes的服务发现,通过<kubernetes_sd_config> 配置允许从 Kubernetes 的API 检索抓取目标,并始终与集群状态保持同步。
我们需要在被监控集群上安装Prometheus,本文将使用YAML文件的方式进行部署。
1.1 创建命名空间
创建namespace.yml文件,内容如下
apiVersion: v1
kind: Namespace
metadata:name: monitoring
执行该yml文件
kubectl apply -f namespace.yaml
查看命名空间,已成功创建
1.2 创建RBAC规则
RBAC为Kubernetes的授权认证方式,包括 ServiceAccount、ClusterRole、ClusterRoleBinding三类YAML文件。该规则用于授权Prometheus获取资源信息。
创建prometheus-rbac.yml文件,内容如下:
apiVersion: v1
kind: ServiceAccount
metadata:name: prometheusnamespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: prometheus
rules:
- apiGroups: [""]resources: ["nodes", "nodes/proxy", "services", "endpoints", "pods"]verbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["configmaps"]verbs: ["get"]
- nonResourceURLs: ["/metrics"]verbs: ["get"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: prometheus
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: prometheus
subjects:
- kind: ServiceAccountname: prometheusnamespace: monitoring
执行该yml文件
[root@master prometheus]# kubectl apply -f prometheus-rbac.yaml
serviceaccount/prometheus unchanged
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
查看RBAC是否创建成功
[root@master prometheus]# kubectl get sa -n monitoring
NAME SECRETS AGE
default 1 10m
prometheus 1 89s
[root@master prometheus]# kubectl get ClusterRole prometheus
NAME CREATED AT
prometheus 2023-03-23T03:01:36Z
[root@master prometheus]# kubectl get ClusterRoleBinding prometheus -n monitoring
NAME ROLE AGE
prometheus ClusterRole/prometheus 103s
1.3 创建Configmap
我们使用Configmap来管理Prometheus的配置文件,此处先使用默认的配置,用于启动Prometheus,后面再根据需要进行修改。
创建prometheus-config.yml文件,内容如下
apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: monitoring
data:prometheus.yml: |global:scrape_interval: 15s evaluation_interval: 15sscrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']
执行该yml文件
[root@master prometheus]# kubectl apply -f prometheus-config.yaml
configmap/prometheus-config created
查看configmap资源是否生成
kubectl get configmap -n monitoring
1.4 部署Deployment
在完成Configmap资源创建后,我们可以开始部署Prometheus的实例了。此处,我们使用Deployment来部署Prometheus,并通过Volume挂载的方式,将Prometheus的配置文件挂载到Pod内。另外,在正式环境中建议通过PVC的方式,将收集的监控数据挂载到外部存储,避免因Pod被删除而造成数据丢失。
创建prometheus-deployment.yml文件,内容如下
apiVersion: apps/v1
kind: Deployment
metadata:name: prometheusnamespace: monitoringlabels:app: prometheus
spec:strategy:type: Recreatereplicas: 1selector:matchLabels:app: prometheustemplate:metadata:labels:app: prometheusspec:containers:- image: prom/prometheus:v2.2.1name: prometheuscommand:- prometheusargs:- --config.file=/etc/prometheus/config/prometheus.yml- --storage.tsdb.path=/data- --web.enable-lifecyclesecurityContext:runAsUser: 0ports:- containerPort: 9090protocol: TCPvolumeMounts:- mountPath: "/etc/prometheus/config/"name: config- name: prometheus-datamountPath: /data/serviceAccountName: prometheusvolumes:- name: configconfigMap:name: prometheus-config- name: prometheus-datahostPath:path: /datatype: Directory
执行yaml文件
[root@master prometheus]# kubectl apply -f prometheus-deployment.yaml
deployment.apps/prometheus created
查看Prometheus实例状态
[root@master prometheus]# kubectl get deploy -n monitoring
NAME READY UP-TO-DATE AVAILABLE AGE
prometheus 1/1 1 1 46s
[root@master prometheus]# kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-65df6bbcc7-mmv5f 1/1 Running 0 54s
1.5 创建Service
创建Prometheus的Service,用于集群内外部访问。默认情况下,Service只能在集群内访问,如果希望开放给集群外部,可选方案有Ingress、NodePort、ExternalIPs、LoadBalancer等几种。此处使用NodePort方式。
创建prometheus-service.yml,内容如下:
apiVersion: v1
kind: Service
metadata:labels:app: prometheusname: prometheusnamespace: monitoring
spec:ports:- name: "web"port: 9090protocol: TCPtargetPort: 9090selector:app: prometheustype: NodePort
执行该yml文件
[root@master prometheus]# kubectl apply -f prometheus-service.yaml
service/prometheus created
查看Service状态,Service已创建完成,其中Cluster-ip用于集群内部访问,External-ip则是给到集群外部访问
[root@master prometheus]# kubectl get service -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus NodePort 10.111.199.135 <none> 9090:30322/TCP 50s
1.6 访问Prometheus
浏览器打开http://$ip:9090,可看到Prometheus已部署完成。
查看Targets目标,当前除了监控Prometheus自身实例,还未有其他Kubernetes资源。
2、基于Kubernetes的服务发现
在监控Kubernetes集群的过程中,我们需要使用到针对Kubernetes的服务发现功能,这个在Prometheus的原生功能中已经支持。
以下几种类型的资源角色可被配置为服务发现的目标,对于集群的监控即是通过有效利用这些角色及标签来实现。
2.1 node角色
该node 角色发现用于检索集群中的节点目标信息,其地址默认为节点kubelet的HTTP访问端口。目标地址的默认顺序为NodeInternalIP,NodeExternalIP,NodeLegacyHostIP和NodeHostName中的第一个现有地址。
该角色可获取到的元数据标签如下:
- __meta_kubernetes_node_name:节点对象的名称。
- __meta_kubernetes_node_label:节点对象所定义的各个label
- __meta_kubernetes_node_labelpresent:节点对象所定义的各个label,value固定为true。
- __meta_kubernetes_node_annotation:来自节点对象的每个注释
- __meta_kubernetes_node_annotationpresent:来自节点对象的每个注释,value固定为true。
- __meta_kubernetes_node_address<address_type>:每个节点地址类型的第一个地址(如果存在)
此外,节点的instance标签将被设置为从API服务检索到的节点名称。
2.2 service角色
该角色发现用于检索集群中每个service目标,并且将该服务开放的端口做为目标端口。该地址将设置为服务的Kubernetes DNS名称以及相应的服务端口。
该角色可获取到的元数据标签如下:
- __meta_kubernetes_namespace: 服务对象的名称空间。
- __meta_kubernetes_service_annotation:服务对象的每个注释。
- __meta_kubernetes_service_annotationpresent: 服务对象的每个注释,value固定为true。
- __meta_kubernetes_service_cluster_ip: 服务对象的集群IP。
- __meta_kubernetes_service_external_name: 服务的DNS名称。
- __meta_kubernetes_service_label: 服务对象中的每个label。
- __meta_kubernetes_service_labelpresent: 服务对象中的每个label,value固定为true。
- __meta_kubernetes_service_name: 服务对象的名称。
- __meta_kubernetes_service_port_name: 目标服务端口的名称。
- __meta_kubernetes_service_port_protocol: 目标服务端口的协议。
- __meta_kubernetes_service_type: 服务的类型。
2.3 Pod角色
该pod角色发现用于发现所有Pod并将其容器做为目标访问,对于容器的每个声明的端口,将生成一个目标。如果容器没有指定的端口,则会为每个容器创建无端口目标。
该角色可获取到的元数据标签如下:
-
__meta_kubernetes_namespace: pod对象的命名空间。
-
__meta_kubernetes_pod_name: pod对象的名称。
-
__meta_kubernetes_pod_ip: pod对象的pod IP。
-
_meta_kubernetes_pod_label: 来自pod对象的每个标签。
-
_meta_kubernetes_pod_labelpresent: 来自pod对象的每个标签,value固定为true。
-
_meta_kubernetes_pod_annotation: 来自pod对象的每个注释。
-
_meta_kubernetes_pod_annotationpresent: 来自pod对象的每个注释,value固定为true。
-
__meta_kubernetes_pod_container_init: 如果容器是初始化容器,则value为true。
-
__meta_kubernetes_pod_container_name: 目标地址指向的容器的名称。
-
__meta_kubernetes_pod_container_port_name: 容器端口的名称。
-
__meta_kubernetes_pod_container_port_number: 容器端口号。
-
__meta_kubernetes_pod_container_port_protocol: 容器端口的协议。
-
__meta_kubernetes_pod_ready: 代表pod状态是否就绪,value为true或false。
-
__meta_kubernetes_pod_phase: Pod的生命周期,Value值为Pending,Running,Succeeded,Failed或Unknown 。
-
__meta_kubernetes_pod_node_name: Pod所在节点的名称。
-
__meta_kubernetes_pod_host_ip: pod所在节点的IP。
-
__meta_kubernetes_pod_uid: pod对象的UID。
-
__meta_kubernetes_pod_controller_kind: pod控制器的对象种类。
-
__meta_kubernetes_pod_controller_name: pod控制器的名称。
2.4 endpoints角色
该endpoints角色发现用于检索服务的endpoints目标,且每个endpoints的port地址会生成一个目标。如果端点由Pod支持,则该Pod的所有其他容器端口(包括未绑定到endpoints的端口)也将作为目标。
该角色可获取到的元数据标签如下:
-
__meta_kubernetes_namespace: endpoints对象的命名空间
-
__meta_kubernetes_endpoints_name: endpoints对象的名称
对于直接从端点列表中发现的所有目标(不包括由底层pod推断出来的目标),将附加以下标签:
-
__meta_kubernetes_endpoint_hostname: 端点的主机名
-
__meta_kubernetes_endpoint_node_name: 托管endpoints的节点名称
-
__meta_kubernetes_endpoint_ready: 代表endpoint 状态是否就绪,value为true或false。
-
__meta_kubernetes_endpoint_port_name: endpoint 端口的名称。
-
__meta_kubernetes_endpoint_port_protocol: endpoint 端口的协议。
-
__meta_kubernetes_endpoint_address_target_kind: endpo int地址目标的类型,如deployment、DaemonSet等。
-
__meta_kubernetes_endpoint_address_target_name: endpoint地址目标的名称。
2.5 ingress角色
该ingress角色发现用于发现ingress的每个地址目标。该地址将设置为ingress的spec配置中指定的host。
可使用的元数据标签如下:
- __meta_kubernetes_namespace: ingress 对外的命名空间。
- __meta_kubernetes_ingress_name: ingress 对象的名称。
- _meta_kubernetes_ingress_label: ingress 对象的各个标签。
- _meta_kubernetes_ingress_labelpresent: ingress 对象的各个标签,value为true或false。
- _meta_kubernetes_ingress_annotation: ingress 对象的各个注释。
- _meta_kubernetes_ingress_annotationpresent: ingress 对象的各个注释,value为true或false。
- __meta_kubernetes_ingress_class_name: ingress的spec配置中的Class名称,如果存在的话。
- __meta_kubernetes_ingress_scheme: ingress使用的协议 ,http或https。
- __meta_kubernetes_ingress_path: ingress的spec配置中指定的路径,默认为 /
小结:
本篇我们主要介绍了Prometheus实例在Kubernetes中的部署方式,以及监控集群所需要的服务发现功能。下篇我们将讲解如何通过这些功能,来实现对Kubernetes集群的监控。
上一篇:Prometheus监控实战系列十八:基于Consul的服务发现
下一篇:Prometheus监控实战系列二十:监控Kubernetes集群(下)
相关文章:

Prometheus监控实战系列十九:监控Kubernetes集群(上)
Kuberentes是一款开源的容器编排产品,由Google开发后发布到社区,并在2015年将该项目捐献给了云原生基金会(Cloud Native Computing Foundation)。从2014年第一个版本发布以来,Kubernetes便迅速获得开源社区的追捧&…...

番茄学习法——亲测超级好用
今天给大家分享下我最近使用的学习方法,真的非常好用!大家用起来! 在日常的学习和工作中,我们经常会遇到一些难以克服的问题:分心、效率低下、焦虑等。为了帮助人们更好地学习和工作,一些学习方法和工具应运…...

vue 项目中使用高德地图
一、账号准备 首先,需要注册并登录高德地图开放平台,申请密钥。操作指引:高德地图开放平台 二、安装高德地图加载器 npm 安装: npm i amap/amap-jsapi-loader --save或者 yarn 安装: yarn add amap/amap-jsapi-loa…...

【每日一题】病人排队
题目描述小理是个热爱生活的孩子。病人登记看病,小理想编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:1. 老年人(年龄 ≥≥ 60岁)比非老年人优先看病。2. 老年人按年龄从大到小的顺序看病,年龄…...

【数据结构】链表OJ题
目录面试题 02.04 分割链表剑指 Offer II 027 回文链表160 相交链表141 环形链表142 环形链表 II138 复制带随机指针的链表面试题 02.04 分割链表 定义lesshead和greaterhead链接小于和大于等于k的值分别设置哨兵位和尾节点指针最后将两表去除哨兵位再链接 struct ListNode* p…...

冒泡 VS 插入 VS 选择——谁更胜一筹?(附排序源码)
文章目录什么样的“排序算法”更加优质?排序算法的执行效率排序算法的内存消耗排序算法的稳定性冒泡排序(Bubble Sort)插入排序(Insertion Sort)选择排序(Selection Sort)最终的胜利者…...

[python tools] 今天看到另一个配置工具 YACS,所以做下笔记
YACS 实际上就只是把别人的readme翻译了一下 github: https://github.com/rbgirshick/yacs 样例代码: https://github.com/Wuziyi616/multi_part_assembly/blob/master/docs/config.md 一、使用方法 1. 首先搞一个config的python文件,用来存一下基本的配置信息 比…...

Prometheus cadvisor容器监控和node-exporter节点监控
往期文章 Prometheus监控系统 https://blog.csdn.net/qq_39578545/article/details/108754585 Docker之compose介绍 使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。下面介绍Docker官方产品,Docker Comp…...

机器学习|正则化|评估方法|分类模型性能评价指标|吴恩达学习笔记
前文回顾:逻辑回归 目录 📚正则化 🐇过拟合的问题 🐇代价函数 🐇正则化线性回归 🐇正则化的逻辑回归模型 📚模型评估方法 🐇留出法(hold-out) &#…...

python迭代器详解
不懂的问题:什么是协变、逆变?渐进式? _T_co TypeVar("_T_co", covariantTrue) # Any type covariant containers.作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者&…...

关于Docker逃逸
关于Docker逃逸 文章目录关于Docker逃逸前言一、判断是否为docker容器?二、privileged特权模式启动容器逃逸三、 Docker Remote API未授权访问逃逸四、危险挂载导致Docker逃逸五、危险挂载Docker Socket逃逸六、 挂载宿主机procfs逃逸七、脏牛漏洞来进行docker逃逸八…...

@Autowired和@Resource区别
Autowired和Resource到底有什么区别 Autowired 和 Resource 都是用来实现依赖注入的注解(在 Spring/Spring Boot 项目中),但二者却有着 5 点不同: 来源不同:Autowired 来自 Spring 框架,而 Resource 来自…...

动态内存管理详细讲解
目录 1.为什么存在动态内存分配 2. 动态内存函数的介绍 2.1 malloc和free 2.2 calloc 2.3 realloc 今天要和大家分享的内容是的动态内存管理,我们先从他的定义入手学习。 1.为什么存在动态内存分配 我们到现在已经掌握了内存开辟的方式就是要么创建一个变量…...

Python和Excel的完美结合:常用操作汇总(案例详析)
在以前,商业分析对应的英文单词是Business Analysis,大家用的分析工具是Excel,后来数据量大了,Excel应付不过来了(Excel最大支持行数为1048576行),人们开始转向python和R这样的分析工具了&#…...

卡特兰数、斯特林数基础
卡特兰数 从格点(0,0)(0,0)(0,0)走到格点(n,n)(n,n)(n,n),只能向右或向上走,不能穿过对角线,的路径的条数,称为卡特兰数HnH_nHn。 则有H01H_01H01。 通项公式: Hn(2nn)−(2nn−1)H_n\begin{pmatrix} 2n\\ n \en…...
STL——mapmultimap和setmultiset
一、关联式容器 与序列式容器相同,关联式容器也是用于存储数据的,不同的是,关联式容器里存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。 二、键值对 用来表示具有一一对应的一种结构,该…...

2023热门抖音权重查询小程序源码
2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样,小程序适配优化。接口免费。小程序不是网页 修改教程: 1,如果想修改或者去除水印,直接删除或修改“index.html”12~22行 2,如果想修改logo,直接…...

153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]
我认为,无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感!!! 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…...

如何成为优秀的程序员
崔宝秋,现任小米首席架构师、小米云平台负责人。1995年赴美留学,纽约州立大学石溪分校计算机科学系博士毕业,曾任IBM高级工程师和高级研发经理、雅虎搜索技术核心团队主任工程师、LinkedIn主任工程师,2012年回国加入小米科技。 20…...

多线程(四):线程安全
在开始讲解线程安全之前我们先来回顾一下我们学了那些东西了: 1. 线程和进程的认识 2. Thread 类的基本用法 3. 简单认识线程状态 4. 初见线程安全 上一章结束时看了一眼线程安全问题,本章将针对这个重点讲解。 一个代码在单线程中能够安全执行&am…...

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解Camera的使用
🍇 博主主页: 【Systemcall小酒屋】🍇 博主追寻:热衷于用简单的案例讲述复杂的技术,“假传万卷书,真传一案例”,这是林群院士说过的一句话,另外“成就是最好的老师”,技术…...

C++之模拟实现string
文章目录前言一、包含的相关头文件二、构造和析构1.构造函数2.拷贝构造1.传统写法2.现代写法3.赋值运算符重载1.传统写法2.现代写法4.析构函数三、iterator四、modify1.push_back(尾插一个字符)2.append(尾插一个字符串)3.运算符重载1.尾插字…...

SpringBoot实战(十三)集成 Admin
目录一、简介二、搭建 springboot-admin 管理服务1.Maven 依赖2.application.yml3.添加 EnableAdminServer4.启动服务,查看页面三、搭建 springboot-admin-client 客户端服务1.Maven 依赖2.application.yml3.启动服务,查看页面四、搭配 Eureka 使用1.搭建…...

mke2fs命令:建立ext2文件系统
以下内容源于网络资源的学习与整理,如有侵权请告知删除。 使用格式 mke2fs [options] [设备名称] [区块数] options与含义 -c:检查是否有损坏的区块。-F:不管指定的设备为何,强制执行mke2fs。-M:记录最后一次挂入的…...

免费分享一个springboot+vue的办公系统
springbootvue的OA系统项目介绍项目部署项目特点项目展示项目介绍 这是一个采用前后端分离开发的项目,前端采用 Vue 开发、后端采用 SpringBoot Mybatis 开发。 很适合java初学者练手和学习。 前端技术:Vue3.2 Vue-Router Pinia Ant Design Vue 3.X…...

STM32数据搬运工DMA
DMA的概念DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路ÿ…...

4、操作系统——进程间通信(2)(system V-IPC介绍)
目录 一、system V-IPC常识 1、key和ID 2、文件描述符 3、函数(ftok) ftok产生IPC对象的健值key(类似文件路径) 4、例子 5、使用命令查看或删除当前系统中的IPC对象 一、system V-IPC常识 1、key和ID (1&#x…...

基于CentOS Stream 9平台搭建Nacos2.0.4集群以及OpenResty反向代理
目录展示Nacos2.0.4集群搭建1. 下载2. 解压3.修改配置3.1分别修改下启动类中JDK路径以及启动大小3.2 分别配置数据源3.3 创建nacos数据库3.4 修改cluster.conf配置3.4.1 复制并修改3.4.2 编辑文件,修改三台主机地址3.4.3 分别放入另外两个nacos的conf目录下:4. 启动…...

老杜MySQL入门基础 第二天
导入演示数据 1、连接MySQL 2、创建"bjpowernode"数据库 create database bjpowernode;3、选择数据库 use bjpowernode4、导入数据 source D:\bjpowernode.sql(文件的路径)1 去除重复记录(把查询结果去除重复记录)(原表数据不会改变) 使用关键字dist…...

Python深度学习实战:人脸关键点(15点)检测pytorch实现
引言 人脸关键点检测即对人类面部若干个点位置进行检测,可以通过这些点的变化来实现许多功能,该技术可以应用到很多领域,例如捕捉人脸的关键点,然后驱动动画人物做相同的面部表情;识别人脸的面部表情,让机…...