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 白名单等) 手动传输
相关推荐
运维老郭10 小时前
【K8s运维实战】Kubernetes临时存储卷实战:emptyDir核心用法与gitRepo弃用迁移指南
运维·云原生·kubernetes
AAA@峥14 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~15 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
gs8014017 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui18 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘18 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒51721 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu7581 天前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
Akamai中国1 天前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务