这个月一直在折腾 Grafana,中途遇到了各种各样的问题
这两天折腾得差不多了,才有空把遇到的问题写出来
一方面做个记录,另一方面也当给想要折腾的小伙伴们踩踩坑
估计最近会陆续写一系列 Grafana 相关的文章 (前提是不像以前一样动不动鸽几个月),欢迎关注ヾ(≧▽≦*)o
Grafana 折腾日志

前几个月,我把服务器上的容器管理工具从 Docker 全部换成了Podman

所以搭完 Grafana 后,就开始思考怎么把 Podman 给添加上去

一通搜索后,在 Github 上找到了prometheus-podman-exporter这个项目

但在阅读安装说明时发现它只支持 Podman 4.x,而 Debian11 的 stable 源中的最近版本是3.0.1,没办法只能自己编译新版本了 ̄へ ̄

系统环境

本文中的内容都在以下环境中测试:

用户: root
架构: X86_64
系统: Debian 11.6(bullseye)
内核: 6.0.11-x64v1-xanmod1

编译安装 Podman

准备工作

安装依赖

按照文档,首先要使用apt安装以下依赖:

其中golang因为版本太老,这里暂时忽略,稍候单独从官网安装

apt install \
  btrfs-progs \
  crun \
  git \
  go-md2man \
  iptables \
  libassuan-dev \
  libbtrfs-dev \
  libc6-dev \
  libdevmapper-dev \
  libglib2.0-dev \
  libgpgme-dev \
  libgpg-error-dev \
  libprotobuf-dev \
  libprotobuf-c-dev \
  libseccomp-dev \
  libselinux1-dev \
  libsystemd-dev \
  pkg-config \
  uidmap

执行以下命令安装Golang 1.19.4(撰写本文时的最新版本):

cd /tmp && \
wget -O go.linux-amd64.tar.gz https://go.dev/dl/go1.19.4.linux-amd64.tar.gz && \
rm -rf /usr/local/go && \
tar -C /usr/local -xzf go.linux-amd64.tar.gz && \
echo 'export PATH=$PATH:/usr/local/go/bin;' > /etc/profile.d/golang.sh && \
. /etc/profile.d/golang.sh && \
rm go.linux-amd64.tar.gz

检查依赖版本

如果你和我一样使用的是 Debian11.x,那么可以跳过这个的步骤

  • golang >= 1.16 :
    # 查看当前版本
    go version
  • conmon 官方说要尽可能新,这个大家自己看着办吧ヾ(•ω•`)o
    # 获取最新版本
    curl -s https://api.github.com/repos/containers/conmon/releases/latest  | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/'
    # 查看当前版本
    conmon --version
  • runc >= 1.0.0-rc4 或 1.0.1 (本文中使用crun替代)
    # 查看当前版本
    runc --version

安装 CNI Plugins

这里是一个大坑,我当初看到is done by defaultno further configuration is needed就直接跳过去了,结果安装完尝试启动容器的时候就会报错,找了好久才发现是这里漏了>︿<

以下命令可以下载最新版本的 CNI Plugins 并添加到/opt/cni/bin下:

cd /tmp && \
wget -O cni-plugins.tar.gz \
https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-$(curl -s https://api.github.com/repos/containernetworking/plugins/releases/latest  | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/').tgz && \
tar -C /opt/cni/bin cni-plugins.tar.gz && \
rm cni-plugins.tar.gz

编译 Podman

首先克隆源码存储库,并检出到最新的tag:

git clone https://github.com/containers/podman.git && \
cd podman && \
git checkout $(curl -s https://api.github.com/repos/containers/podman/releases/latest  | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')

以下为推荐的构建参数,更多选项参见编译文档:

make BUILDTAGS="selinux seccomp"

如果没有错误,执行以下命令安装:

sudo make install PREFIX=/usr

Bash 自动补全

执行以下命令开启自动补全:

podman completion -f /etc/bash_completion.d/podman bash

重启终端后就可以享受类似 Docker 的自动补全了

删除无用的包(可选)

如果磁盘空间紧张或者短时间内不会再次编译,可以酌情删除以下依赖:

apt autoremove libbtrfs-dev \
  libc6-dev \
  libdevmapper-dev \
  libglib2.0-dev \
  libprotobuf-dev \
  libprotobuf-c-dev \
  libseccomp-dev \
  libselinux1-dev

编译安装 prometheus-podman-exporter

解决完 Podman 的版本问题,接下来就轮到 exporter 了

Github:containers/prometheus-podman-exporter

安装说明: install.md

编译

照例先安装依赖:

apt install -y libgpgme-dev libbtrfs-dev libdevmapper-dev libassuan-dev pkg-config

克隆仓库并进入:

git clone https://github.com/containers/prometheus-podman-exporter && \
cd prometheus-podman-exporter

编译可执行文件:

make binary

安装

实测项目自带的make install没有什么效果,所以我参考 prometheus-node-exporter 进行了安装:

首先把可执行文件复制到/usr/bin下:

cp ./bin/prometheus-podman-exporter /usr/bin/

为了实现后台运行,我写了一份 service 文件 (当然还是抄的 node-exporter),保存到/lib/systemd/system/prometheus-podman-exporter.service中:

[Unit]
Description=Prometheus exporter for Podman
Documentation=https://github.com/containers/prometheus-podman-exporter

[Service]
Restart=on-failure
User=root
EnvironmentFile=/etc/default/prometheus-podman-exporter
ExecStart=/usr/bin/prometheus-podman-exporter $ARGS
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

它会从/etc/default/prometheus-podman-exporter中读取环境变量ARGS,并用作启动的参数

例如想开启所有收集器,可以这么写:

# /etc/default/prometheus-podman-exporter
ARGS='--collector.enable-all'

提示:更多命令行参数见这里

写入 service 文件后,记得先重新加载一遍 daemon:

systemctl daemon-reload

现在我们就可以使用systemctl来管理 prometheus-podman-exporter 啦:

# 开启
systemctl start prometheus-podman-exporter
# 停止
systemctl stop prometheus-podman-exporter
# 开机启动
systemctl enable prometheus-podman-exporter

下期预告

Grafana 折腾日志-其二 适用于 prometheus-podman-exporter 的 Grafana 仪表盘

最后

不得不吐槽一句,一个 exporter 最高占用将近 40M 内存,对低配小鸡真的不友好ヽ(≧□≦)ノ