【踩坑】Debian编译安装Podman和Prometheus-podman-exporter
这个月一直在折腾 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 default
和no 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 内存,对低配小鸡真的不友好ヽ(≧□≦)ノ