许多企业对研发资产与研发流程的安全性有更高的要求:代码库、镜像仓库、K8s 集群等核心资产不开放公网地址,只允许在企业自有的专有网络(VPC)内部访问,CI/CD(Continuous Integration/Continuous Deployment)流程也需要适配这种网络安全配置。本文介绍如何基于云效的用户 VPC 构建集群,在 VPC 环境内落地 CI/CD,并通过最小化流水线逐级验证与云效站点、ACR、ACK 之间的网络连通性。
一、CI/CD 流程中的研发资产
1.1 研发资产
一条完整的 CI/CD 流程,本质上是围绕一组研发资产运转的。常见的研发资产包括:
资产 | 角色 | 典型产品 |
代码库 | 存储项目源码 | 代码管理 Codeup |
制品库 | 存储构建依赖包与部署制品 | 制品仓库 Packages |
构建集群 | 执行构建、发起部署的算力载体 | 云效托管构建集群 / 用户私有构建集群 |
镜像仓库 | 存储容器镜像 | 容器镜像服务 ACR 等 |
K8s 集群 | 容器化部署目标 | 容器服务 ACK 等 |
主机集群 | 主机部署目标 | 云服务器 ECS 等 |
1.2 研发流程
这些资产通过一系列操作串联起完整的 CI/CD 流程。流程的起点与终点都在构建集群与流水线 Flow 之间:构建集群从 Flow 获取构建任务(①),流程结束后将执行结果同步回 Flow(⑩)。
接到任务后,构建集群从代码库克隆代码(②),在构建机上完成构建,构建过程会拉取制品库中的依赖包(③)。构建成功后按部署形态分叉:主机部署的构建产物上传到制品库(④),K8s 部署的构建产物(镜像)推送到镜像仓库(⑤)。
进入部署阶段,同样分为两条路径:
主机部署:主机集群上预先安装 Flow 的 Runner,该 Runner 自动从 Flow 获取部署任务(⑥),再从制品库下载制品包(⑦),在主机上执行部署命令完成发布。
K8s 部署:构建机向 K8s 集群发送部署命令(⑧),K8s 集群从镜像仓库拉取镜像(⑨),然后完成部署。
二、CI/CD 的网络安全诉求
研发资产与研发流程梳理清楚后,回到本文的主题:为什么特别关注“VPC 网络环境”?因为上述流程中每一次跨网络的读写,都对应着真实的网络安全风险。
2.1 核心研发资产不应暴露在公网
代码库、制品库、镜像仓库、K8s 集群、主机集群等研发资产,承载着企业最核心的代码与业务系统。把它们暴露到公网(开放公网端点、IP 白名单管理不当等),意味着攻击面扩大:源码与制品可能被拉取篡改,K8s API Server 与主机可能被暴力破解。因此用户的核心诉求是:研发资产不暴露在公网上,仅开放 VPC 内部可访问——资产只持有私网地址,公网侧完全不可见或仅保留最小必要的受控入口。
2.2 研发流程应在 VPC 内部完成
仅隔离资产还不够。如果执行这些流程的构建机与主机上的 Runner 位于公网侧,那么每次克隆代码、推送镜像、下发部署命令、获取任务与下载制品,都要“出公网再回来”,流量绕行公网,前述的隔离效果会大打折扣。因此诉求的完整表述是:研发资产之间的流程也应尽量在 VPC 内部完成,不经过公网——不仅目标资产要在 VPC 内,发起流程的构建算力同样要进入 VPC,与资产处于同一张内网。
2.3 CI/CD 方案的核心是构建集群
把这两条诉求落到第一章的关系图上,构建集群是所有研发流程的发起者与执行者,方案设计的两个关键问题都由它决定:
构建集群的网络位置:构建集群位于公网(云效网络),还是位于用户 VPC 内部?这决定“研发流程在 VPC 内完成”的诉求能否成立。
构建集群如何与研发资产连接:构建集群与代码库、制品库、镜像仓库、K8s 集群、主机集群等研发资产之间的每一条链路,走公网还是走 VPC 内网?
下一章围绕这两个问题,介绍云效提供的两种构建集群方案。
三、云效构建集群方案
围绕上述两个问题,云效提供两种构建集群——云效默认构建集群与用户 VPC 构建集群,二者在同一时刻只会启用其一。两种集群有共同的特性:构建机都是弹性的,按需扩缩、用完释放;计算资源都由云效提供,无需自备构建机。本质区别在于使用的网络资源不同——是云效的网络,还是用户自己的 VPC 网络,这直接决定了能否满足前文所述的网络安全诉求。两种集群的对比如下:
维度 | 云效默认构建集群 | 用户 VPC 构建集群 |
网络资源归属 | 云效的网络资源 | 用户自己的 VPC 网络资源 |
构建机位置 | 运行在云效侧 | 调度进用户 VPC 内,与业务资源同一张内网 |
与研发资产的连接 | 仅公网 | VPC 私网 |
研发资产公网暴露 | 必须暴露可公网访问的端点 | 无需暴露公网 |
网络资源费用 | 不必为网络资源额外付费 | 为所占用的用户侧网络资源额外付费 |
配置复杂度 | 开箱即用、操作简单 | 需关联 VPC、规划安全组与路由 |
适用场景 | 目标资源可经公网端点安全访问、追求零运维快速起步 | 对网络隔离、合规或时延要求较高,或资产仅开放内网访问 |
3.1 云效默认构建集群
云效默认构建集群使用云效的网络资源。构建机运行在云效侧,只能通过公网与研发资产(代码库、制品库、镜像仓库等)连接;主机部署则由主机集群上的 Runner 经公网从 Flow 获取部署任务、从 Packages 下载制品。
优点:开箱即用、操作简单,无需自备机器,也不必为网络资源额外付费。
局限:所有链路都经由公网,研发资产必须暴露可公网访问的端点,代码克隆、镜像推送、制品下载等流程也会绕行公网。
适合目标资源均可通过公网端点安全访问、追求零运维快速起步的场景。
3.2 用户 VPC 构建集群
用户 VPC 构建集群使用用户自己的 VPC 网络资源。构建机调度进用户 VPC 内,与业务资源处于同一张内网,可以通过 VPC 私网与用户的所有研发资产(镜像仓库、K8s 集群、代码库、制品库等)连接;主机部署则由主机集群上的 Runner 获取部署任务与制品。
优点:研发资产无需暴露公网,构建流程可在 VPC 内完成,链路更短、更安全、时延更低。
代价:配置相对复杂,需要关联 VPC、规划安全组与路由;并且需要为所占用的用户侧网络资源(VPC、交换机、NAT 网关等)额外付费。此外,通过专有网络域名内网访问云效站点仅地域组织(企业协作模式)支持,选型时需先确认组织类型与协作模式满足要求。
适合对网络隔离、合规或时延有较高要求,或研发资产仅开放内网访问的场景。
四、实施步骤
本章是落地方案的核心操作指南。以用户 VPC 构建集群方案为例,完整实施分为三步:创建 VPC 构建集群 → 验证与云效站点的连接 → 验证与 ACR、ACK 的连接。逐步推进、逐步验证,任何一步失败都可以将问题范围收敛到对应的网络链路上。其中部署侧的验证覆盖 K8s 部署形态的链路(ACR 镜像推送与 ACK 发布)。
开始操作前,确认以下资源与配置已就绪:
已创建用户 VPC 与交换机,并规划好安全组的放通规则。
已确定接入点方式并完成对应的网络配置(见 4.1 第 3 项):公网域名方式要求 VPC 具备访问公网的能力(如已配置 NAT 网关);专有网络域名方式要求已通过云效控制台的组织详情页 > 网络配置激活云效的 VPC 域名。
需要通过专有网络域名接入时,所使用的云效组织为地域组织且处于企业协作模式(中心组织仅支持公网访问)。
已准备用于验证流水线源的代码库与制品仓库:Codeup 通常自带 codeup-demo 示例库;Packages 的软件包仓库默认没有制品文件,需先上传任意一个文件。
已准备 ACR 镜像仓库与 ACK 集群,并将部署用的 YAML 文件(如
deployment.yaml)上传到代码库。
4.1 第一步:创建 VPC 构建集群
进入 Flow 的构建集群管理页面,新建构建集群,将其类型选择为 VPC 构建集群,并完成以下关键配置:
基本信息:填写构建集群名称(构建集群 ID 由系统自动生成,可复制备用)。
关联用户 VPC 与安全组:选择构建机要部署进的用户 VPC(及交换机),并绑定安全组。安全组需要放通构建机与云效站点、ACR、ACK 等目标之间必要的出方向端口;若 ACR、ACK 开启了访问控制,还需将其白名单指向该安全组或 VPC 网段。
选择接入点:VPC 构建集群与云效站点之间的任务下发与结果回传,需要通过接入点完成。根据所使用的云效组织类型与所选域名,共有三种情况。
选择接入点时,先按组织类型归类:中心组织仅支持公网访问,对应场景 1;地域组织同时支持公网与 VPC 专有网络访问,对应场景 2 和场景 3,其中 VPC 访问能力属于企业协作模式。从安全角度,优先选择专有网络域名——流量不出公网,且可满足按 IP 收敛安全组白名单的诉求;其次为公网域名;中心组织仅有公网域名,无需选择。
# | 场景 | 接入点 | 网络要求与配置说明 |
1 | 中心组织 | 无需选择(仅有公网域名) | 用户 VPC 需要具备访问公网的能力;此方式无法配置 Flow 具体的 IP 作为安全组白名单 |
2 | 地域组织 · 公网域名 | 公网域名 | 用户 VPC 同样需要能够访问公网;可以在 VPC 内配置出网 IP 白名单,具体域名 IP 可在云效控制台的组织详情页查询 |
3 | 地域组织 · VPC 域名(推荐) | 专有网络域名 | 用户 VPC 无需出公网;但需先通过云效控制台的组织详情页 > 网络配置激活云效的 VPC 域名 |
接入点的选择只影响构建集群与云效站点之间的链路:公网域名对应经公网的连接方式,专有网络域名对应 VPC 内网连接方式;与 ACR、ACK 等 VPC 内资产的连接始终走内网。
4.2 第二步:验证与云效站点的连接
创建集群并完成 VPC 侧的网络配置后,通过一条最小化流水线验证连通性:
新建一条流水线,运行时的构建集群选择第一步创建的 VPC 构建集群。
配置流水线源:分别添加一个 Codeup 代码库和一个 Packages 软件包仓库。
Codeup 通常自带一个 codeup-demo 示例库,直接选用即可。
Packages 的软件包仓库默认没有制品文件,可先上传任意一个文件,保证流水线源有内容可下载。
为任务添加云效的执行命令步骤:无需自行编写验证命令——即使是空白命令,流水线执行时也会自动下载流水线源(即代码库与制品库的内容)。该步骤跑通,即说明克隆代码与下载制品两条链路都已打通。
运行流水线,根据执行日志即可快速定位网络问题:
日志现象 | 说明 | 排查方向 |
“申请运行环境”报错 | VPC 网络无法与 Flow 服务连接 | 检查接入点配置、VPC 公网访问能力(NAT 网关、出网白名单)或 VPC 域名激活状态 |
“克隆代码”报错 | VPC 网络无法与 Codeup 或 Packages 服务连接 | 检查安全组出方向规则、VPC 路由与目标服务的访问控制 |
步骤全部成功 | 与云效站点的连接已打通 | 继续第三步验证 |
流水线运行成功,即说明 VPC 构建集群与云效站点之间的“获取任务、克隆代码、拉取制品”链路全部可用;若失败,按上表定位到对应链路后,回到第一步检查接入点与安全组配置。
4.3 第三步:验证与 ACR、ACK 的连接
在第二步的流水线基础上继续追加两个步骤,验证部署侧链路。同样无需自行编写命令,直接选用云效的内置流水线步骤:
验证 ACR 连接:添加流水线步骤 Docker login ACR,选择 ACR 的服务连接,并输入镜像仓库地址——此处要输入 ACR 的 VPC 访问地址(专有网络域名),而不是公网地址。步骤执行成功,即说明构建机可通过 VPC 内网访问 ACR,推送镜像链路可用。
验证 ACK 连接:添加流水线步骤 Kubectl 发布,选择目标 Kubernetes 集群(ACK)。使用该步骤前,需要把要部署的 YAML 文件上传到代码库中(例如
deployment.yaml),并在步骤配置中填写该 YAML 文件在代码库中的相对路径。步骤执行成功,即说明构建机可通过 VPC 内网访问 ACK 的 API Server 并完成发布,kubectl 部署链路可用。若步骤执行失败,按下表定位排查:
日志现象 | 说明 | 排查方向 |
Docker login ACR 步骤失败 | 构建机无法通过 VPC 内网访问 ACR | 检查是否误用了公网地址、ACR 实例的 VPC 访问控制是否放通 |
Kubectl 发布 步骤失败 | 构建机无法通过 VPC 内网访问 ACK 的 API Server,或发布配置有误 | 检查集群选择、YAML 文件相对路径以及 ACK API Server 的访问白名单 |
两个步骤都执行成功,即说明构建、部署全链路的网络连通性验证完毕,可将真实的构建任务与部署任务迁移到该 VPC 构建集群上运行。