4. 测试镜像准备:构建不同大小(50MB/200MB/1GB)的测试镜像
容量规划测试的核心在于控制变量。为了精准评估镜像大小对 Deployment 拉取速度的影响,我们需要构建三个具有明确大小梯度的测试镜像:50MB、200MB 和 1GB。本节将使用 Dockerfile 与多阶段构建技术,确保镜像体积精确可控,同时避免引入不必要的层数或元数据干扰。
4.1 镜像大小设计原则
测试镜像的内容应尽量“中性”——即不包含复杂的业务逻辑,仅通过填充特定大小的文件来控制体积。我们采用以下策略:
- 基础镜像统一:全部使用
alpine:3.18作为基础层,确保底层库和文件系统开销一致。 - 填充文件生成:使用
dd命令在构建阶段生成指定大小的空白文件(/testfile.img)。 - 多阶段构建:第一阶段生成填充文件,第二阶段仅复制该文件到最终镜像,避免构建工具链和中间层残留在交付产物中。
设计要点:使用
dd if=/dev/zero 生成的填充文件内容全为 0,具有极高的压缩率。在后续的镜像仓库传输测试中,这能更真实地反映网络带宽与解压性能,而非磁盘 I/O 瓶颈。
4.2 多阶段构建 Dockerfile 模板
以下是一个通用的多阶段构建 Dockerfile,通过修改 FILE_SIZE_MB 环境变量即可生成不同大小的镜像。
# ===== 阶段一:生成指定大小的填充文件 =====
FROM alpine:3.18 AS builder
# 构建参数:目标文件大小(单位 MB)
ARG FILE_SIZE_MB=50
# 安装 coreutils(dd 命令所在包)
RUN apk add --no-cache coreutils
# 生成填充文件到 /tmp 目录
RUN dd if=/dev/zero of=/tmp/testfile.img bs=1M count=${FILE_SIZE_MB} status=progress
# ===== 阶段二:最终运行镜像 =====
FROM alpine:3.18
# 仅从 builder 阶段复制填充文件
COPY --from=builder /tmp/testfile.img /testfile.img
# 设置默认命令,保持容器运行
CMD ["tail", "-f", "/dev/null"]
4.3 构建与验证流程
按照以下步骤依次构建三个镜像,并验证其实际大小是否符合预期。
| 步骤 | 命令 | 说明 |
|---|---|---|
| 1 | docker build --build-arg FILE_SIZE_MB=50 -t test-image:50mb . |
构建 50MB 镜像 |
| 2 | docker build --build-arg FILE_SIZE_MB=200 -t test-image:200mb . |
构建 200MB 镜像 |
| 3 | docker build --build-arg FILE_SIZE_MB=1024 -t test-image:1gb . |
构建 1GB 镜像(1024MB) |
| 4 | docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" |
验证镜像实际大小 |
验证预期输出示例:
注:实际大小会因文件系统块对齐和 alpine 基础层(约 7MB)略有上浮。
test-image 50mb 51.2MBtest-image 200mb 201MBtest-image 1gb 1.02GB注:实际大小会因文件系统块对齐和 alpine 基础层(约 7MB)略有上浮。
4.4 多阶段构建的优势图解
下图展示了多阶段构建如何隔离构建环境与运行环境,确保最终镜像仅包含运行所需的文件,从而精确控制体积。
4.5 镜像推送至私有仓库
构建完成后,需要将镜像推送至所有 Kubernetes 节点均可访问的镜像仓库(如 Harbor、Docker Registry 或阿里云 ACR)。
# 登录镜像仓库
docker login registry.example.com
# 为镜像打标签(以 50MB 为例)
docker tag test-image:50mb registry.example.com/test/test-image:50mb
# 推送镜像
docker push registry.example.com/test/test-image:50mb
# 重复上述步骤为 200mb 和 1gb 镜像打标签并推送
注意事项:
- 确保所有 Worker 节点都能通过
docker pull或 containerd 访问该仓库,无需额外认证或已配置imagePullSecrets。 - 记录每个镜像的完整 digest(
docker images --digests),以便在 Deployment YAML 中使用精确版本,避免标签被覆盖。 - 测试期间建议关闭镜像仓库的压缩功能(如 gzip 压缩),以统一变量;若需测试压缩传输,则单独记录压缩率。
4.6 镜像大小与层数汇总
下表汇总了三个测试镜像的关键属性,供后续拉取速度测试时参考。
| 镜像标签 | 目标大小 | 实际大小(约) | 层数 | 基础镜像 |
|---|---|---|---|---|
test-image:50mb |
50 MB | 51.2 MB | 2 | alpine:3.18 |
test-image:200mb |
200 MB | 201 MB | 2 | alpine:3.18 |
test-image:1gb |
1 GB | 1.02 GB | 2 | alpine:3.18 |