墨玉月麒麟 發表於 2022-12-25 22:57:00

【踩坑】Debian编译安装Podman和Prometheus-podman-exporter

<blockquote>
<p>这个月一直在折腾 Grafana,中途遇到了各种各样的问题<br>
这两天折腾得差不多了,才有空把遇到的问题写出来<br>
一方面做个记录,另一方面也当给想要折腾的小伙伴们踩踩坑<br>
估计最近会陆续写一系列 Grafana 相关的文章 <s>(前提是不像以前一样动不动鸽几个月)</s>,欢迎关注ヾ(≧▽≦*)o<br>
Grafana 折腾日志</p>
</blockquote>
<p>前几个月,我把服务器上的容器管理工具从 Docker 全部换成了Podman</p>
<p>所以搭完 Grafana 后,就开始思考怎么把 Podman 给添加上去</p>
<p>一通搜索后,在 Github 上找到了prometheus-podman-exporter这个项目</p>
<p>但在阅读安装说明时发现它只支持 Podman 4.x,而 Debian11 的 stable 源中的最近版本是<code>3.0.1</code>,没办法只能自己编译新版本了 ̄へ ̄</p>
<h2 id="系统环境">系统环境</h2>
<p>本文中的内容都在以下环境中测试:</p>
<blockquote>
<p>用户: root<br>
架构: X86_64<br>
系统: Debian 11.6(bullseye)<br>
内核: 6.0.11-x64v1-xanmod1</p>
</blockquote>
<h2 id="编译安装-podman">编译安装 Podman</h2>
<h3 id="准备工作">准备工作</h3>
<h4 id="安装依赖">安装依赖</h4>
<p>按照文档,首先要使用<code>apt</code>安装以下依赖:</p>
<blockquote>
<p>其中golang因为版本太老,这里暂时忽略,稍候单独从官网安装</p>
</blockquote>
<pre><code class="language-shell">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
</code></pre>
<p>执行以下命令安装<code>Golang 1.19.4</code>(撰写本文时的最新版本):</p>
<pre><code class="language-shell">cd /tmp &amp;&amp; \
wget -O go.linux-amd64.tar.gz https://go.dev/dl/go1.19.4.linux-amd64.tar.gz &amp;&amp; \
rm -rf /usr/local/go &amp;&amp; \
tar -C /usr/local -xzf go.linux-amd64.tar.gz &amp;&amp; \
echo 'export PATH=$PATH:/usr/local/go/bin;' &gt; /etc/profile.d/golang.sh &amp;&amp; \
. /etc/profile.d/golang.sh &amp;&amp; \
rm go.linux-amd64.tar.gz
</code></pre>
<h4 id="检查依赖版本">检查依赖版本</h4>
<p>如果你和我一样使用的是 Debian11.x,那么可以跳过这个的步骤</p>
<ul>
<li><code>golang</code> &gt;= 1.16 :<pre><code class="language-shell"># 查看当前版本
go version
</code></pre>
</li>
<li><code>conmon</code> 官方说要尽可能新,这个大家自己看着办吧ヾ(•ω•`)o<pre><code class="language-shell"># 获取最新版本
curl -s https://api.github.com/repos/containers/conmon/releases/latest| grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/'
# 查看当前版本
conmon --version
</code></pre>
</li>
<li><code>runc</code> &gt;= 1.0.0-rc4 或 1.0.1 (本文中使用<code>crun</code>替代)<pre><code class="language-shell"># 查看当前版本
runc --version
</code></pre>
</li>
</ul>
<h4 id="安装-cni-plugins">安装 CNI Plugins</h4>
<blockquote>
<p>这里是一个大坑,我当初看到<code>is done by default</code>和<code> no further configuration is needed</code>就直接跳过去了,结果安装完尝试启动容器的时候就会报错,找了好久才发现是这里漏了>︿<</p>
</blockquote>
<p>以下命令可以下载最新版本的 CNI Plugins 并添加到<code>/opt/cni/bin</code>下:</p>
<pre><code class="language-shell">cd /tmp &amp;&amp; \
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 &amp;&amp; \
tar -C /opt/cni/bin cni-plugins.tar.gz &amp;&amp; \
rm cni-plugins.tar.gz
</code></pre>
<h3 id="编译-podman">编译 Podman</h3>
<p>首先克隆源码存储库,并检出到最新的<code>tag</code>:</p>
<pre><code class="language-shell">git clone https://github.com/containers/podman.git &amp;&amp; \
cd podman &amp;&amp; \
git checkout $(curl -s https://api.github.com/repos/containers/podman/releases/latest| grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
</code></pre>
<p>以下为推荐的构建参数,更多选项参见编译文档:</p>
<pre><code class="language-shell">make BUILDTAGS="selinux seccomp"
</code></pre>
<p>如果没有错误,执行以下命令安装:</p>
<pre><code class="language-shell">sudo make install PREFIX=/usr
</code></pre>
<h3 id="bash-自动补全">Bash 自动补全</h3>
<p>执行以下命令开启自动补全:</p>
<pre><code class="language-shell">podman completion -f /etc/bash_completion.d/podman bash
</code></pre>
<p>重启终端后就可以享受类似 Docker 的自动补全了</p>
<h3 id="删除无用的包可选">删除无用的包(可选)</h3>
<p>如果磁盘空间紧张或者短时间内不会再次编译,可以酌情删除以下依赖:</p>
<pre><code class="language-shell">apt autoremove libbtrfs-dev \
libc6-dev \
libdevmapper-dev \
libglib2.0-dev \
libprotobuf-dev \
libprotobuf-c-dev \
libseccomp-dev \
libselinux1-dev
</code></pre>
<h2 id="编译安装-prometheus-podman-exporter">编译安装 prometheus-podman-exporter</h2>
<p>解决完 Podman 的版本问题,接下来就轮到 exporter 了</p>
<blockquote>
<p>Github:containers/prometheus-podman-exporter</p>
<p>安装说明: install.md</p>
</blockquote>
<h3 id="编译">编译</h3>
<p>照例先安装依赖:</p>
<pre><code class="language-shell">apt install -y libgpgme-dev libbtrfs-dev libdevmapper-dev libassuan-dev pkg-config
</code></pre>
<p>克隆仓库并进入:</p>
<pre><code class="language-shell">git clone https://github.com/containers/prometheus-podman-exporter &amp;&amp; \
cd prometheus-podman-exporter
</code></pre>
<p>编译可执行文件:</p>
<pre><code class="language-shell">make binary
</code></pre>
<h3 id="安装">安装</h3>
<p>实测项目自带的<code>make install</code>没有什么效果,所以我参考 prometheus-node-exporter 进行了安装:</p>
<p>首先把可执行文件复制到<code>/usr/bin</code>下:</p>
<pre><code class="language-shell">cp ./bin/prometheus-podman-exporter /usr/bin/
</code></pre>
<p>为了实现后台运行,我写了一份 service 文件 <s>(当然还是抄的 node-exporter)</s>,保存到<code>/lib/systemd/system/prometheus-podman-exporter.service</code>中:</p>
<pre><code class="language-ini">
Description=Prometheus exporter for Podman
Documentation=https://github.com/containers/prometheus-podman-exporter


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


WantedBy=multi-user.target
</code></pre>
<p>它会从<code>/etc/default/prometheus-podman-exporter</code>中读取环境变量<code>ARGS</code>,并用作启动的参数</p>
<p>例如想开启所有收集器,可以这么写:</p>
<pre><code class="language-shell"># /etc/default/prometheus-podman-exporter
ARGS='--collector.enable-all'
</code></pre>
<blockquote>
<p>提示:更多命令行参数见这里</p>
</blockquote>
<p>写入 service 文件后,记得先重新加载一遍 daemon:</p>
<pre><code class="language-shell">systemctl daemon-reload
</code></pre>
<p>现在我们就可以使用<code>systemctl</code>来管理 prometheus-podman-exporter 啦:</p>
<pre><code class="language-shell"># 开启
systemctl start prometheus-podman-exporter
# 停止
systemctl stop prometheus-podman-exporter
# 开机启动
systemctl enable prometheus-podman-exporter
</code></pre>
<h2 id="下期预告">下期预告</h2>
<p>Grafana 折腾日志-其二 适用于 prometheus-podman-exporter 的 Grafana 仪表盘</p>
<h2 id="最后">最后</h2>
<p>不得不吐槽一句,一个 exporter 最高占用将近 40M 内存,对低配小鸡真的不友好ヽ(≧□≦)ノ</p><br><br>
来源:https://www.cnblogs.com/dreamofice/p/debian-compile-podman.html
頁: [1]
查看完整版本: 【踩坑】Debian编译安装Podman和Prometheus-podman-exporter