?明明跟你说过:个人主页
?个人专栏:《Prometheus:监控的神》 ?
?行路有良友,便是天堂?
目录
一、引言
1、k8s简介
2、 Prometheus概述
二、准备k8s环境
1、k8s集群搭建
2、集群状态检查
三、部署Prometheus
1、创建名称空间
2、安装node-exporter
3、安装Prometheus server
4、创建Service
四、访问测试
一、引言
1、k8s简介
Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。
Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。
有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章
Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。
2、 Prometheus概述
Prometheus 是一款开源的监控和警报工具,最初由 SoundCloud 开发,现已成为 Cloud Native Computing Foundation(CNCF)的一部分。它旨在帮助用户监控其应用程序和系统的性能,并能够发现故障、进行警报和分析。
以下是 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 prometheusnamespace/prometheus created
2、安装node-exporter
node-exporter资源官网地址:Download | Prometheus
离线镜像资源我已经放到资源列表中了,大家自行下载即可
下载后,在各个节点上导入
准备YAML文件
[root@master ~]# cat node-export.yaml # 输入如下内容apiVersion: apps/v1kind: DaemonSetmetadata: name: node-exporter namespace: prometheus labels: name: node-exporterspec: 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 prometheusserviceaccount/prometheus created[root@master ~]# kubectl create clusterrolebinding prometheus-clusterrolebinding -n prometheus --clusterrole=cluster-admin --serviceaccount=prometheus:prometheusclusterrolebinding.rbac.authorization.k8s.io/prometheus-clusterrolebinding created
编写Prometheus的config配置文件
[root@master ~]# vim prometheus-config.yaml #输入以下内容---kind: ConfigMapapiVersion: v1metadata: labels: app: prometheus name: prometheus-config namespace: prometheusdata: 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/v1kind: Deploymentmetadata: name: prometheus-server namespace: prometheus labels: app: prometheusspec: 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: v1kind: Servicemetadata: name: prometheus namespace: prometheus labels: app: prometheusspec: 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,我们将在后期的章节中介绍
???每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Prometheus的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!???
???让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!