文章目录

  • 一 . prometheus介绍
  • prometheus简介:
  • prometheus系统架构图(组件)
  • prometheus工作流程:
  • 二. prometheus 安装方式
  • 1. 二进制方式安装
  • 配置文件详解
  • Prometheus热加载HUP
  • 1. 2容器----方式安装
  • 1.3 prometheus命令
  • 2. 安装 node_exporter
  • 2.2 node_exporter常用命令
  • 3. 给server加node节点
  • k8s集群中部署prometheus
  • 推荐(prometheus定义模块部署-详细)


一 . prometheus介绍

K8S 生态的组件都会提供/metric接口以提供自监控,这里列下我们正在使用的:

Prometheus容器的cpu使用率 prometheus 资源消耗_数据库


Prometheus 的局限

  • Prometheus 是基于 Metric 的监控,不适用于日志(Logs)、事件(Event)、调用链(Tracing)。
  • Prometheus 默认是 Pull 模型,合理规划你的网络,尽量不要转发。
  • 对于集群化和水平扩展,官方和社区都没有银弹,需要合理选择 Federate、Cortex、Thanos等方案。
  • 监控系统一般情况下可用性大于一致性,容忍部分副本数据丢失,保证查询请求成功。这个后面说 Thanos 去重的时候会提到。
  • Prometheus 不一定保证数据准确,这里的不准确一是指 rate、histogram_quantile 等函数会做统计和推断,产生一些反直觉的结果,这个后面会详细展开。二来查询范围过长要做降采样,势必会造成数据精度丢失,不过这是时序数据的特点,也是不同于日志系统的地方。

k8s的早期版本基于组件heapster实现对pod和node节点的监控功能,但是从k8s 1.8版本开始使用metrics API的方式监控,并在1.11版本 正式将heapster替换,后期的k8s监控主要是通过metrics Server提供核心监控指标,比如Node节点的CPU和内存使用率,其他的监控交由另外一个组件Prometheus 完成

prometheus简介:

官方文档
https://prometheus.io/docs/

Prometheus是基于go语言开发的一套开源的监控、报警和时间序列数据库的组合,是由SoundCloud公司开发的开源监控系统,Prometheus是CNCF(Cloud Native Computing Foundation,云原生计算基金会)继kubernetes 之后毕业的第二个项目,prometheus在容器和微服务领域中得到了广泛的应用,其特点主要如下:

Prometheus容器的cpu使用率 prometheus 资源消耗_Prometheus容器的cpu使用率_02

prometheus系统架构图(组件)

Exporter: 将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。

Alertmanager:是prometehus的告警处理中心, 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。

Grafana:监控仪表盘

pushgateway: 各个目标主机可上报数据到pushgatewy,然后prometheus server统一从pushgateway拉取数据

Prometheus容器的cpu使用率 prometheus 资源消耗_Prometheus容器的cpu使用率_03


Prometheus容器的cpu使用率 prometheus 资源消耗_Prometheus容器的cpu使用率_04


Prometheus容器的cpu使用率 prometheus 资源消耗_热加载_05

prometheus工作流程:

  1. Prometheus server可定期从活跃的(up)目标主机上(target)拉取监控指标数据,目标主机的监控数据可通过配置静态job或者服务发现的方式被prometheus server采集到,这种方式默认的pull方式拉取指标;也可通过pushgateway把采集的数据上报到prometheus server中;还可通过一些组件自带的exporter采集相应组件的数据;
  2. Prometheus server把采集到的监控指标数据保存到本地磁盘或者数据库;
  3. Prometheus采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的报警发送到alertmanager
  4. Alertmanager通过配置报警接收方,发送报警到邮件,微信或者钉钉等
  5. Prometheus 自带的web ui界面提供PromQL查询语言,可查询监控数据
  6. Grafana可接入prometheus数据源,把监控数据以图形化形式展示出

二. prometheus 安装方式

官方二进制下载及安装
https://prometheus.io/download/ prometheus server的监听端口为9090

资源规划
host1----安装server端
host2----安装node_Exporter端 采集主机运行数据

operator部署
https://github.com/coreos/kube-prometheus

Prometheus容器的cpu使用率 prometheus 资源消耗_Prometheus容器的cpu使用率_06

1. 二进制方式安装

创建prometheus用户
groupadd prometheus
useradd -g prometheus -m -d /var/lib/prometheus -s /sbin/nologin prometheus


pwd 
/usr/local/src 

tar xvf prometheus-2.11.1.linux-amd64.tar.gz 

ln -sv /usr/local/src/prometheus-2.11.1.linux-amd64 /usr/local/prometheus 

chown prometheus.prometheus -R /usr/local/prometheus
cd /usr/local/prometheus

创建prometheus启动脚本

$ vim /etc/systemd/system/prometheus.service
 
添加如下内容:
[Unit]
Description=prometheus
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --storage.tsdb.retention.time=10d --log.level=info
Restart=on-failure

[Install]
WantedBy=multi-user.target

–storage.tsdb.path 修改本地数据存储的路径
–log.level 日志等级
–storage.tsdb.retention.time 保存时间

启动prometheus服务

systemctl daemon-reload 
systemctl restart prometheus 
systemctl enable prometheus
kubectl port-forward --help 

kubectl --namespace monitoring port-forward --address 0.0.0.0 svc/prometheus-k8s 9090:9090

访问 http://192.168.31.150:9090/targets

Prometheus容器的cpu使用率 prometheus 资源消耗_Prometheus容器的cpu使用率_07

Prometheus容器的cpu使用率 prometheus 资源消耗_数据_08

kubectl --namespace monitoring port-forward --address 0.0.0.0 svc/grafana 3000:3000

Prometheus容器的cpu使用率 prometheus 资源消耗_数据_09


在运行时加载Prometheus的配置信息

romtheus的时序数据库在存储了大量的数据后,每次重启Prometheus进程的时间会越来越慢。 而在日常运维工作中会经常调整Prometheus的配置信息,实际上Prometheus提供了在运行时热加载配置信息的功能。

配置文件详解

Prometheus热加载HUP

Prometheus配置信息的热加载有两种方式:
第一种热加载方式:查看Prometheus的进程id,发送SIGHUP信号:

ps aux|grep prometheus

kill -HUP <pid>

第二种热加载方式:发送一个POST请求到/-/reload,需要在启动时给定–web.enable-lifecycle选项:

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

如果配置热加载成功,Prometheus会打印出下面的log:

... msg="Loading configuration file" filename=prometheus.yml ...

第一种热加载方式service文件

[Unit]
Description=prometheus
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/prometheus/prometheus \
 --config.file==/usr/local/prometheus/prometheus.yml \
 --storage.tsdb.path=/home/prometheus/data \
 --storage.tsdb.retention=365d \
 --web.listen-address=:9090 \
 --web.external-url=https://prometheus.frognew.com
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target

1. 2容器----方式安装

docker镜像直接启动
https://prometheus.io/docs/prometheus/latest/installation/

docker run -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

可以通过http://localhost:9090访问Prometheus的UI界面

1.3 prometheus命令

usage: prometheus [<flags>]

The Prometheus monitoring server

Flags:
  -h, --help                     查看命令帮助
      --version                  查看版本信息
      --config.file="prometheus.yml"  
                               	 Prometheus配置文件路径
      --web.listen-address="0.0.0.0:9090"  
                                 监听地址
      --web.read-timeout=5m      超时读取请求并关闭空闲连接之前的最大持续时间
      --web.max-connections=512  最大同时连接数
      --web.external-url=<URL>   可从外部访问Prometheus的URL,(例如,如果Prometheus是通过反向代理提供的)。
      							 用来生成返回到Prometheus本身的相对和绝对路径。如果该网址包含路径部分,它将是
                                 用于为Prometheus服务的所有HTTP端点添加前缀。 如果省略,将导出相关的URL组件
                                 自动。
      --web.route-prefix=<path>  Web端点内部路由的前缀。 默认为--web.external-url的路径。
      --web.user-assets=<path>   静态资源目录位于:/user.
      --web.enable-lifecycle     启用关机并通过HTTP请求重新加载.
      --web.enable-admin-api     为管理员控制操作启用API端点.
      --web.console.templates="consoles"  
                                 控制台模板目录的路径位于:/consoles.
      --web.console.libraries="console_libraries"  
                                 控制台库目录的路径.
      --web.page-title="Prometheus Time Series Collection and Processing Server"  
                                 Prometheus实例的文档标题.
      --web.cors.origin=".*"     用于CORS来源的正则表达式:'https?://(domain1|domain2)\.com'
      --storage.tsdb.path="data/"  
                                 指标存储的基本路径.
      --storage.tsdb.retention.time=STORAGE.TSDB.RETENTION.TIME  
                                 将样品保存多长时间。 设置此标志后,它将覆盖“ storage.tsdb.retention”。 如果未设置此标志,“ storage.tsdb.retention”或“ storage.tsdb.retention.size”,则保留时间默认为15d。 支持的单位:y,w,d,h,m,s,ms。
      --storage.tsdb.retention.size=STORAGE.TSDB.RETENTION.SIZE  
                                 EXPERIMENTAL]可以为块存储的最大字节数。 需要一个单位,受支持的单位:B,KB,MB,GB,TB,PB,EB。 例如:“ 512MB”。 该标志是试验性的,可以在将来的版本中进行更改。
      --storage.tsdb.no-lockfile  
                                 不要在数据目录中创建锁文件。
      --storage.tsdb.allow-overlapping-blocks  
                                 [EXPERIMENTAL]允许重叠的块,从而启用垂直压缩和垂直查询合并。
      --storage.tsdb.wal-compression  
                                 压缩tsdb WAL。
      --storage.remote.flush-deadline=<duration>  
                                 关闭或配置重新加载时等待冲洗样品的时间
      --storage.remote.read-sample-limit=5e7  
                                 在单个查询中要通过远程读取接口返回的最大样本总数。 0表示没有限制。 对于流式响应类型,将忽略此限制。
      --storage.remote.read-concurrent-limit=10  
                                 并发远程读取调用的最大数目。 0表示没有限制。
      --storage.remote.read-max-bytes-in-frame=1048576  
                                 编组之前用于流式传输远程读取响应类型的单个帧中的最大字节数。 请注意,客户端也可能会限制帧大小。 默认为protobuf建议的1MB。
      --rules.alert.for-outage-tolerance=1h  
                                 容忍普罗米修斯中断以恢复警报“ for”状态的最大时间。
      --rules.alert.for-grace-period=10m  
                                 警报和恢复的“ for”状态之间的最短持续时间。 仅对于配置的“ for”时间大于宽限期的警报,才保持此状态。
      --rules.alert.resend-delay=1m  
                                 重新发送警报到Alertmanager之前等待的最短时间
      --alertmanager.notification-queue-capacity=10000  
                                 等待的Alertmanager通知的队列容量。
      --alertmanager.timeout=10s  
                                 向Alertmanager发送警报的超时。
      --query.lookback-delta=5m  在表达式评估和联合期间用于检索指标的最大回溯持续时间。
      --query.timeout=2m         查询中止之前可能要花费的最长时间。
      --query.max-concurrency=20  
                                 并发执行的最大查询数。
      --query.max-samples=50000000  
                                 单个查询可以加载到内存中的最大样本数。 请注意,如果查询尝试将更多的样本加载到内存中,则查询将失败,因此这也限制了查询可以返回的样本数。
      --log.level=info           仅记录具有给定严重性或更高严重性的消息。 下列之一:[调试,信息,警告,错误]
      --log.format=logfmt        日志消息的输出格式。 下列之一:[logfmt,json]

2. 安装 node_exporter

被监控端

在Prometheus的架构设计中,Prometheus Server不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如主机的CPU使用率,我们需要使用到Exporter。Prometheus周期性的从Exporter暴露的HTTP服务地址(通常是/metrics)拉取监控样本数据.

Exporter可以是一个相对开放的概念,其可以是一个独立运行的程序独立于监控目标以外,也可以是直接内置在监控目标中。只要能够向Prometheus提供标准格式的监控样本数据即可。

在 Prometheus 本节点或者另一台节点上分别安装 node_exporter

收集各k8s node节点上的监控指标数据,监听端口为9100
useradd prometheus -s /sbin/nologin
tar xf node_exporter-1.0.1.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
ln -s /usr/local/node_exporter-1.0.1.linux-amd64/    /usr/local/node_exporter
chown -R prometheus:prometheus  /usr/local/node_exporter

创建 node_exporter 启动脚本

vim /etc/systemd/system/node_exporter.service
[Unit]
Description=node_export
Documentation=https://github.com/prometheus/node_exporter
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target

注意:node_exporter 的运行用户也是 prometheus 用户需要在每台节点上都创建该用户

启动node exporter服务

systemctl daemon-reload 
systemctl restart node-exporter 
systemctl enable node-exporter

ss -tnl | grep 9100

访问http://localhost:9100/
curl http://localhost:9100/

访问http://localhost:9100/metrics,可以看到当前node exporter获取到的当前主机的所有监控数据,如下所示

Prometheus容器的cpu使用率 prometheus 资源消耗_Prometheus容器的cpu使用率_10

每一个监控指标之前都会有一段类似于如下形式的信息

# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="idle"} 362812.7890625
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 3.0703125

Prometheus容器的cpu使用率 prometheus 资源消耗_数据库_11


查看监控图形

Prometheus容器的cpu使用率 prometheus 资源消耗_知识图谱_12

2.2 node_exporter常用命令

用法:node_exporter [<flags>]

标志:
  -h,--help显示上下文相关的帮助(也可以尝试--help-long和--help-man)。
      --collector.cpu.info启用指标cpu_info
      --collector.diskstats.ignored-devices =“ ^(ram | loop | fd |(h | s | v | xv)d [a-z] | nvme \\ d + n \\ d + p)\\ d + $”
                                设备的正则表达式,忽略diskstats。
      --collector.filesystem.ignored-mount-points =“ ^ /(dev | proc | sys | var / lib / docker /.+)($ | /)”
                                对于文件系统收集器,要忽略的安装点正则表达式。
      --collector.filesystem.ignored-fs-types =“ ^(autofs | binfmt_misc | bpf | cgroup2?| configfs | debugfs | devpts | devtmpfs | fusectl | hugetlbfs | iso9660 | mqueue | nsfs | overlay | proc | procfs | pstore | rpc_pipefs | securityfs | selinuxfs | squashfs | sysfs | tracefs)$“
                                文件系统收集器忽略的文件系统类型的正则表达式。
      --collector.netclass.ignored-devices =“ ^ $”
                                Netclass收集器忽略的网络设备的正则表达式。
      --collector.netdev.device-blacklist = COLLECTOR.NETDEV.DEVICE-BLACKLIST
                                净设备正则表达式到黑名单(相互排斥于设备白名单)。
      --collector.netdev.device-whitelist = COLLECTOR.NETDEV.DEVICE-WHITELIST
                                将网络设备的正则表达式添加到白名单(相互排斥于设备黑名单)。
      --collector.netstat.fields =“ ^(。* _(InErrors | InErrs)| Ip_Forwarding | Ip(6 | Ext)_(InOctets | OutOctets)| Icmp6?__(InMsgs | OutMsgs)| TcpExt_(Listen。* | Syncookies。* | TCPSynRetrans)| Tcp_(ActiveOpens | InSegs | OutSegs | PassiveOpens | RetransSegs | CurrEstab)| Udp6?_(InDatagrams | OutDatagrams | NoPorts | RcvbufErrors | SndbufErrors))$“
                                Regexp字段返回以返回netstat收集器。
      --collector.ntp.server =“ 127.0.0.1”
                                用于ntp收集器的NTP服务器
      --collector.ntp.protocol-version = 4
                                NTP协议版本
      --collector.ntp.server-is-local
                                确认collector.ntp.server地址不是公共ntp服务器
      --collector.ntp.ip-ttl = 1发送NTP查询时要使用的IP TTL
      --collector.ntp.max-distance = 3.46608s
                                到根的最大累积距离
      --collector.ntp.local-offset-tolerance = 1ms
                                本地时钟和本地ntpd时间之间的偏差可以容忍
      --path.procfs =“ / proc”挂载点。
      --path.sysfs =“ / sys” sysfs挂载点。
      --path.rootfs =“ /” rootfs安装点。
      --collector.perf.cpus =“”应该从中收集性能指标的CPU列表
      --collector.perf.tracepoint = COLLECTOR.PERF.TRACEPOINT ...
                                应收集的性能跟踪点
      --collector.powersupply.ignored-supplies =“ ^ $”
                                电源正则表达式对于powersupplyclass收集器将被忽略。
      --collector.qdisc.fixtures =“”
                                用于qdisc收集器端到端测试的测试夹具
      --collector.runit.servicedir =“ / etc / service”
                                Runit服务目录的路径。
      --collector.supervisord.url =“ http:// localhost:9001 / RPC2”
                                XML RPC端点。
      --collector.systemd.unit-whitelist =“。+”
                                将系统单位的正则表达式列入白名单。单元必须同时与白名单匹配,并且与黑名单不匹配。
      --collector.systemd.unit-blacklist =“。+ \\。(自动安装|设备|安装|范围|切片)”
                                将系统单位的正则表达式列入黑名单。单元必须同时与白名单匹配,并且与黑名单不匹配。
      --collector.systemd.enable-task-metrics
                                启用服务单元任务指标unit_tasks_current和unit_tasks_max
      --collector.systemd.enable-restarts-metrics
                                启用服务单位指标service_restart_total
      --collector.systemd.enable-start-time-metrics
                                启用服务单位指标unit_start_time_seconds
      --collector.textfile.directory =“”
                                用于读取带有度量标准的文本文件的目录。
      --collector.vmstat.fields =“ ^(oom_kill | pgpg | pswp | pg。* fault)。*”
                                用于vmstat收集器返回的字段的正则表达式。
      --collector.wifi.fixtures =“”
                                测试装置以用于wifi收集器指标
      --collector.arp启用arp收集器(默认值:启用)。
      --collector.bcache启用bcache收集器(默认值:启用)。
      --collector.bonding启用绑定收集器(默认值:启用)。
      --collector.btrfs启用btrfs收集器(默认值:启用)。
      --collector.buddyinfo启用buddyinfo收集器(默认值:禁用)
--collector.conntrack启用conntrack收集器(默认值:启用)。
      --collector.cpu启用cpu收集器(默认值:启用)。
      --collector.cpufreq启用cpufreq收集器(默认值:启用)。
      --collector.diskstats启用diskstats收集器(默认值:启用)。
      --collector.drbd启用drbd收集器(默认值:禁用)。
      --collector.edac启用edac收集器(默认值:启用)。
      --collector.entropy启用熵收集器(默认值:启用)。
      --collector.filefd启用filefd收集器(默认值:启用)。
      --collector.filesystem启用文件系统收集器(默认值:启用)。
      --collector.hwmon启用hwmon收集器(默认值:启用)。
      --collector.infiniband启用infiniband收集器(默认值:启用)。
      --collector.interrupts启用中断收集器(默认值:禁用)。
      --collector.ipvs启用ipvs收集器(默认值:启用)。
      --collector.ksmd启用ksmd收集器(默认值:禁用)。
      --collector.loadavg启用loadavg收集器(默认值:启用)。
      --collector.logind启用登录的收集器(默认值:禁用)。
      --collector.mdadm启用mdadm收集器(默认值:启用)。
      --collector.meminfo启用meminfo收集器(默认值:启用)。
      --collector.meminfo_numa启用meminfo_numa收集器(默认值:禁用)。
      --collector.mountstats启用mountstats收集器(默认值:禁用)。
      --collector.netclass启用netclass收集器(默认值:启用)。
      --collector.netdev启用netdev收集器(默认值:启用)。
      --collector.netstat启用netstat收集器(默认值:启用)。
      --collector.nfs启用nfs收集器(默认值:启用)。
      --collector.nfsd启用nfsd收集器(默认值:启用)。
      --collector.ntp启用ntp收集器(默认值:禁用)。
      --collector.perf启用性能收集器(默认值:禁用)。
      --collector.powersupplyclass
                                启用powersupplyclass收集器(默认值:启用)。
      --collector.pressure启用压力收集器(默认值:启用)。
      --collector.processes启用进程收集器(默认值:禁用)。
      --collector.qdisc启用qdisc收集器(默认值:禁用)。
      --collector.rapl启用rapl收集器(默认值:启用)。
      --collector.runit启用runit收集器(默认值:禁用)。
      --collector.schedstat启用schedstat收集器(默认值:启用)。
      --collector.sockstat启用sockstat收集器(默认值:启用)。
      --collector.softnet启用softnet收集器(默认值:启用)。
      --collector.stat启用统计信息收集器(默认值:启用)。
      --collector.supervisord启用受监管的收集器(默认值:禁用)。
      --collector.systemd启用systemd收集器(默认值:禁用)。
      --collector.tcpstat启用tcpstat收集器(默认值:禁用)。
      --collector.textfile启用文本文件收集器(默认值:启用)。
      --collector.thermal_zone启用thermal_zone收集器(默认值:启用)。
      --collector.time启用时间收集器(默认值:启用)。
      --collector.timex启用timex收集器(默认值:启用)。
      --collector.udp_queues启用udp_queues收集器(默认值:启用)。
      --collector.uname启用uname收集器(默认值:启用)。
      --collector.vmstat启用vmstat收集器(默认值:启用)。
      --collector.wifi启用wifi收集器(默认值:禁用)。
      --collector.xfs启用xfs收集器(默认值:启用)。
      --collector.zfs启用zfs收集器(默认值:启用)。
      --web.listen-address =“:9100”
                                公开指标和Web界面的地址。
      --web.telemetry-path =“ / metrics”
                                公开指标的路径。
      --web.disable-exporter-metrics
                                排除有关导出器本身的指标(promhttp _ *,process _ *,go_ *)。
      --web.max-requests = 40并行抓取请求的最大数量。使用0禁用。
      --collector.disable-defaults
                                将所有收集器默认设置为禁用。
      --web.config =“” [EXPERIMENTAL]可以启用TLS或身份验证的配置yaml文件的路径。
      --log.level = info仅记录具有给定严重性或更高严重性的消息。下列之一:[调试,信息,警告,错误]
      --log.format = logfmt日志消息的输出格式。下列之一:[logfmt,json]
      --version 查看版本信息

3. 给server加node节点

登录到prometheus服务器,备份配置文件

cd /data/prometheus

cat prometheus.yml.bak|grep -v '^#'|grep -v '^  #'|grep -v '^    #' > prometheus.yml

增加job_name
名字为:node_exporter

cd /usr/local/prometheus

vim prometheus.yml 
scrape_configs:
      # 搜集node exporter监控数据
  - job_name: 'prometheus'
   			 # 对本机node_exporter 监控
    static_configs:
    - targets: ['localhost:9090','localhost:9100'] 

#举例新添加的对其它node节点抓取数据
  - job_name: 'node1'
    #重写了全局抓取间隔时间,由15秒重写成5秒。
    scrape_interval: 5s
    static_configs:
    - targets: ['192.168.5.111:9100']

重启promethues

systemctl restart prometheus

访问 Prometheus WEB 查看我们定义的目标主机:http://Prometheus:9090/targets 确保状态UP

Prometheus容器的cpu使用率 prometheus 资源消耗_数据库_13

“1”表示正常,反之“0”则为异常

Prometheus容器的cpu使用率 prometheus 资源消耗_热加载_14

k8s集群中部署prometheus

  1. 创建namespace、sa账号,在k8s集群的master节点操作

#创建一个monitor-sa的名称空间

kubectl create ns monitor-sa

#创建一个sa账号

kubectl create serviceaccount monitor -n monitor-sa

#把sa账号monitor通过clusterrolebing绑定到clusterrole上

kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster-admin  --serviceaccount=monitor-sa:monitor
  1. 创建数据目录

#在k8s集群的任何一个node节点操作,因为我的k8s集群只有一个node节点node1,所以我在node1上操作如下命令:

mkdir /data
chmod 777 /data/
  1. 安装prometheus,以下步骤均在在k8s集群的master1节点操作

1)创建一个configmap存储卷,用来存放prometheus配置信息prometheus-cfg.yaml

---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: monitor-sa
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

注意:通过上面命令生成的promtheus-cfg.yaml文件会有一些问题,$1和$2这种变量在文件里没有,需要在k8s的master1节点打开promtheus-cfg.yaml文件,手动把$1和$2这种变量写进文件里,promtheus-cfg.yaml文件需要手动修改部分如下

22行的replacement: ':9100'变成replacement: '${1}:9100'
42行的replacement: /api/v1/nodes//proxy/metrics/cadvisor变成
              replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
73行的replacement:  变成replacement: $1:$2

更新configmap

kubectl apply  -f  prometheus-cfg.yaml

2)通过deployment部署prometheus

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: monitor-sa
  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: monitor
      containers:
      - name: prometheus
        image: prom/prometheus:v2.2.1
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus
          - --storage.tsdb.retention=720h
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: prometheus-config
          subPath: prometheus.yml
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
           path: /data
           type: Directory

注意:在上面的prometheus-deploy.yaml文件有个nodeName字段,这个就是用来指定创建的这个prometheus的pod调度到哪个节点上,我们这里让nodeName=node1,也即是让pod调度到node1节点上,因为node1节点我们创建了数据目录/data,所以大家记住:你在k8s集群的哪个节点创建/data,就让pod调度到哪个节点。

更新prometheus

kubectl apply -f prometheus-deploy.yaml
kubectl get pods -n monitor-sa

3) 给prometheus pod创建一个service

---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: monitor-sa
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      protocol: TCP
  selector:
    app: prometheus
    component: server

更新service

kubectl  apply -f prometheus-svc.yaml

#查看service在物理机映射的端口

kubectl get svc -n monitor-sa

访问prometheus web ui界面

http://192.168.0.6:31043/graph

推荐(prometheus定义模块部署-详细)