背景
目标机器(10.11.11.11)需要在 K8s 容器中运行 UnixBench 性能测试,但由于网络限制无法访问国外镜像仓库。因此需要一台可访问外网的代理机器(即本文档的执行机器)协助完成以下工作:
- 获取 UnixBench 容器镜像
- 导出为 tar 文件
- 传输到目标机器
目标机器收到镜像文件后,由目标机器侧自行导入 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 白名单等) | 手动传输 |