前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Prometheus升级指南

Prometheus升级指南

原创
作者头像
圣人惠好可爱
发布2018-07-31 11:30:52
6.1K0
发布2018-07-31 11:30:52
举报

介绍

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以确保您不受任何其他更改的影响。

准备

要学习本教程,您需要:

  • 你应该先购买一台服Ubuntu服务器,我建议您使用腾讯云免费开发者专属在线实验平台进行试验。
  • 需要Prometheus 1.x安装在您的服务器上,包括Prometheus Web UI。您可以通过运行prometheus -version命令查看您的Prometheus版本。输出包含您的Prometheus版本以及构建信息。

本教程假设:

  • 您已经创建了一个 prometheus用户。
  • 您已创建了保存Prometheus配置文件的目录/etc/prometheus
  • 您已创建保存Prometheus数据的目录/var/lib/prometheus
  • 在prometheus和promtool可执行文件位于/usr/local/bin
  • 您已将Prometheus配置为作为系统服务运行。

第1步 - 将Prometheus升级到1.8.2

要使用Prometheus 2.0访问旧数据,您需要将当前的Prometheus升级到1.8.2版本,然后使用remote_read功能从旧版本中读取Prometheus设置。

使用prometheus -version命令,查看当前的Prometheus版本。输出包含版本和构建信息。如果您已经在运行1.8.2版本,请跳过此步骤。

代码语言:javascript
复制
prometheus -version
代码语言:javascript
复制
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以便你可以替换它的文件:

代码语言:javascript
复制
sudo systemctl stop prometheus

您可以在项目的GitHub页面上找到Prometheus的1.8.2版本及MO5校验码。你需要一个名为prometheus-1.8.2.linux-amd64.tar.gz的文件。使用curl命令,将Prometheus的存档、校验码下载到您的目录:

代码语言:javascript
复制
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文件进行比较。

代码语言:javascript
复制
sha256sum -c sha256sums.txt 2>&1 | grep OK
代码语言:javascript
复制
prometheus-1.8.2.linux-amd64.tar.gz: OK

如果未在输出中看到OK,请删除下载的存档并返回上述步骤以再次下载。

解压缩安装包。

代码语言:javascript
复制
tar xvf prometheus-1.8.2.linux-amd64.tar.gz

复制prometheuspromtool可执行文件到/usr/local/bin目录。

代码语言:javascript
复制
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用户。

代码语言:javascript
复制
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

启动Prometheus以确保它按预期工作。

代码语言:javascript
复制
sudo systemctl start prometheus

最后,检查服务的状态。

代码语言:javascript
复制
sudo systemctl status prometheus

您将看到以下输出:

代码语言:javascript
复制
● 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版本。

代码语言:javascript
复制
prometheus -version
代码语言:javascript
复制
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,请确保您已下载正确的文件并重复本节中的步骤。最后,删除您下载的文件,因为您不再需要它们。

代码语言:javascript
复制
rm -rf prometheus-1.8.2.linux-amd64.tar.gz prometheus-1.8.2.linux-amd64

接下来,您将重新配置现有的安装,以便之后不会干扰Prometheus 2.0。

第2步 - 将Prometheus 1.8.2配置为单独的服务

我们希望保留Prometheus 1.8.2,以便我们可以访问旧数据,但我们需要确保在安装时旧安装不会干扰Prometheus 2.0。为此,我们将附加1到所有与Prometheus相关的目录和可执行文件的名称。例如,prometheus可执行文件将成为prometheus1。我们还将更新服务定义并将其设置为在不同的端口上运行。

停止Prometheus,以便重命名文件和目录。

代码语言:javascript
复制
sudo systemctl stop prometheus

/usr/local/bin目录中,您将找到两个Prometheus可执行文件 -prometheuspromtool。将这些重命名为prometheus1promtool1

代码语言:javascript
复制
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用于存储数据。重命名这些目录。

代码语言:javascript
复制
sudo mv /etc/prometheus /etc/prometheus1
sudo mv /var/lib/prometheus /var/lib/prometheus1

我们将Prometheus 1.8.2作为只读数据存储,因此我们不需要它来从出口那里收集任何数据。为确保这一点,我们将使用truncate命令配置文件中删除所有内容。在删除文件内容之前,请创建该文件的备份,以便稍后可以使用它来配置Prometheus 2.0。

代码语言:javascript
复制
sudo cp /etc/prometheus1/prometheus.yml /etc/prometheus1/prometheus.yml.bak

然后用truncate清空配置文件的内容。

代码语言:javascript
复制
sudo truncate -s 0 /etc/prometheus1/prometheus.yml

接下来,将服务文件prometheus重命名为prometheus1

代码语言:javascript
复制
sudo mv /etc/systemd/system/prometheus.service /etc/systemd/system/prometheus1.service

在文本编辑器中打开Prometheus服务文件。

代码语言:javascript
复制
sudo nano /etc/systemd/system/prometheus1.service

您将在默认端口9090上运行Prometheus 2.0,因此将Prometheus 1.8.2的端口更改为端口9089。使用ExecStart替换以下配置:

代码语言:javascript
复制
...
ExecStart=/usr/local/bin/prometheus1 \
    -config.file /etc/prometheus1/prometheus.yml \
    -storage.local.path /var/lib/prometheus1/ \
    -web.listen-address ":9089"
...

保存文件并关闭文本编辑器。重新加载systemd以应用更改。

代码语言:javascript
复制
sudo systemctl daemon-reload

启动prometheus1服务。

代码语言:javascript
复制
sudo systemctl start prometheus1

要确保它按预期工作,请检查服务的状态。

代码语言:javascript
复制
sudo systemctl status prometheus1

与以前一样,输出包含有关进程的信息,例如PID,状态等:

代码语言:javascript
复制
● 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,请按照屏幕上的日志回溯前面的步骤以解决问题,然后再继续学习本教程。

启用该服务以确保它在系统引导时启动。

代码语言:javascript
复制
sudo systemctl enable prometheus1

prometheus 1.8.2不会删除任何输出。一旦我们设置了Prometheus 2.0,这将确保数据的一致性,Prometheus 2.0将使用当前安装作为旧数据的只读数据存储。在下一步中,我们将安装Prometheus 2.0并使用Prometheus 1.8.2访问我们的旧数据。

第3步 - 配置Prometheus 2.0

在此步骤中,我们将配置Prometheus 2.0以使用输出,并将Prometheus 1.8.2用作只读数据存储,以便我们可以访问现有数据。在继续本教程之前,安装Prometheus 2 。

安装Prometheus后,请创建新的配置文件。配置文件格式未更改,因此您可以将Prometheus 1.x配置文件与Prometheus 2一起使用。将您在上一步中创建的现有Prometheus配置的备份复制到/etc/prometheus/目录中。

代码语言:javascript
复制
sudo cp /etc/prometheus1/prometheus.yml.bak /etc/prometheus/prometheus.yml

将新创建的配置文件的用户和组所有权设置为prometheus用户。

代码语言:javascript
复制
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml

您对此文件的唯一更改是告诉Prometheus 2.0将Prometheus 1.8.2用作只读数据存储,以便您可以访问旧数据。在文本编辑器中打开配置文件。

代码语言:javascript
复制
sudo nano /etc/prometheus/prometheus.yml

在配置文件的末尾,添加remote_read从远程Prometheus实例读取的指令。告诉它从localhst:9089读取您Prometheus 1.8.2实例:

代码语言:javascript
复制
Prometheus configuration file - /etc/prometheus/prometheus.yml
...
​
remote_read:
    - url: http://localhost:9089/api/v1/read

完成后,保存文件并关闭文本编辑器。

在首次运行Prometheus 2.0之前,我们将更新警报规则并将Alertmanager配置为与Prometheus一起使用。如果您不使用警报规则或Alertmanager,请跳过下一步。

第4步 - 配置警报(可选)

Prometheus 1.x警报规则是使用自定义语法定义的。从2.0版开始,您可以使用YAML定义警报规则。为了简化迁移,Prometheus的promtool命令可以将旧规则文件转换为新格式。如果您不使用警报规则,则可以跳过此步骤。

首先,将/etc/prometheus1目录中的所有规则复制到/etc/prometheus目录中。

代码语言:javascript
复制
sudo cp /etc/prometheus1/*.rules /etc/prometheus/

此外,promtool通过运行以下命令确保您的版本为2.0:

代码语言:javascript
复制
promtool --version

输出包含promtool版本和构建信息。

代码语言:javascript
复制
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目录。

代码语言:javascript
复制
cd /etc/prometheus

对目录中的每个.rules文件运行promtool命令:

代码语言:javascript
复制
sudo promtool update rules file-name.rules

这将从提供的文件中生成一个名为ile-name.rules.yml的新文件。如果您在屏幕上看到任何错误消息,请在继续本教程之前按照屏幕上的日志解决问题。

确保使用promtool在创建的文件上正确设置用户和组所有权。

代码语言:javascript
复制
sudo chown prometheus:prometheus file-name.rules

最后,更新Prometheus配置文件以使用新创建的规则文件。在编辑器中打开配置文件。

代码语言:javascript
复制
sudo nano /etc/prometheus/prometheus.yml

.yml后缀附加到rule_files指令下,如下所示:

代码语言:javascript
复制
...
rule_files:
  - alert1.rules.yml
  - alert2.rules.yml
...

保存文件并退出编辑器。现在删除旧的警报规则文件。

代码语言:javascript
复制
sudo rm alert1.rules alert2.rules

接下来,让我们配置Prometheus来发现Alertmanager,-alertmanager.url命令不再存在。相反,Prometheus2.0引入了Alertmanager Service Discovery,它带来了许多新功能,并与Kubernetes等服务更好地集成。如果您不使用Alertmanager,请跳过此步骤的其余部分。

再次在编辑器中打开文件prometheus.yml

代码语言:javascript
复制
sudo nano /etc/prometheus/prometheus.yml

以下alerting指令指示Prometheus使用在腾讯云CVM9093端口上运行的Alertmanager。您可以在文件中的任何位置添加以下内容:

代码语言:javascript
复制
global:
...
​
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - alertmanager:9093
​
rule_files:
...

保存文件并关闭文本编辑器。

Prometheus现在能够使用警报规则并与Alertmanager进行通信,我们已准备好第一次运行它。

第5步 - 运行Prometheus 2.0

为了能够将Prometheus 2.0作为服务运行,我们需要创建一个新的服务文件。我们可以从我们用于Prometheus 1.8.2的服务文件开始,因为除了ExecStart命令之外它们几乎是相同的。

通过复制现有服务文件来创建新的服务文件:

代码语言:javascript
复制
sudo cp /etc/systemd/system/prometheus1.service /etc/systemd/system/prometheus.service

在编辑器中打开新创建的服务文件:

代码语言:javascript
复制
sudo nano /etc/systemd/system/prometheus.service

Prometheus 2.0在标志系统中带来了几个重要的变化,包括:

  • 标志现在使用双破折号(--)而不是单破折号作为前缀。
  • 所有-storage.local-storage.remote标志已被删除并替换为--storage.tsdb标志。
  • -alertmanager.url已被移除,并用Alertmanager服务发现,被上一步骤所取代。

ExecStart指令替换为以下指令:

代码语言:javascript
复制
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,以便您可以使用新创建的服务。

代码语言:javascript
复制
sudo systemctl daemon-reload

然后启动Prometheus:

代码语言:javascript
复制
sudo systemctl start prometheus

检查服务的状态以确保其按预期工作。

代码语言:javascript
复制
sudo systemctl status prometheus
代码语言:javascript
复制
● 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,请按照屏幕上的日志并回溯前面的步骤以解决问题,然后再继续学习本教程。

在系统启动时启用它:

代码语言:javascript
复制
sudo systemctl enable prometheus

您可以通过导航到http://your_server_ip并使用安装Prometheus时配置的凭据进行身份验证来访问Prometheus的Web UI 。您将在下一步中使用Web UI以确保Prometheus按预期工作。

第6步 - 测试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和旧数据的情况下将其删除。

第7步 - 删除旧数据(可选)

您可能想要删除Prometheus 1.8.2和旧数据。请按照以下步骤清理所有内容。

警告:这是不可逆转的操作!删除旧数据后,除非您备份过,否则永远无法恢复。

首先,从Prometheus 2配置文件中删除remote_read指令。在编辑器中打开Prometheus 2.0配置文件:

代码语言:javascript
复制
sudo nano /etc/prometheus/prometheus.yml

找到并删除remote_read

代码语言:javascript
复制
remote_read:
    - url: http://localhost:9089/api/v1/read

保存文件并关闭文本编辑器。重新启动Prometheus以应用更改。

代码语言:javascript
复制
sudo systemctl restart prometheus

确保服务正常运行:

代码语言:javascript
复制
sudo systemctl status prometheus
代码语言:javascript
复制
● 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相关目录和文件。

禁用该服务以确保它不会自动启动:

代码语言:javascript
复制
sudo systemctl disable prometheus1

然后停止服务:

代码语言:javascript
复制
sudo systemctl stop prometheus1

没有输出表明操作成功完成。

现在删除prometheus1服务文件:

代码语言:javascript
复制
sudo rm /etc/systemd/system/prometheus1.service

最后,删除不再需要的文件。首先,删除/usr/local/bin目录中的prometheus1promtool1可执行文件。

代码语言:javascript
复制
sudo rm /usr/local/bin/prometheus1 /usr/local/bin/promtool1

然后删除用于存储数据和配置的/etc/prometheus1/var/lib/prometheus1目录。

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 第1步 - 将Prometheus升级到1.8.2
  • 第2步 - 将Prometheus 1.8.2配置为单独的服务
  • 第3步 - 配置Prometheus 2.0
  • 第4步 - 配置警报(可选)
  • 第5步 - 运行Prometheus 2.0
  • 第6步 - 测试Prometheus
  • 第7步 - 删除旧数据(可选)
  • 结论
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档