解释 CNAB 规范如何支持混合云打包

解读

国内企业在“双态 IT”与“两地三中心”合规要求下,普遍出现私有云(OpenStack、VMware)、公有云(阿里云、腾讯云、华为云)、边缘 K8s 集群并存的格局。面试官问 CNAB,并不是想听概念背诵,而是想看候选人能否把 Docker 镜像与云资源统一打包、版本化、分发、部署、回收这一整套闭环讲清楚,并指出在落地时与 Docker 生态的衔接点。回答时要突出“一次打包、多处运行、可审计、可回滚”的业务价值,并给出国内真实会遇到的多 registry 网络隔离、许可证合规、密钥不出境等细节。

知识点

  1. CNAB 核心实体:bundle.json 描述文件、 invocation image(安装器镜像)、CNAB 运行时(docker-app、porter、duffle)。
  2. 与 Docker 的耦合:invocation image 本身就是 Docker 镜像,可用多阶段构建把 200 MB 的 ansible 工具链压到 20 MB;bundle 内通过 images 字段声明业务镜像列表,支持 docker-compose.yaml 直接嵌套。
  3. 混合云分发机制:bundle 整体推送到私有 Harbor 与公有云 ACR/CR 双实例,通过 digest 保证跨云拉取一致性;CNAB 的 relocation-mapping 可在部署时自动替换 registry 域名,解决国内专线与公网带宽成本问题。
  4. 参数与凭证:使用 credentials 字段把 kubeconfig、阿里云 AccessKey、OpenStack 密码注入,全程不落盘,符合等保 2.0 对密钥生命周期的要求。
  5. 生命周期钩子installupgradeuninstall 三步即可覆盖 Dev、Staging、Prod;配合 GitLab CI 的 cnab-push 模板,实现镜像签名+bundle 签名双保险,满足国内银行“交付物不可变”的审计条款。
  6. 与 Docker Swarm 的互补:在边缘机房没有 K8s 的场景,CNAB 可在 invocation image 里调用 docker stack deploy,实现同一套 bundle 既能在 ACK 集群跑,也能在 Swarm 边缘节点跑,降低边缘 30% 资源开销。

答案

CNAB 规范通过“bundle 描述文件 + 安装器镜像”的双层封装,把应用所需的多架构 Docker 镜像、云资源模板(ROS、Terraform)、配置参数与凭证一次性打成一个可签名、可 relocate、可版本化的包。
具体落地时,我们把业务容器用 docker buildx 打出 amd64/arm64 双架构镜像并推送到两地 Harbor;随后编写 bundle.json,在 images 字段声明这些镜像的 digest,确保跨云拉取时不受 registry 镜像名漂移影响。 invocation image 基于 docker:20.10-dind 制作,内置 kubectlterraform-alicloud-provider 以及公司自研的合规扫描脚本,整体大小控制在 50 MB 以内。
部署阶段,CNAB 运行时先根据 relocation-mapping 把 digest 映射到目标云的内网域名,避免重复上传 2 GB 镜像;接着读取 GitLab 注入的 credentials,把 ACK 集群 kubeconfig、阿里云 RAM 临时 STS 凭证挂载到 invocation 容器内,执行 helm upgradeterraform apply,完成 K8s 工作负载与 RDS、SLB 等云资源的统一交付。
整个流程通过 cnab-to-harbor 插件实现镜像签名+bundle 签名,回滚时只需 duffle uninstall 即可按逆序销毁云资源并清理镜像缓存,满足国内银保监对可审计、可回退的刚性要求。由此,开发团队在私有云、公有云、边缘节点三套环境中,真正做到“一次打包、随处运行”,把环境差异导致的缺陷率从 15% 降到 2% 以内。

拓展思考

  1. 国内云厂商的**“私有云专属 Region”与线下机房通过专线互通,CNAB 的 relocation 机制如何与DNS 劫持、镜像加速代理**并存?可调研在 invocation image 里内置 dragonfly dfget 做 P2P 预热,减少 70% 跨机房流量。
  2. 等保 2.0 要求密钥不出境,但 bundle 需要在阿里云国际站与华为云之间同步,可探索使用国密 SM4 信封加密把 credentials 字段整体加密后再做国际分发,运行时通过 KMS 解密,兼顾合规与效率。
  3. 当业务镜像数量超过 50 个时,bundle.json 的 digest 维护成为瓶颈,可引入镜像 BOM(Bill of Materials) 自动生成工具,与 Docker 19.03 的 buildx bake 集成,实现**“一键更新全部 digest”**,避免人工遗漏导致跨云漂移。