介绍
Prometheus是一个基于Metrics的监控系统 ,与Kubernetes同属CNCF(Cloud Native Computing Foundation),它已经成为炙手可热的Kubernetes生态圈中的核心监控系统,越来越多的项目(如Kubernetes和etcd等 )都加入了丰富的Prom原生支持,从侧面体现了社区对它的认可。 Prometheus 2.0带来了许多变化和改进,例如新的时间序列数据库,更好的资源使用,新的警报配置格式以及更好的Alertmanager发现。
在本教程中,您将把现有的Prometheus 1.x升级到Prometheus 2.0。Prometheus2.0中的新时间序列数据库tsdb
与Prometheus 1.x不兼容,这意味着您无法使用Prometheus 2从Prometheus 1.x实例中读取数据。为了解决这个问题,本文将会将Prometheus 1.x配置为只读数据存储,以使旧数据可用。
Prometheus 2使用新的警报规则,因此您将使用Alertmanager吧现有的警报规则更新为新格式。本教程仅介绍最重要的更改。在升级到最新版本之前,您应该阅读Announcing Prometheus 2.0以确保您不受任何其他更改的影响。
要学习本教程,您需要:
prometheus -version
命令查看您的Prometheus版本。输出包含您的Prometheus版本以及构建信息。本教程假设:
/etc/prometheus
。/var/lib/prometheus
。/usr/local/bin
。要使用Prometheus 2.0访问旧数据,您需要将当前的Prometheus升级到1.8.2
版本,然后使用remote_read
功能从旧版本中读取Prometheus设置。
使用prometheus -version
命令,查看当前的Prometheus版本。输出包含版本和构建信息。如果您已经在运行1.8.2
版本,请跳过此步骤。
prometheus -version
prometheus, version 1.7.1 (branch: master, revision: 3afb3fffa3a29c3de865e1172fb740442e9d0133)
build user: root@0aa1b7fc430d
build date: 20170612-11:44:05
go version: go1.8.3
首先停止prometheus以便你可以替换它的文件:
sudo systemctl stop prometheus
您可以在项目的GitHub页面上找到Prometheus的1.8.2版本及MO5校验码。你需要一个名为prometheus-1.8.2.linux-amd64.tar.gz
的文件。使用curl命令,将Prometheus的存档、校验码下载到您的目录:
cd ~
curl -LO https://github.com/prometheus/prometheus/releases/download/v1.8.2/prometheus-1.8.2.linux-amd64.tar.gz
curl -LO https://github.com/prometheus/prometheus/releases/download/v1.8.2/sha256sums.txt
要确保您的存档未损坏,请使用sha256sum
命令为存档生成校验码,并将其与sha256sums.txt文件进行比较。
sha256sum -c sha256sums.txt 2>&1 | grep OK
prometheus-1.8.2.linux-amd64.tar.gz: OK
如果未在输出中看到OK
,请删除下载的存档并返回上述步骤以再次下载。
解压缩安装包。
tar xvf prometheus-1.8.2.linux-amd64.tar.gz
复制prometheus
和promtool
可执行文件到/usr/local/bin
目录。
sudo cp prometheus-1.8.2.linux-amd64/prometheus /usr/local/bin
sudo cp prometheus-1.8.2.linux-amd64/promtool /usr/local/bin
将文件的用户组所有权设置为prometheus用户。
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
启动Prometheus以确保它按预期工作。
sudo systemctl start prometheus
最后,检查服务的状态。
sudo systemctl status prometheus
您将看到以下输出:
● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 21:44:52 UTC; 2s ago
Main PID: 1646 (prometheus)
Tasks: 6
Memory: 17.7M
CPU: 333ms
CGroup: /system.slice/prometheus.service
└─1646 /usr/local/bin/prometheus -config.file /etc/prometheus/prometheus.yml -storage.local.path /var/lib/prometheus/
...
如果服务状态不是active,请按照屏幕上的日志回溯前面的步骤以解决问题,然后再继续学习本教程。
验证Prometheus版本以确保您正在运行1.8.2版本。
prometheus -version
prometheus, version 1.8.2 (branch: HEAD, revision: 5211b96d4d1291c3dd1a569f711d3b301b635ecb)
build user: root@1412e937e4ad
build date: 20171104-16:09:14
go version: go1.9.2
如果您没有看到version 1.8.2
,请确保您已下载正确的文件并重复本节中的步骤。最后,删除您下载的文件,因为您不再需要它们。
rm -rf prometheus-1.8.2.linux-amd64.tar.gz prometheus-1.8.2.linux-amd64
接下来,您将重新配置现有的安装,以便之后不会干扰Prometheus 2.0。
我们希望保留Prometheus 1.8.2,以便我们可以访问旧数据,但我们需要确保在安装时旧安装不会干扰Prometheus 2.0。为此,我们将附加1
到所有与Prometheus相关的目录和可执行文件的名称。例如,prometheus
可执行文件将成为prometheus1
。我们还将更新服务定义并将其设置为在不同的端口上运行。
停止Prometheus,以便重命名文件和目录。
sudo systemctl stop prometheus
在/usr/local/bin
目录中,您将找到两个Prometheus可执行文件 -prometheus
和promtool
。将这些重命名为prometheus1
和promtool1
:
sudo mv /usr/local/bin/prometheus /usr/local/bin/prometheus1
sudo mv /usr/local/bin/promtool /usr/local/bin/promtool1
Prometheus有两个相关的目录:/etc/prometheus
用于存储配置文件,/var/lib/prometheus
用于存储数据。重命名这些目录。
sudo mv /etc/prometheus /etc/prometheus1
sudo mv /var/lib/prometheus /var/lib/prometheus1
我们将Prometheus 1.8.2作为只读数据存储,因此我们不需要它来从出口那里收集任何数据。为确保这一点,我们将使用truncate命令配置文件中删除所有内容。在删除文件内容之前,请创建该文件的备份,以便稍后可以使用它来配置Prometheus 2.0。
sudo cp /etc/prometheus1/prometheus.yml /etc/prometheus1/prometheus.yml.bak
然后用truncate
清空配置文件的内容。
sudo truncate -s 0 /etc/prometheus1/prometheus.yml
接下来,将服务文件prometheus
重命名为prometheus1
。
sudo mv /etc/systemd/system/prometheus.service /etc/systemd/system/prometheus1.service
在文本编辑器中打开Prometheus服务文件。
sudo nano /etc/systemd/system/prometheus1.service
您将在默认端口9090
上运行Prometheus 2.0,因此将Prometheus 1.8.2的端口更改为端口9089
。使用ExecStart替换以下配置:
...
ExecStart=/usr/local/bin/prometheus1 \
-config.file /etc/prometheus1/prometheus.yml \
-storage.local.path /var/lib/prometheus1/ \
-web.listen-address ":9089"
...
保存文件并关闭文本编辑器。重新加载systemd
以应用更改。
sudo systemctl daemon-reload
启动prometheus1
服务。
sudo systemctl start prometheus1
要确保它按预期工作,请检查服务的状态。
sudo systemctl status prometheus1
与以前一样,输出包含有关进程的信息,例如PID,状态等:
● prometheus1.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus1.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 21:46:42 UTC; 3s ago
Main PID: 1718 (prometheus1)
Tasks: 6
Memory: 35.7M
CPU: 223ms
CGroup: /system.slice/prometheus1.service
└─1718 /usr/local/bin/prometheus1 -config.file /etc/prometheus1/prometheus.yml -storage.local.path /var/lib/prometheus1/
...
如果服务状态不是active
,请按照屏幕上的日志回溯前面的步骤以解决问题,然后再继续学习本教程。
启用该服务以确保它在系统引导时启动。
sudo systemctl enable prometheus1
prometheus 1.8.2不会删除任何输出。一旦我们设置了Prometheus 2.0,这将确保数据的一致性,Prometheus 2.0将使用当前安装作为旧数据的只读数据存储。在下一步中,我们将安装Prometheus 2.0并使用Prometheus 1.8.2访问我们的旧数据。
在此步骤中,我们将配置Prometheus 2.0以使用输出,并将Prometheus 1.8.2用作只读数据存储,以便我们可以访问现有数据。在继续本教程之前,安装Prometheus 2 。
安装Prometheus后,请创建新的配置文件。配置文件格式未更改,因此您可以将Prometheus 1.x配置文件与Prometheus 2一起使用。将您在上一步中创建的现有Prometheus配置的备份复制到/etc/prometheus/
目录中。
sudo cp /etc/prometheus1/prometheus.yml.bak /etc/prometheus/prometheus.yml
将新创建的配置文件的用户和组所有权设置为prometheus用户。
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
您对此文件的唯一更改是告诉Prometheus 2.0将Prometheus 1.8.2用作只读数据存储,以便您可以访问旧数据。在文本编辑器中打开配置文件。
sudo nano /etc/prometheus/prometheus.yml
在配置文件的末尾,添加remote_read
从远程Prometheus实例读取的指令。告诉它从localhst:9089
读取您Prometheus 1.8.2实例:
Prometheus configuration file - /etc/prometheus/prometheus.yml
...
remote_read:
- url: http://localhost:9089/api/v1/read
完成后,保存文件并关闭文本编辑器。
在首次运行Prometheus 2.0之前,我们将更新警报规则并将Alertmanager配置为与Prometheus一起使用。如果您不使用警报规则或Alertmanager,请跳过下一步。
Prometheus 1.x警报规则是使用自定义语法定义的。从2.0版开始,您可以使用YAML定义警报规则。为了简化迁移,Prometheus的promtool
命令可以将旧规则文件转换为新格式。如果您不使用警报规则,则可以跳过此步骤。
首先,将/etc/prometheus1
目录中的所有规则复制到/etc/prometheus
目录中。
sudo cp /etc/prometheus1/*.rules /etc/prometheus/
此外,promtool
通过运行以下命令确保您的版本为2.0:
promtool --version
输出包含promtool
版本和构建信息。
promtool, version 2.0.0 (branch: HEAD, revision: 0a74f98628a0463dddc90528220c94de5032d1a0)
build user: root@615b82cb36b6
build date: 20171108-07:11:59
go version: go1.9.2
如果版本不是2.0,请确保将promtool
可执行文件复制到正确的位置。
现在,导航到该/etc/prometheus
目录。
cd /etc/prometheus
对目录中的每个.rules
文件运行promtool
命令:
sudo promtool update rules file-name.rules
这将从提供的文件中生成一个名为ile-name.rules.yml
的新文件。如果您在屏幕上看到任何错误消息,请在继续本教程之前按照屏幕上的日志解决问题。
确保使用promtool
在创建的文件上正确设置用户和组所有权。
sudo chown prometheus:prometheus file-name.rules
最后,更新Prometheus配置文件以使用新创建的规则文件。在编辑器中打开配置文件。
sudo nano /etc/prometheus/prometheus.yml
将.yml
后缀附加到rule_files
指令下,如下所示:
...
rule_files:
- alert1.rules.yml
- alert2.rules.yml
...
保存文件并退出编辑器。现在删除旧的警报规则文件。
sudo rm alert1.rules alert2.rules
接下来,让我们配置Prometheus来发现Alertmanager,-alertmanager.url
命令不再存在。相反,Prometheus2.0引入了Alertmanager Service Discovery,它带来了许多新功能,并与Kubernetes等服务更好地集成。如果您不使用Alertmanager,请跳过此步骤的其余部分。
再次在编辑器中打开文件prometheus.yml
:
sudo nano /etc/prometheus/prometheus.yml
以下alerting
指令指示Prometheus使用在腾讯云CVM9093
端口上运行的Alertmanager。您可以在文件中的任何位置添加以下内容:
global:
...
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
...
保存文件并关闭文本编辑器。
Prometheus现在能够使用警报规则并与Alertmanager进行通信,我们已准备好第一次运行它。
为了能够将Prometheus 2.0作为服务运行,我们需要创建一个新的服务文件。我们可以从我们用于Prometheus 1.8.2的服务文件开始,因为除了ExecStart命令之外它们几乎是相同的。
通过复制现有服务文件来创建新的服务文件:
sudo cp /etc/systemd/system/prometheus1.service /etc/systemd/system/prometheus.service
在编辑器中打开新创建的服务文件:
sudo nano /etc/systemd/system/prometheus.service
Prometheus 2.0在标志系统中带来了几个重要的变化,包括:
--
)而不是单破折号作为前缀。-storage.local
和-storage.remote
标志已被删除并替换为--storage.tsdb
标志。-alertmanager.url
已被移除,并用Alertmanager服务发现,被上一步骤所取代。将ExecStart
指令替换为以下指令:
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
--config.file
指令指示Prometheus使用prometheus.yml
目录中的/etc/prometheus
文件。我们将使用--storage.tsdb.path
来替代--storage.local.path
。此外,我们添加了两个--web
标志,因此我们可以访问内置的Web模板。
完成后,保存文件并关闭文本编辑器。
最后,重新加载systemd,以便您可以使用新创建的服务。
sudo systemctl daemon-reload
然后启动Prometheus:
sudo systemctl start prometheus
检查服务的状态以确保其按预期工作。
sudo systemctl status prometheus
● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 20:15:09 UTC; 1h 20min ago
Main PID: 1947 (prometheus)
Tasks: 7
Memory: 54.3M
CPU: 15.626s
CGroup: /system.slice/prometheus.service
└─1947 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/
...
如果服务状态不是active
,请按照屏幕上的日志并回溯前面的步骤以解决问题,然后再继续学习本教程。
在系统启动时启用它:
sudo systemctl enable prometheus
您可以通过导航到http://your_server_ip
并使用安装Prometheus时配置的凭据进行身份验证来访问Prometheus的Web UI 。您将在下一步中使用Web UI以确保Prometheus按预期工作。
让我们确保Prometheus 2按预期抓取所有的出口,并确保它可以访问先前安装的Prometheus中的数据。
使用浏览器访问http://your_server_ip
以访问Prometheus Web UI。系统会要求您输入最初安装Prometheus时配置的用户名和密码。
输入凭据后,您将看到“ 图形”页面,您可以在其中执行和可视化查询:
在执行查询之前,让我们检查Prometheus的版本和导出器状态。单击导航栏中的“状态”链接,然后单击“运行时和构建信息”按钮。您将看到包含有关Prometheus服务器信息的页面。
接下来,再次单击“ 状态”链接,然后单击“目标”按钮以检查导出器是否按预期运行。该网页包含有关您的导出程序的详细信息,包括它们是否已启动并正在运行。
如果您看到任何错误,请确保在继续本教程之前按照屏幕上的说明进行解决。
您将看不到Prometheus 1.8.2数据源,因为它用作数据存储而不是导出器。因此,我们需要确保可以访问旧数据和新数据。单击Graph按钮。
在“表达式”字段中,键入node_memory_MemAvailable/1024/1024
以获取服务器的可用内存(以兆字节为单位)。单击“执行”按钮。
您将看到屏幕上显示的结果:
单击Graph选项卡可以随时查看可用内存。在图表上,您应该看到以前的数据和最新数据。
如果您没有看到旧数据,请通过检查其服务状态来确保Prometheus 1.8.2已启动,并且您已将Prometheus 2.0配置为将其用作远程数据库。
您已验证Prometheus正在运行并能够正确显示数据。现在让我们来看看如何在不再使用Prometheus 1.8.2和旧数据的情况下将其删除。
您可能想要删除Prometheus 1.8.2和旧数据。请按照以下步骤清理所有内容。
警告:这是不可逆转的操作!删除旧数据后,除非您备份过,否则永远无法恢复。
首先,从Prometheus 2配置文件中删除remote_read
指令。在编辑器中打开Prometheus 2.0配置文件:
sudo nano /etc/prometheus/prometheus.yml
找到并删除remote_read
:
remote_read:
- url: http://localhost:9089/api/v1/read
保存文件并关闭文本编辑器。重新启动Prometheus以应用更改。
sudo systemctl restart prometheus
确保服务正常运行:
sudo systemctl status prometheus
● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 20:15:09 UTC; 1h 20min ago
Main PID: 1947 (prometheus)
Tasks: 7
Memory: 54.3M
CPU: 15.626s
CGroup: /system.slice/prometheus.service
└─1947 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/
...
如果服务状态不是active
,请按照屏幕上的日志并回溯前面的步骤以解决问题,然后再继续学习本教程。
接下来,禁用并删除prometheus1
服务,然后清理所有Prometheus 1.8.2相关目录和文件。
禁用该服务以确保它不会自动启动:
sudo systemctl disable prometheus1
然后停止服务:
sudo systemctl stop prometheus1
没有输出表明操作成功完成。
现在删除prometheus1
服务文件:
sudo rm /etc/systemd/system/prometheus1.service
最后,删除不再需要的文件。首先,删除/usr/local/bin
目录中的prometheus1
和promtool1
可执行文件。
sudo rm /usr/local/bin/prometheus1 /usr/local/bin/promtool1
然后删除用于存储数据和配置的/etc/prometheus1
和/var/lib/prometheus1
目录。
sudo rm -r /etc/prometheus1 /var/lib/prometheus1
Prometheus 1.8.2现已从您的系统中删除,您的旧数据已销毁。
在本教程中,您学会了如何从Prometheus 1.x升级到Prometheus 2.0,更新了所有规则文件,并配置了Prometheus的Alertmanager服务发现。通过阅读官方的Prometheus 2.0更新帖子和项目更新日志了解有关Prometheus 2.0所包含的所有更改的更多信息。我们更推荐您使用专业的容器实例服务 CIS,体验便捷、安全、经济、灵活、兼容 Kubernetes 的全托管容器服务 。使用 CIS 可以极大降低您部署容器的门槛,降低您执行 batch 型任务或处理业务突增的成本。
参考文献:《How To Upgrade Prometheus 1.x to Prometheus 2.0 On Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。