【云原生 Prometheus篇】Prometheus的动态服务发现机制
自动发现(基于文件;基于consul;基于K8s api)
自动发现
一、Prometheus服务发现 理论部分
1.1 Prometheus数据采集配置
scrape_configs:
- job_name: XXX #自定义监控任务的名称
metrics_path: "/metrics" #指定获取监控指标数据的URL路径,一般都是 /metrics
scheme: "https" #指定拉取监控指标数据的协议,http(默认值)|https
#定义静态配置的监控目标
static_configs:
- targets: #指定监控目标的IP和exporter的端口
- <IP1>:<exporter的端口>
- <IP2>:<exporter的端口>
labels: #自定义监控目标的标签
<标签key>: <标签value>
1.2 基于文件的服务发现
简介
Prometheus Server
会定期从文件中加载 Target 信息,文件可使用 YAML 和 JSON 格式,它含有定义的 Target 列表,以及可选的标签信息。
基于文件的服务发现不依赖于任何平台或第三方服务,是最为简单和通用的实现方式。
配置模板
#基于文件的服务发现
file_sd_configs:
- files:
- XXX.yaml #指定作服务发现的文件的路径
refresh_interval: 1m #指定服务发现的刷新间隔时间
1.3 基于consul的服务发现
下载地址:https://www.consul.io/downloads/
简介
Consul 是一款基于 golang 开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。
提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。
模板
#基于consul的服务发现
consul_sd_configs:
- server: <consul服务器IP>:8500 #指定consul服务器地址和端口
tags: #指定在consul服务发现中用于作prometheus监控的tags标签
- 用于作prometheus监控的标签
refresh_interval: 1m
1.4 基于 Kubernetes API 的服务发现
1.4.1 概念
基于 Kubernetes API 的服务发现机制,支持将API Server 中 Node、Service、Endpoint、Pod 和 Ingress 等资源类型下相应的各资源对象视作 target, 并持续监视相关资源的变动
●Node、Service、Endpoint、Pod 和 Ingress 资源分别由各自的发现机制进行定义
●负责发现每种类型资源对象的组件,在 Prometheus 中称为一个 role
●支持在集群上基于 DaemonSet 控制器部署 node-exporter 后发现各 Node 节点,也可以通过 kubelet 来作为 Prometheus 发现各 Node 节点的入口
1.4.2 部分配置参数
# The API server addresses. If left empty, Prometheus is assumed to run inside of the cluster and will discover API servers automatically
and use the pod's
# CA certificate and bearer token file at /var/run/secrets/kubernetes.io/serviceaccount/.
[ api_server: <host> ]
# The Kubernetes role of entities that should be discovered. One of endpoints, service, pod, node, or ingress.
role: <string>
# Optional authentication information used to authenticate to the API server.
# Note that 'basic_auth', 'bearer_token'和'bearer_token_file' 等认证方式互斥;
[ bearer_token: <secret> ]
[ bearer_token_file: <filename> ]
# TLS configuration.
tls_config:
# CA certificate to validate API server certificate with.
[ ca_file: <filename> ]
# Certificate and key files for client cert authentication to the server.
[ cert_file: <filename> ]
[ key_file: <filename> ]
# ServerName extension to indicate the name of the server.
[ server_name: <string> ]
# Optional namespace discovery. If omitted, all namespaces are used.
namespaces:
names:
[ - <string> ]
1.4.3 配置模板
#基于K8S的服务发现
- job_name: XXX
scheme: "https"
kubernetes_sd_configs:
- role: endpoints|service|pod|node|ingress #指定被监控的K8S资源对象类型
二、实例一:部署基于文件的服务发现
2.1 创建用于服务发现的文件
新建工作目录
cd /usr/local/prometheus
mkdir targets
在文件中配置所需的 target
vim targets/node-exporter.yaml
- targets:
- 192.168.2.108:9100
- 192.168.2.106:9100
labels:
app: node-exporter
job: node
vim targets/mysqld-exporter.yaml
- targets:
- 192.168.2.108:9104
- 192.168.2.106:9104
labels:
app: mysqld-exporter
job: mysqld
2.2 修改Prometheus的配置文件
修改 prometheus 配置文件,发现 target 的配置,定义在配置文件的 job 之中。
vim /usr/local/prometheus/prometheus.yml
......
scrape_configs:
- job_name: nodes
file_sd_configs: #指定使用文件服务发现
- files: #指定要加载的文件列表
- targets/node*.yaml #文件加载支持通配符
refresh_interval: 2m #每隔 2 分钟重新加载一次文件中定义的 Targets,默认为 5m
- job_name: mysqld
file_sd_configs:
- files:
- targets/mysqld*.yaml
refresh_interval: 2m
2.3 浏览器访问测试
#先重启服务
systemctl reload prometheus
#然后
浏览器查看 Prometheus 页面的 Status -> Targets
三、实例二:部署基于consul的服务发现
3.1 部署Consul服务
cd /opt/
unzip consul_1.9.2_linux_amd64.zip
mv consul /usr/local/bin/
#创建 Consul 服务的数据目录和配置目录
mkdir /var/lib/consul-data
mkdir /etc/consul/
#使用 server 模式启动 Consul 服务
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-config-dir=/etc/consul/ \
-bind=192.168.2.108 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
#查看 consul 集群成员
consul members
3.2 在Consul 上注册 Services
#在配置目录中添加文件
vim /etc/consul/nodes.json
{
"services": [
{
"id": "node_exporter-node01",
"name": "node01",
"address": "192.168.2.108",
"port": 9100,
"tags": ["nodes"],
"checks": [{
"http": "http://192.168.2.108:9100/metrics",
"interval": "5s"
}]
},
{
"id": "node_exporter-node02",
"name": "node02",
"address": "192.168.2.106",
"port": 9100,
"tags": ["nodes"],
"checks": [{
"http": "http://192.168.2.106:9100/metrics",
"interval": "5s"
}]
}
]
}
#让 consul 重新加载配置信息
consul reload
浏览器访问:http://192.168.2.108:8500
3.3 修改 prometheus 配置文件
vim /usr/local/prometheus/prometheus.yml
......
- job_name: nodes
consul_sd_configs: #指定使用 consul 服务发现
- server: 192.168.2.108:8500 #指定 consul 服务的端点列表
tags: #指定 consul 服务发现的 services 中哪些 service 能够加入到 prometheus 监控的标签
- nodes
refresh_interval: 2m
systemctl reload prometheus
浏览器查看 Prometheus 页面的 Status -> Targets
#让 consul 注销 Service
consul services deregister -id="node_exporter-node02"
#重新注册
consul services register /etc/consul/nodes.json
四、Prometheus对接Kurbernetes集群的方法
4.1 方式一:外部部署
在K8S集群外部署的prometheus的认证配置。
#第一种老版本配置方法
api_server: <apiserver的IP>:6443 #指定apiserver的地址和端口
tls_config:
ca_file: <filename> #指定ca证书的路径
cert_file: <filename> #指定客户端证书的路径
key_file: <filename> #指定客户端私钥的路径
#第二种新版本配置方法
kubeconfig_file: <filename> #指定kubeconfig集群引导配置文件路径,kubeconfig文件会包含集群参数(ca证书、apiserver地址)和客户端参数(客户端证书和私钥信息)
部署思路
-
生成认证密钥: 首先,需要生成用于认证的密钥。
可以使用
htpasswd
命令行工具来生成一个包含用户名和密码的密钥文件。例如,使用以下命令生成一个名为
auth
的密钥文件:htpasswd -c -B -C 12 auth username #上述命令将提示你输入密码 #然后在当前目录下生成一个名为 `auth` 的密钥文件, #并将用户名和密码添加到该文件中。
-
创建 Secret 对象: 在 Kubernetes 集群中,使用 Secret 对象来存储认证密钥。
kubectl create secret generic prometheus-auth --from-file=auth #创建一个名为 `prometheus-auth` 的 Secret 对象,并将 `auth` 文件的内容存储在其中。
-
更新 Prometheus 配置: 编辑 Prometheus 的配置文件
prometheus.yml
,添加认证相关的配置。 -
部署 Prometheus: 根据你的部署方式,可以使用 Docker 或其他工具将 Prometheus 部署在Kubernetes集群外部。
-
部署配置文件和 Secret 对象: 将更新后的
prometheus.yml
文件和创建的 Secret 对象应用到 Prometheus 的部署中。比如使用容器编排工具(如 Docker Compose),将这些文件挂载到容器中。
完成上述步骤后, Prometheus 将使用认证配置来保护其 Web UI 和其他功能。
只有提供正确的用户名和密码才能访问相关页面。
4.2 方式二:内部部署(以Pod的形式)
在K8S集群内以Pod形式部署的prometheus的认证配置。
#在K8S集群内以Pod形式部署的prometheus的认证配置
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
#第一种老版本配置方法
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
#第二种新版本配置方法
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
五、小结
Prometheus数据采集配置
scrape_configs:
- job_name: XXX #自定义监控任务的名称
metrics_path: "/metrics" #指定获取监控指标数据的URL路径,一般都是 /metrics
scheme: "http" #指定拉取监控指标数据的协议,http(默认值)|https
#定义静态配置的监控目标
static_configs:
- targets: #指定监控目标的IP和exporter的端口
- <IP1>:<exporter的端口>
- <IP2>:<exporter的端口>
labels: #自定义监控目标的标签
<标签key>: <标签value>
#基于文件的服务发现
file_sd_configs:
- files:
- XXX.yaml #指定作服务发现的文件的路径
refresh_interval: 1m #指定服务发现的刷新间隔时间
#基于consul的服务发现
consul_sd_configs:
- server: <consul服务器IP>:8500 #指定consul服务器地址和端口
tags: #指定在consul服务发现中用于作prometheus监控的tags标签
- 用于作prometheus监控的标签
refresh_interval: 1m
#基于K8S的服务发现
- job_name: XXX
scheme: "https"
kubernetes_sd_configs:
- role: endpoints|service|pod|node|ingress #指定被监控的K8S资源对象类型
#在K8S集群外部署的prometheus的认证配置
#第一种老版本配置方法
api_server: <apiserver的IP>:6443 #指定apiserver的地址和端口
tls_config:
ca_file: <filename> #指定ca证书的路径
cert_file: <filename> #指定客户端证书的路径
key_file: <filename> #指定客户端私钥的路径
#第二种新版本配置方法
kubeconfig_file: <filename> #指定kubeconfig集群引导配置文件路径,kubeconfig文件会包含集群参数(ca证书、apiserver地址)和客户端参数(客户端证书和私钥信息)
#在K8S集群内以Pod形式部署的prometheus的认证配置
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
#第一种老版本配置方法
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
#第二种新版本配置方法
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
更多推荐
所有评论(0)