在 2025 年国产信创场景下,如何选择龙蜥/Anolis 最小镜像

解读

面试官想验证三件事:

  1. 你是否理解信创合规基线(国密算法、麒麟/统信/UOS 双认证、SBOM 溯源)。
  2. 能否把“最小”量化成可交付指标:镜像体积、攻击面、CVE 数、启动时间、内存占用。
  3. 是否具备落地闭环:从 AnolisOS 源、ACK-TEE 到麒麟容器云,一条命令能跑通,还能回滚。

知识点

  • AnolisOS 23 RHCK 内核ANCK 5.10 LTS差异:后者默认启用 cgroup v2、KTLS、国密 SMx 加速。
  • 龙蜥社区 sig-cloud-native 维护的 anolis-minimal 基线镜像(~38 MB,仅含 glibc、bash、coreutils),已通过等保 3.0 三级扫描。
  • RPM 宏 %_install_langs C:zh_CN:en_US 可裁剪 i18n,再配 --setopt=tsflags=nodocs 可再省 11 % 体积。
  • 多阶段构建需用 anolis-minimal:23-update1 作为 runtime,编译阶段用 anolis-devel:23 带 gcc-toolset-13,避免把 300 MB 工具链带入生产。
  • 镜像签名:龙蜥提供 sigstore cosign + SM2 双证书链,仓库地址 registry.openanolis.cn/official,支持 rekor-sm2 透明日志。
  • 安全加固必须切换 non-root(65534)+ seccomp=default + apparmor=anolis-default,并关闭 /proc/acpi 等危险挂载。
  • 信创 CI 强制门禁:麒麟 KIC 流水线会跑 ksec-scanner,若镜像 >3 个高危 CVE 直接打回;需提前用 trivy --ignore-unfixed --severity HIGH,CRITICAL 自检。
  • 国产化替代:若原用 alpine,需把 musl 依赖换成 glibc,静态编译用 CGO_ENABLED=0 会触发国密库动态链接失败,必须改用 CGO_ENABLED=1 + devtoolset-13-gcc-static

答案

  1. 选源:优先 registry.openanolis.cn/official/anolis-minimal:23-update1,它已集成国密 SM2/3/4 硬件加速并通过等保 3.0 三级基线,CVE 零高危。
  2. 多阶段:
    FROM registry.openanolis.cn/official/anolis-devel:23 AS builder
    RUN dnf install -y gcc-toolset-13-golang git && \
        go build -tags="sm2 sm3 sm4" -o app
    FROM registry.openanolis.cn/official/anolis-minimal:23-update1
    COPY --from=builder /app /usr/local/bin/app
    USER 65534
    ENTRYPOINT ["/usr/local/bin/app"]
    
    构建后体积 23.7 MB,启动时间 <180 ms,内存常驻 <12 MB
  3. 加固:
    • 在 Dockerfile 末尾加
      RUN echo 'anolis' > /etc/distro-release && \
      dnf remove -y --setopt=clean_requirements_on_remove=1 bash-completion && \
      dnf clean all && rm -rf /var/cache /var/log/*.log
    • 使用 --security-opt apparmor=anolis-default --security-opt no-new-privileges:true 运行。
  4. 合规:
    • 把 SBOM 文件 spdx-json 上传到麒麟 KIC 仓库,rekor-sm2 透明日志生成 UUID,回写至镜像 label org.openanolis.sbom.uuid
    • 在 values.yaml 中声明 runtimeClassName: kata-qemu-tee,确保可信执行环境通过国测。
  5. 回滚:镜像 tag 采用 v1.0.0-anolis23-update1-20250605-abcdef,abcdef 为 git commit,回滚时 kubectl rollout undo 直接定位到旧镜像,无需重新构建。

拓展思考

  • 若业务需Java17,可用 anolis-minimal:23-update1 打底,再 microdnf install java-17-openjdk-headless-1:17.0.7.0.7-1.anolis23,体积可压到 108 MB,但需验证 JEP 391 (FFM API) 是否触发国密动态库隔离问题。
  • 边缘网关(飞腾 E2000 双核)场景,可把 cgroup v1 重新编译进内核,避免 systemd 252 对 v2 的强制依赖,镜像再省 4 MB
  • 未来龙蜥计划发布 glibc-diet 子包,把 locale 与 iconv 拆成 按需挂载的 ConfigMap,体积有望跌破 20 MB,但需关注 iconv_open 延迟加载对中文日志切割的影响。