关注分享主机优惠活动
国内外VPS云服务器

容器监控实践-Prometheus配置与服务发现(Prometheus监控平台组件)

摘要:您可以使用命令行参数或配置文件进行配置摘要。 在集群中时,常见配置为中等或较低配置。 检查可用的命令行参数。 您可以运行或指定相应的配置文件和参数。 通常,如果配置发生更改(例如添加集合),您可以重新加载它。 目前主要支持三种服务发现模式:

本文分四个部分来分析常见的Prometheus配置和服务发现:概述、配置细节、服务发现和常见场景。

1.概述

Prometheus可以使用命令行参数或配置文件进行配置。 如果是在k8s集群中,一般是在configmap中配置(以下均为prometheus2.7版本))

查看可用的命令行参数,运行 ./prometheus - h 即可执行。

也可以指定对应的配置文件,参数:--config.file 一般是prometheus.yml

配置,例如添加采集作业的话,Prometheus可以重新加载配置。 只需向该进程发送 SIGHUP 或向 /-/reload 端点发送 HTTP POST 请求即可。 示例:

curl -X POST http://localhost:9090/-/reload

2. 配置详细信息

2.1 命令行参数

运行./prometheus -h查看各个参数的含义。 示例:

-[ k4]web.listen[k4 ]address="0.0.0.0:9090" 默认监听端口为 9090。 您可以将其更改为仅允许本地访问,或出于安全原因更改端口号(默认 Web 服务(无身份验证)) --web .max-connections =512 默认最大连接数:512-[ k4]存储.tsdb.path="data/" 默认存储路径:数据目录下的--storage.tsdb.retention.time=15d。  默认数据保留期限:15 天。    原来的storage.tsdb.retention配置已被废弃 --alertmanager.timeout=10s 发送警报到alert manager的超时限制为10秒--query.timeout=2m 默认查询超时限制时长2分钟,自动终止。    可以与grafana时间限制设置结合使用,例如60s--query.max-concurrency=20。  并发查询数。   prometheus 默认的收集指标之一是 prometheus_engine_queries_concurrent_max,它可以让你获取最大并发查询数和查询状态 --log.level=info 日志记录级别有四种:[debug, info, warn , error] 。  如果可以先将debug属性改为debug级别...

可以在prometheus页面的状态中的命令-行标志中看到当前的设置。 例如,promethues-operator的配置为:

2.2 prometheus.yml

附带从官方下载页面下载的prometheus二进制文件。 使用默认设置的 prometheus.yml

-rw-r--r-- @ LICENSE-rw-r-- ]r--@ 通知 drwxr-xr-x@ console_librariesdrwxr-xr-x@ 控制台-rwxr[ k4]xr-x@ prometheus-rw-r--r--@ prometheus.yml-rwxr-xr-x@ promtool

prometheus.yml 设置许多属性,包括远程存储、警报设置等。 主要属性解释如下。

# 默认全局设置 global:scrape_interval: 15s # 采集间隔为15秒,默认evaluation_interval: 每分钟15秒 # 默认计算规则间隔为每分钟15秒 scrape_timeout : 10s # 采集超时,默认为10 Seconds external_labels: # 与其他外部系统(例如远程存储或联邦集群)交互时的标签 prometheus: Monitoring /k8s # 示例:prometheus- 操作员配置 prometheus_replica: prometheus -k8s-1# Alert Manager Configuration Alert:alertmanagers : - static_configs: - Target: - 127.0.0.1:9093 # Alert Manager 服务地址(例如 127.0.0.1:9093)alert_relabel_configs: # 在爬取之前修改目标及其标签。      - 分隔符: ; 正则表达式: prometheus_replica 替换: $1 动作: labeldrop # 根据报警规则文件加载时的评估间隔(15秒)计算。  一个规则文件可以包含多个rule_files: # - "first_rules.yml" # - "second_rules.yml" #scrape_configs 是一个集合配置,包含至少一个 job.crape_configs: # Prometheus 自己的监控对采集到的时间序列数据进行标签 job=xx [ k4] job_name: "prometheus" # 采集指标的默认路径为:/metrics (e.g. localhost:9090/metric) # 默认协议为http static_configs: - target: ["localhost:9090"] # 远程读取,可选配置包括远程读写监控数据到influxdb地址,默认为本地读写。   h5> 

最常用的prometheus配置是scrape_configs配置,例如添加新的监视器或更改原有监视器的地址频率。

最简单的配置是:

scrape_configs:- job_name: prometheusmetrics_path: /metrics Scheme: http static_configs: - Target: - localhost:9090

完整配置为:(使用prometheus推荐配置) -operator):

# 作业以标签的形式出现在指标数据中,例如node-exporter收集的数据。 作业=节点-exporterjob_name:节点-exporter# 采集频率: 30sscrape_interval: 30s# 采集超时: 10sscrape_timeout: 10s# 采集对象路径metrics_path: /metrics# 采集协议: http or httpsscheme: https# 可选采集URL参数 params: name: demo# 当成为标签时采集做什么如果与给定标签存在冲突。  默认情况下,名称将被更改。  Exported_xxhonor_labels: false# 如果需要身份验证来检索集合对象,则设置帐户密码和其他信息。  basic_auth: 用户名:admin 密码:admin 密码_file : /etc/pwd# bearer_token 或文件位置(OAuth 2.0 认证) bearer_token: kferkhjktdgjwkgkrwgbearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token# https 配置(如跳过认证)并配置证书文件) tls_config: # insecure_skip_verify: true ca_file: /var/run/secrets/kubernetes .io/serviceaccount/ca.crt server_name: kubernetes insecure_skip_verify: false# 代理地址 proxy_url: 9.0:9999# Azure 服务发现配置azure_sd_configs:# Consul 服务发现配置 consul_sd_configs: # DNS 服务发现配置 dns_sd_configs: # EC2 服务发现配置 ec2_sd_configs: # 操作Enstack服务发现配置 OpenStack_SD_CONFIGS: #File服务发现配置 file: #GCE服务发现配置 GCE_SD_CONFIGS: #Marathon服务发现配置 MarathON_SD_CONFIGS: IGS: #TRITON服务发现配置 TRITON_SD_CONFIGS: #KUBERNETES服务发现配置 kubernetes_sd_configs: - 角色:Endpoint Namespace : Name: - Monitoring # 对集合对象进行静态配置,比如放置特定的标签 static_configs: - Target: [" localhost:9090", "localhost: 9191"] label: my: label your: label # 动态地在Prometheus收集数据之前,通过目标实例的元数据信息重写标签值。    例如,将原来的 __meta_kubernetes_namespace 直接写成命名空间,会简洁明了: relabel_configs: - source_labels: [__meta_kubernetes_namespace]separator: ;  正则表达式:(.*) target_label:替换命名空间:$1 操作:替换 - source_labels:[__meta_kubernetes_service_name] 分隔符:; 正则表达式:(.*) target_label:服务替换:$1 操作:替换 - source_labels:[__meta_kubernetes_pod_name] 分隔符:; 正则表达式:(.*) target_label:Pod 替换:$1 操作:替换 [k4 ]。  source_labels: [__meta_kubernetes_service_name] 分隔符: ; 正则表达式: (.*) target_label: 作业替换: ${1} 操作: - 替换分隔符: ; 正则表达式: (.*) target_label: 端点替换: Web 操作: 替换#重新标记指标(例如删除一些无用的指标) metric_relabel_configs: - source_labels: [__name__] Delimiter: ; 正则表达式: etcd_(debugging|disk|request|server).* Replacement : $1 Action: Drop # 限制最大样本数集。 如果超过这个数量,收集就会失败。  默认为0,无限制sample_limit:0

3。 服务发现

上面的配置文件有很多*_sd_configs配置,例如kubernetes_sd_configs,用于提供服务。用于服务发现的集合配置。

支持的服务发现类型:

// prometheus/discovery/config/config.gotype ServiceDiscoveryConfig struct { StaticConfigs []*targetgroup.Group `yaml:"static_configs,omitempty "` DNSSDConfigs []*dns.SDConfig `yaml:"dns_sd_configs,omitempty"` FileSDConfigs []*file.SDConfig `yaml:"file_sd_configs,omitempty"` ConsulSDConfigs []*consul.SDConfig `yaml:"consul_sd_configs,omitempty"` ServersetSDConfigs [ ] *zookeeper.ServersetSDConfig `yaml:"serverset_sd_configs,omitempty"` NerveSDConfigs []*zookeeper.NerveSDConfig `yaml:"nerve_sd_configs,omitempty"`MarathonSDConfigs []*marathon.SDConfig `yaml:"marathon_sd_configs,omitempty"` KubernetesSDConfigs [ ]*S .SDConfig `yaml:"kubernetes_sd_configs,omitempty"` GCESDConfigs []*gce.SDConfig `yaml:"gce_sd_configs,omitempty"` EC2SDConfigs []*ec2.SDConfig `yaml:"ec2_sd_configs,omitempty"` OpenstackSDConfigs []*openstack.SDConfig `yaml:"openstack_sd_configs,omitempty"` AzureSDConfigs []*azure.SDConfig `yaml:"azure_sd_configs,omitempty"` TritonSDConfigs []*triton.SDConfig `yaml:"triton_sd_configs,omitempty"`}

prometheus使用pull方法来拉取监控数据,因此该方法确定了服务器端需要收集的目标。 。 换句话说,对于 scrape_configs 中配置的不同作业,pull 方法的主要缺点是无法动态检测新服务的添加。 因此,大多数监视器默认支持服务发现机制,以自动发现集群中的新端点并将它们添加到您的配置中。

Prometheus支持多种服务发现机制,包括File、DNS、Consul、Kubernetes、OpenStack和EC2。 基于服务发现的过程并不复杂。 Prometheus通过第三方提供的接口查询自己需要监控的目标列表,并轮询这些目标以获取监控数据。

对于 kubernetes,Promethues 与 Kubernetes API 交互并轮询资源端点。 目前我们支持五种主要的服务发现模式:节点、服务、pod、端点和入口。 对应配置文件中的角色:node/role:service

示例:要动态获取所有节点的信息,可以添加如下配置:

- job_name:库bernetes-节点 scrape_interval: 1m scrape_timeout: 10smetrics_path: /metrics 方案: https kubernetes_sd_configs: - api_server: null 角色: 节点命名空间: 名称: [] bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount /令牌 tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true relabel_configs: - 分隔符: ; 正则表达式: __meta_kubernetes_node_label_(.+) 替换: $1 操作: labelmap [k4 ] 分隔符: ; 正则表达式:(.*) target_label: __address__ 替换:kubernetes.default.svc:443 操作:替换 - source_labels: [__meta_kubernetes_node_name] 分隔符:; 正则表达式:(.+) target_label: __metrics_path__ 替换:/api/v1 /nodes /${1}/proxy/metrics 操作:替换

您可以检查目标内的特定内容。

相应的服务和 Pod 也是如此。

请注意,为了让 Prometheus 访问 Kubernetes API,您必须授权对 Prometheus 以及服务帐户的访问权限。 否则,即使设置了,您也无权检索它。

Prometheus权限设置是ClusterRole+ClusterRoleBinding+ServiceAccount的集合,用deployment或者statefulset指定服务账号。

ClusterRole.yaml

apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: 命名空间: kube-系统名称: prometheusrules:- apiGroups: [" " ] 资源:- configmaps - 秘密 - 节点 - pods - 节点/代理 - 服务 - 资源配额 - 复制控制器 - 限制范围 - 持久卷声明 - 持久卷 [ k4] 命名空间 - 端点动词:["get"、"list"、"watch"]- apiGroups:["extensions"] 资源:- 守护进程集 - de部署 - 副本集 - 输入动词:["get", "list", "watch"]- apiGroups:["apps"] 资源:- DaemonSet - 部署 - 副本集- ] 有状态集合动词:["get"、"list"、"watch"]- apiGroups:["batch"] 资源:- cronjobs - 作业动词:["get"、" list ", "watch " "]- apiGroups: ["autoscaling"] 资源: -horizo​​ntalpodautoscalers 动词: ["get", "list", "watch"]- apiGroups: ["policy "] 资源: - poddisruptionbudgets 动词:["get", list", "watch"]- nonResourceURLs:["/metrics"] 动词:["get"]

ClusterRoleBinding.yaml

apiVersion : rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: 命名空间: kube-系统名称: prometheusroleRef: apiGroup: rbac.authorization.k8s.io 类型: ClusterRole 名称: prometheussubjects:- 类型: ServiceAccount 名称: prometheus 命名空间: kube-system

ServiceAccount.yaml

apiVersion: v1kind: ServiceAccountmetadata: 命名空间: kube-system 名称: prometheus

prometheus.yaml

....spec:serviceAccountName:prometheus....

完整的 kubernete 配置为:

- job_name: kubernetes-apiserverscrape_interval: 1mcrape_timeout: 10smetrics_path: /metrics 方案: https kubernetes_sd_configs: - api_server: null 角色: 端点命名空间: 名称: [] bearer_token_file: / var/ run/ Secrets /kubernetes.io/serviceaccount/token tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_k]ubernetes_service_name, __meta_kubernetes_endpoint_port_name] 分隔符:; 正则表达式:默认;kubernetes;https 替换:$1 操作:keep- job_name:kubernetes-nodesscrape_interval:1mcrape_timeout:10s 指标路径:/metrics 方案:https kubernetes_sd_configs:- api_server :null角色:节点命名空间:名称:[] bearer_token_file:/var/run/secrets/kubernetes.io/serviceaccount/token tls_config:ca_file:/var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify:true relabel_configs: - 分隔符: ; 正则表达式: __meta_kubernetes_node_label_(.+) 替换:$1 操作:labelmap - 分隔符: ; 正则表达式: (.*) target_label: __address__ 替换:kubernetes.default.svc:443 操作:- 替换源标签:[__meta_kubernetes_node_name] 分隔符:; 正则表达式:(.+) target_label:__metrics_path__ 替换:/api/v1/nodes/${1}/proxy/metrics 操作:替换- job_name:kubernetes-cadvisor scrape_interval:1m scrape_timeout : 10s 指标路径: /metrics 方案: https kubernetes_sd_configs: - api_server: null 角色: 节点命名空间: 名称: [] bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token tls_config: ca_file: /var /run /secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: false relabel_configs: - 分隔符: ; 正则表达式: __meta_kubernetes_node_label_(.+) 替换: $1 操作: labelmap - 正则表达式: (.*) target_label: __address__ 替换:kubernetes.default.svc:443 操作:替换 - 源标签:[__meta_kubernetes_node_name] 分隔符:; 正则表达式:(.+) target_label: __metrics_path__ 替换:/api/v1/nodes/${1}/proxy/metrics/cadvisor 操作:replace- job_name: kubernetes [ k4] service-endpoints scrape_interval: 1m scrape_timeout: 10smetrics_path: /metrics 方案: http kubernetes_sd_configs: - api_server: null 角色: 端点命名空间: 名称: [] relabel_configs: - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] 分隔符: ;正则表达式:“true” 替换:$1 操作:保留 -。  source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] 分隔符: ; 正则表达式: (https?) target_label: __scheme__ 替换: $1 操作: 替换 - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] 分隔符:; 正则表达式:(.+) target_label: __metrics_path__ 替换:$1 操作:替换 - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] 分隔符:; 正则表达式:([^:]+)(?:: d+) ?; (d+) target_label: __address__ 替换:$1:$2 操作:- 替换分隔符: ; 正则表达式:__meta_kubernetes_service_label_(.+) 替换:$1 操作:labelmap - source_labels: [__meta_kubernetes_namespace] 分隔符: ; (.*) target_label: kubernetes_namespace 替换: $1 操作: 替换 - source_labels: [__meta_kubernetes_service_name] 分隔符: ; 正则表达式: (.*) target_label: kubernetes_name 替换: $1 操作: 替换

如果配置成功后,对应的目标将是:

IV 常见场景

1. 集群中每个节点的信息,然后按可用区或区域分类。

当使用k8s role:node收集集群中的节点数据时,可以通过“meta_domain_beta_kubernetes_io_zone”标签检索节点的区域。 。 该标签是在创建集群时分配给节点的。 标记 kubectl 描述节点。

然后您可以通过relabel_configs定义新值。

relabel_configs:- source_labels: ["meta_domain_beta_kubernetes_io_zone"] 正则表达式: "(.*)" 替换: $1 操作: 替换 target_label: "zone"

node{zone= “XX”}可以直接用于执行地理过滤。

2.可以根据功能(研发、运营、维护)对信息进行过滤和监控管理。

不同职能(开发、测试、运维、维护)的人可能只对部分监控数据感兴趣。 每个用户可以部署自己的Prometheus服务器来监控感兴趣的指标数据,但这是不必要的。 应过滤掉数据以避免浪费资源,并且可以以最相似的方式进行配置。

metric_relabel_configs : - 源标签:[__name__] 分隔符:; 正则表达式:etcd_(debugging|disk|request|server).* 替换:$1 操作:删除

操作:丢弃,即丢弃符合条件的指标,不收集。

3. 构建普罗米修斯s 联合集群。 管理每个IDC(区域)监控实例

如果您有多个区域,每个区域有很多节点或集群,则可以使用默认的联邦集群部署,每个区域都有自己的prometheus部署和收集服务器实例。 数据。 您所在地区的数据。 然后集成服务器收集所有区域数据,统一显示,并根据区域进行分类。

配置:

scrape_configs: - job_name: "federate" scrape_interval : 15s Honor_labels: truemetrics_path: "/federate" params: "match[]": - "{job="Prometheus"}" - "{__name__=~"job:.*"}" - "{__name__=~"node.*"}" static_configs: - 目标: - "192.168.77.11:9090" - "192.168.77.12:9090"

本文是关于容器监控实践的系列文章。 完整内容请参见container-monitor-book

未经允许不得转载:主机频道 » 容器监控实践-Prometheus配置与服务发现(Prometheus监控平台组件)

评论 抢沙发

评论前必须登录!