K8s 容器运行 UnixBench — 代理机器执行记录

背景

目标机器(10.11.11.11)需要在 K8s 容器中运行 UnixBench 性能测试,但由于网络限制无法访问国外镜像仓库。因此需要一台可访问外网的代理机器(即本文档的执行机器)协助完成以下工作:

  1. 获取 UnixBench 容器镜像
  2. 导出为 tar 文件
  3. 传输到目标机器

目标机器收到镜像文件后,由目标机器侧自行导入 containerd 并通过 K8s Job/Pod 运行测试。

目标机器环境:

项目
IP 10.11.11.11
用户 geshifei
架构 x86_64
容器运行时 containerd 1.7.17
K8s 版本 v1.31.14
containerd socket /run/containerd/containerd.sock
containerd namespace k8s.io

基本信息

项目
代理机器 当前机器(执行 Docker 构建和镜像导出)
目标机器 10.11.11.11 (geshifei)
最终产物 /home/workdir/tmp/unixbench-image.tar.gz (128MB)

执行过程

#mermaid-svg-EifkljGTW9YDs2OB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EifkljGTW9YDs2OB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EifkljGTW9YDs2OB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EifkljGTW9YDs2OB .error-icon{fill:#552222;}#mermaid-svg-EifkljGTW9YDs2OB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EifkljGTW9YDs2OB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EifkljGTW9YDs2OB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EifkljGTW9YDs2OB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EifkljGTW9YDs2OB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EifkljGTW9YDs2OB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EifkljGTW9YDs2OB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EifkljGTW9YDs2OB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EifkljGTW9YDs2OB .marker.cross{stroke:#333333;}#mermaid-svg-EifkljGTW9YDs2OB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EifkljGTW9YDs2OB p{margin:0;}#mermaid-svg-EifkljGTW9YDs2OB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EifkljGTW9YDs2OB .cluster-label text{fill:#333;}#mermaid-svg-EifkljGTW9YDs2OB .cluster-label span{color:#333;}#mermaid-svg-EifkljGTW9YDs2OB .cluster-label span p{background-color:transparent;}#mermaid-svg-EifkljGTW9YDs2OB .label text,#mermaid-svg-EifkljGTW9YDs2OB span{fill:#333;color:#333;}#mermaid-svg-EifkljGTW9YDs2OB .node rect,#mermaid-svg-EifkljGTW9YDs2OB .node circle,#mermaid-svg-EifkljGTW9YDs2OB .node ellipse,#mermaid-svg-EifkljGTW9YDs2OB .node polygon,#mermaid-svg-EifkljGTW9YDs2OB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EifkljGTW9YDs2OB .rough-node .label text,#mermaid-svg-EifkljGTW9YDs2OB .node .label text,#mermaid-svg-EifkljGTW9YDs2OB .image-shape .label,#mermaid-svg-EifkljGTW9YDs2OB .icon-shape .label{text-anchor:middle;}#mermaid-svg-EifkljGTW9YDs2OB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EifkljGTW9YDs2OB .rough-node .label,#mermaid-svg-EifkljGTW9YDs2OB .node .label,#mermaid-svg-EifkljGTW9YDs2OB .image-shape .label,#mermaid-svg-EifkljGTW9YDs2OB .icon-shape .label{text-align:center;}#mermaid-svg-EifkljGTW9YDs2OB .node.clickable{cursor:pointer;}#mermaid-svg-EifkljGTW9YDs2OB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EifkljGTW9YDs2OB .arrowheadPath{fill:#333333;}#mermaid-svg-EifkljGTW9YDs2OB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EifkljGTW9YDs2OB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EifkljGTW9YDs2OB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EifkljGTW9YDs2OB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EifkljGTW9YDs2OB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EifkljGTW9YDs2OB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EifkljGTW9YDs2OB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EifkljGTW9YDs2OB .cluster text{fill:#333;}#mermaid-svg-EifkljGTW9YDs2OB .cluster span{color:#333;}#mermaid-svg-EifkljGTW9YDs2OB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EifkljGTW9YDs2OB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EifkljGTW9YDs2OB rect.text{fill:none;stroke-width:0;}#mermaid-svg-EifkljGTW9YDs2OB .icon-shape,#mermaid-svg-EifkljGTW9YDs2OB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EifkljGTW9YDs2OB .icon-shape p,#mermaid-svg-EifkljGTW9YDs2OB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EifkljGTW9YDs2OB .icon-shape .label rect,#mermaid-svg-EifkljGTW9YDs2OB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EifkljGTW9YDs2OB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EifkljGTW9YDs2OB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EifkljGTW9YDs2OB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败: 仓库不存在
失败: git clone SSL 证书验证失败
成功
失败: SSH 连接被远程关闭
docker pull kimiev/unixbench:latest
使用 Dockerfile 自行构建
代理机器克隆仓库 + 修改 Dockerfile
docker save 导出 tar
gzip 压缩
scp 传输到目标机器
手动传输

各步骤详情

1. 拉取镜像 --- 失败

bash 复制代码
docker pull kimiev/unixbench:latest

结果: 失败 --- pull access denied, repository does not exist or may require docker login

原因: 该镜像在 Docker Hub 上不存在或需要登录。

2. Dockerfile 构建(原版)--- 失败

使用原始 Dockerfile(内含 git clone)构建:

dockerfile 复制代码
RUN git clone https://github.com/kdlucas/byte-unixbench.git /opt/UnixBench && \
    cd /opt/UnixBench/UnixBench && \
    make

结果: 失败 --- server certificate verification failed. CAfile: none CRLfile: none

原因: 容器内缺少 CA 证书,无法验证 GitHub 的 SSL 证书。

3. 代理机器克隆 + 修改 Dockerfile --- 成功

先在代理机器上克隆仓库(跳过 SSL 验证):

bash 复制代码
GIT_SSL_NO_VERIFY=1 git clone https://github.com/kdlucas/byte-unixbench.git /home/workdir/tmp/byte-unixbench

修改 Dockerfile,用 COPY 替代 git clone(将本地源码直接拷入镜像):

dockerfile 复制代码
FROM ubuntu:22.04

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        build-essential git perl \
        libx11-6 libxext6 libxrender1 libxtst6 libfreetype6 \
        fonts-dejavu-core && \
    rm -rf /var/lib/apt/lists/*

COPY byte-unixbench /opt/UnixBench
RUN cd /opt/UnixBench/UnixBench && make

WORKDIR /opt/UnixBench/UnixBench
ENTRYPOINT ["./Run"]

构建命令:

bash 复制代码
docker build -t unixbench:latest .

结果: 成功,镜像构建完成。

4. 导出镜像 --- 成功

bash 复制代码
docker save unixbench:latest -o /home/workdir/tmp/unixbench-image.tar

注意事项: snap 版 Docker 的临时目录在 /tmp/snap-private-tmp/snap.docker/tmp/,需手动拷贝到目标路径。

5. 压缩 --- 成功

bash 复制代码
gzip /home/workdir/tmp/unixbench-image.tar

结果: unixbench-image.tar.gz,128MB(压缩率不高,因为镜像内主要是二进制文件)。

6. SCP 传输 --- 失败

bash 复制代码
scp /home/workdir/tmp/unixbench-image.tar.gz geshifei@10.11.11.11:/tmp/

结果: 失败 --- Connection closed by 10.11.11.11 port 22

原因: SSH 连接在密钥交换阶段被远程主机关闭,可能是 IP 白名单限制或 SSH 服务配置问题。

处理: 用户选择手动传输(U 盘、共享目录等方式)。

目标机器后续操作

文件传输到目标机器后,执行以下命令导入镜像:

bash 复制代码
# 如果传输的是 .tar.gz,先解压
gunzip /tmp/unixbench-image.tar.gz

# 导入到 containerd 的 k8s.io namespace
sudo ctr -a /run/containerd/containerd.sock -n k8s.io images import /tmp/unixbench-image.tar

# 验证镜像已导入
sudo ctr -a /run/containerd/containerd.sock -n k8s.io images ls | grep -i unixbench

踩坑总结

问题 原因 解决方案
docker pull 失败 镜像仓库不存在或需登录 改用 Dockerfile 自行构建
容器内 git clone SSL 失败 容器缺少 CA 证书 在代理机器上克隆后 COPY 进镜像
docker save 输出路径权限拒绝 snap Docker 的临时目录特殊 导出到 /tmp 后手动拷贝
SCP 连接被关闭 目标机器 SSH 限制(IP 白名单等) 手动传输
相关推荐
Albert Edison6 小时前
【Docker】Ubuntu22.04 安装 Docker 教程
运维·docker·容器
codefan※7 小时前
一键部署私人 LLM:Ollama + Docker 极简指南
运维·docker·容器·大模型·llm·本地部署·ollama
阿里云云原生7 小时前
可观测性的终局?从“面向数据”到“面向对象”,UModel 如何为 AI Agent 注入认知地图
云原生·agent
李南想做条咸鱼8 小时前
k8s集群容器访问域名第一次不通,第二次必通如何解决
云原生·容器·kubernetes
FelixBitSoul9 小时前
K8s 调度器黑盒全拆解:拓扑约束数学陷阱 + Go 插件二开实战(避坑全记录)
容器·kubernetes
叶~小兮9 小时前
K8s常用组件学习笔记
笔记·学习·kubernetes
ん贤9 小时前
Volcano 详细笔记
云原生·volcano
IT策士9 小时前
Docker 网络进阶:容器间通信与 DNS 解析
网络·docker·容器
热爱Liunx的丘丘人11 小时前
Docker
运维·docker·容器