🐇明明跟你说过:
🏅个人专栏:《prometheus:监控的神》 🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、k8s简介
有关k8s起源的介绍,请参考《初识k8s之前世今生、架构、组件、前景》这篇文章
kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的yaml清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助kubernetes的开放源代码api,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(ci/cd)工具集成。
2、 prometheus概述
以下是 prometheus 的一些关键特点和概述:
- 多维数据模型: prometheus 使用多维数据模型来存储时间序列数据,这意味着每个样本可以与任意数量的键/值标签相关联。这种灵活性使得用户可以以灵活的方式对数据进行查询和分析。
- 灵活的查询语言: prometheus 提供了 promql(prometheus query language),这是一种强大而灵活的查询语言,可以用于从 prometheus 中提取和处理数据。
- 数据采集: prometheus 通过称为 exporters 的插件来采集数据。exporters 可以将各种系统和服务的指标暴露给 prometheus,例如应用程序、操作系统、数据库等。
- 警报管理: prometheus 具有内置的警报管理功能,可以通过配置警报规则来触发警报。这些警报可以发送到各种通知渠道,如电子邮件、slack 等。
- 可扩展性: prometheus 是一个高度可扩展的系统,可以通过水平扩展来处理大量的时间序列数据。它支持多种存储后端,包括本地磁盘存储和远程存储系统。
- 社区支持: 作为 cncf 项目的一部分,prometheus 拥有一个庞大而活跃的社区,不断提供新的功能、改进和支持。
总的来说,prometheus 是一个功能强大且灵活的监控系统,适用于各种规模的环境,并且可以与其他工具集成,以构建强大的监控解决方案。
有关prometheus的详细介绍,请参考《揭秘prometheus:诞生之旅与核心组件全解析》这篇文章
二、准备k8s环境
1、k8s集群搭建
如果还未搭建k8s集群,请参考《深度解析:kubernetes 1.28.2集群安装过程中的关键步骤》这篇文章
2、集群状态检查
[root@master ~]# kubectl get node
三、部署prometheus
1、创建名称空间
创建一个名为prometheus的名称空间,prometheus所有的组件都在这个名称空间下运行
[root@master ~]# kubectl create ns prometheus
namespace/prometheus created
2、安装node-exporter
node-exporter资源官网地址:download | prometheus
离线镜像资源我已经放到资源列表中了,大家自行下载即可
下载后,在各个节点上导入
准备yaml文件
[root@master ~]# cat node-export.yaml
# 输入如下内容
apiversion: apps/v1
kind: daemonset
metadata:
name: node-exporter
namespace: prometheus
labels:
name: node-exporter
spec:
selector:
matchlabels:
name: node-exporter
template:
metadata:
labels:
name: node-exporter
spec:
hostpid: true
hostipc: true
hostnetwork: true
containers:
- name: node-exporter
image: docker.io/prom/node-exporter:v1.8.0
imagepullpolicy: ifnotpresent
ports:
- containerport: 9100
securitycontext:
privileged: true
args:
- --path.procfs
- /host/proc
- --path.sysfs
- /host/sys
- --collector.filesystem.ignored-mount-points
- '"^/(sys|proc|dev|host|etc)($|/)"'
volumemounts:
- name: dev
mountpath: /host/dev
- name: proc
mountpath: /host/proc
- name: sys
mountpath: /host/sys
- name: rootfs
mountpath: /rootfs
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "exists"
effect: "noschedule"
volumes:
- name: proc
hostpath:
path: /proc
- name: dev
hostpath:
path: /dev
- name: sys
hostpath:
path: /sys
- name: rootfs
hostpath:
path: /
- apiversion 指定了 kubernetes api 的版本为 apps/v1。
- kind 指定了资源的类型为 daemonset,即守护进程集。
- metadata 下的 name 字段指定了 daemonset 的名称为 node-exporter,namespace 字段指定了 daemonset 所属的命名空间为 prometheus。
- spec 下定义了 daemonset 的规范。
- selector 指定了选择器,用于选择要控制的 pod。
- template 定义了要创建的 pod 的模板,其中包含了 pod 的元数据和规范。
- hostpid: true、hostipc: true、hostnetwork: true:指定了容器可以使用主机的 pid、ipc 和网络命名空间。
- containers 下定义了要运行的容器,这里定义了一个名为 node-exporter 的容器。
- image 指定了容器的镜像为 docker.io/prom/node-exporter:v1.8.0。
- ports 定义了容器暴露的端口,这里将容器的端口 9100 映射到了宿主机上。
- securitycontext 下的 privileged: true 表示容器具有特权访问。
- args 下指定了容器启动时的参数,这里配置了 node exporter 的参数。
- volumemounts 下定义了容器挂载的卷。
- tolerations 下定义了容忍策略,表示容器可以容忍某些节点上的特定条件。
- volumes 下定义了宿主机的卷,用于挂载到容器中。
查看pod状态
访问测试,使用curl命令,如果有返回值,则部署成功
3、安装prometheus server
离线镜像资源我已经放到资源列表中了,大家自行下载即可
下载后,在各个节点上导入
然后,在node1节点上,为prometheus server创建一个数据目录
[root@node1 ~]# mkdir /data
[root@node1 ~]# chmod 777 /data/
为prometheus server创建一个sa,并分配权限
[root@master ~]# kubectl create serviceaccount prometheus -n prometheus
serviceaccount/prometheus created
[root@master ~]# kubectl create clusterrolebinding prometheus-clusterrolebinding -n prometheus --clusterrole=cluster-admin --serviceaccount=prometheus:prometheus
clusterrolebinding.rbac.authorization.k8s.io/prometheus-clusterrolebinding created
编写prometheus的config配置文件
[root@master ~]# vim prometheus-config.yaml
#输入以下内容
---
kind: configmap
apiversion: v1
metadata:
labels:
app: prometheus
name: prometheus-config
namespace: prometheus
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 1m
scrape_configs:
- job_name: 'kubernetes-node'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- job_name: 'kubernetes-node-cadvisor'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
- job_name: 'kubernetes-apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_name
- global 部分定义了全局的抓取配置,包括抓取间隔 scrape_interval、超时时间 scrape_timeout 和评估间隔 evaluation_interval。
- scrape_configs 部分定义了要抓取的目标列表,每个 job_name 对应一个抓取目标配置。在这个示例中,有以下几个抓取目标:
- kubernetes-node:抓取 kubernetes 节点的指标,通过 kubernetes 的服务发现配置 kubernetes_sd_configs,并通过 relabel_configs 将抓取地址从 :10250 替换为 :9100。
- kubernetes-node-cadvisor:抓取 kubernetes 节点的 cadvisor 指标,通过 kubernetes 的服务发现配置和 tls 配置,以及 relabel_configs 对地址和路径进行替换和重写。
- kubernetes-apiserver:抓取 kubernetes api server 的指标,通过 kubernetes 的服务发现配置和 tls 配置,以及 relabel_configs 保留相关标签。
- kubernetes-service-endpoints:抓取 kubernetes 服务的指标,通过 kubernetes 的服务发现配置和 relabel_configs 对地址、路径和标签进行替换和重写。
- 每个抓取目标配置中都包含了 kubernetes_sd_configs,用于从 kubernetes 中发现相应的目标,以及 relabel_configs,用于对抓取地址、标签等进行转换和处理。
创建configmap
[root@master ~]# kubectl apply -f prometheus-config.yaml
编写部署prometheus server的yaml文件
[root@master ~]# vim prometheus-deploy.yaml
---
apiversion: apps/v1
kind: deployment
metadata:
name: prometheus-server
namespace: prometheus
labels:
app: prometheus
spec:
replicas: 1
selector:
matchlabels:
app: prometheus
component: server
#matchexpressions:
#- {key: app, operator: in, values: [prometheus]}
#- {key: component, operator: in, values: [server]}
template:
metadata:
labels:
app: prometheus
component: server
annotations:
prometheus.io/scrape: 'false'
spec:
nodename: node1
serviceaccountname: prometheus
containers:
- name: prometheus
image: prom/prometheus:v2.51.1
imagepullpolicy: ifnotpresent
command:
- prometheus
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention=720h
- --web.enable-lifecycle
ports:
- containerport: 9090
protocol: tcp
volumemounts:
- mountpath: /etc/prometheus
name: prometheus-config
- mountpath: /prometheus/
name: prometheus-storage-volume
volumes:
- name: prometheus-config
configmap:
name: prometheus-config
- name: prometheus-storage-volume
hostpath:
path: /data
type: directory
部署prometheus server
[root@master ~]# kubectl apply -f prometheus-deploy.yaml
查看pod状态
4、创建service
为prometheus server创建一个service,用于我们外部访问
[root@master ~]# vim prometheus-svc.yaml
#输入如下内容
apiversion: v1
kind: service
metadata:
name: prometheus
namespace: prometheus
labels:
app: prometheus
spec:
type: nodeport
ports:
- port: 9090
targetport: 9090
protocol: tcp
selector:
app: prometheus
component: server
创建service
[root@master ~]# kubectl apply -f prometheus-svc.yaml
查看service的nodeport端口
四、访问测试
在浏览器输入node ip + service端口
点击status并点击targets,如果能显示下面的内容,说明监控数据采集成功
目前采集的目录并不适合直接阅读,还需要配合grafana进行数据的展示,关于grafana,我们将在后期的章节中介绍
发表评论