跳到主要内容

私有网络接入最佳实践

企业应用上云后,常见的网络诉求是:部署在 CloudBase 上的服务(云函数、云托管)需要访问企业自有 VPC 内的资源(内网数据库、内部服务、专线打通的 IDC),且往往是多个服务访问同一套内网。本文介绍私有网络接入的推荐做法,重点回答一个高频问题:网络配置能不能「公共部分配置一次」,而不是每个服务手动配一遍?

核心概念:三层模型

私有网络接入实际分三层,各层的配置粒度不同——把它们区分开,就知道哪些只需要做一次:

做什么配置粒度需要做几次
网络打通让 CloudBase 侧 VPC 与你的业务 VPC 互通(对等连接 / 云联网)VPC 级一次。后续新增 VPC 只是追加关联
云托管服务绑定在服务设置中开启「私有网络」并选择 VPC/子网服务级每个服务配置一次,创建时或创建后均可设置
云函数绑定每个函数的 VpcConfig 指定 vpcId/subnetId函数级平台层逐函数,但可用配置文件声明一次、批量下发(见下文)

第一步:规划 CIDR(最容易返工的环节)

打通前先确认 CloudBase 侧 VPC 与业务 VPC 的网段不重叠。网段冲突是私有网络集成失败的最常见原因,且事后调整代价不小——修改已上线服务的网络配置会触发服务更新,重新规划网段则意味着整条打通链路返工。

参考规划:CloudBase 侧 192.168.0.0/16,业务侧 172.16.0.0/16

查看账号下现有 VPC 与子网:

tcb api vpc DescribeVpcs --api-version 2017-03-12 --body '{"Limit":"20"}' --json
tcb api vpc DescribeSubnets --api-version 2017-03-12 --body '{"Limit":"20"}' --json

第二步:打通网络(一次性工作)

方式适用条件
对等连接(Peering)两端 VPC 网段完全不重叠
云联网(CCN)可跨地域(官方方案覆盖同账号场景),或主网段有重叠但子网不重叠

以云联网为例的打通流程:

  1. 创建 CCN 实例:在云联网控制台新建实例。默认提供的免费带宽仅够连通性测试,生产环境需按地域对购买带宽
  2. 关联 VPC:将 CloudBase 侧 VPC 与业务 VPC 分别关联到该 CCN 实例,然后在实例详情的路由表中确认路由均为「启用」状态
  3. 放通安全组:业务 VPC 的安全组放通 CloudBase 侧 VPC 网段的对应端口

之后新增业务 VPC,只需重复第 2 步追加关联,路由自动维护——这一层天然就是「配置一次」。完整的跨地域打通步骤参考基于云联网(CCN)实现云开发跨地域 VPC 内网互通

第三步:绑定服务,按形态分两条路

云托管:服务设置中开启私有网络

云托管服务的私有网络按服务配置,创建服务时可以指定,创建后也可以调整:进入服务详情页,打开「服务设置」,在网络配置中开启或编辑「私有网络」,选择 VPC 与子网后保存。注意:修改私有网络配置会触发服务更新,建议在业务低峰期操作,且不要频繁切换。详见云托管 VPC 配置说明

另外,开启私有网络不等于自动具备公网出口——服务如需同时访问公网,请确保 VPC 中已创建 NAT 网关。

云函数:配置文件声明一次,批量下发

云函数的 VPC 绑定是函数级的,但不需要逐个手动配置。在 cloudbaserc.jsonfunctionDefaultConfig 中声明一次,所有函数自动继承;个别函数需要不同网络时,在该函数条目内覆盖:

{
"$schema": "https://static.cloudbase.net/cli/cloudbaserc.schema.json",
"version": "2.0",
"envId": "your-env-id",
"functionRoot": "./functions",
"functionDefaultConfig": {
"vpc": { "vpcId": "vpc-xxxx", "subnetId": "subnet-xxxx" }
},
"functions": [
{ "name": "svc-a" },
{ "name": "svc-b" },
{ "name": "svc-c", "vpc": { "vpcId": "vpc-yyyy", "subnetId": "subnet-yyyy" } }
]
}

批量下发到所有函数,或只推送单个:

tcb config update fn --all
tcb config update fn svc-a

functionDefaultConfig 中的配置会合并进每个函数,函数自身的同名配置优先级更高(上例中 svc-c 使用自己声明的 VPC)。

三个重要行为说明:

  • 增量更新tcb config update fn 只更新声明过的配置项,不会清空函数上已有的环境变量等其他配置

  • 确认是否生效tcb fn detail <funcName> -e <envId> 输出中的 Network configuration 行会显示绑定的 VPC 与子网(含名称和网段);未绑定时显示 None。也可以用 SCF 原生接口核对:

    tcb api scf GetFunction --api-version 2018-04-16 \
    --body '{"FunctionName":"<funcName>","Namespace":"<envId>"}' --json

    注意 Namespace 填的就是环境 ID

  • 解绑走 API:CLI 的 --vpc 参数传空值不会清除配置。如需解除函数的 VPC 绑定,调用 SCF 接口将 VpcConfig 置空:

    tcb api scf UpdateFunctionConfiguration --api-version 2018-04-16 \
    --body '{"FunctionName":"<funcName>","Namespace":"<envId>","VpcConfig":{"VpcId":"","SubnetId":""}}'

反方向:从你的内网访问 CloudBase

如果诉求是反过来——内网环境不出公网、直接访问 CloudBase 的接入网关,可使用腾讯云私有连接(Private Link):服务方发布「终端节点服务」,你在自己的 VPC 内创建「终端节点」与之关联。通道建立在 VPC 层面,建一次,内网中的所有服务共用,无需逐服务配置。

验证与排障

打通完成后,在函数内用内网地址实际调用一次业务服务。失败时按以下顺序排查:

  1. CCN 路由表中两条路由是否均为「启用」(网段冲突会导致路由停用)
  2. 业务 VPC 安全组是否放通了 CloudBase 侧 VPC 网段的对应端口
  3. 函数是否已绑定 VPC 且绑定的是正确的 VPC(看 tcb fn detailNetwork configuration 行)
  4. 业务后端服务是否确实在监听目标端口
  5. 查看函数日志,区分连接超时(路由/安全组问题)、连接被拒(端口未监听)两类错误

推荐与避免

✓ 推荐✗ 避免
打通前先规划 CIDR,确保网段不重叠用默认网段直接建 VPC,冲突后返工重建
云函数 VPC 用 functionDefaultConfig 声明一次、批量下发逐个函数手动配置,新增函数时遗漏
tcb fn detail 逐函数核对绑定结果下发后不验证,出问题时从头排查
云托管尽量在创建服务时确定私有网络频繁切换线上服务的私有网络(每次修改都触发服务更新)
新增业务 VPC 通过 CCN 追加关联每次新增都重新搭一条打通链路

常见问题

多个服务访问同一个内网,到底要配几次?

打通链路一次;云托管逐服务在服务设置中选择同一 VPC(创建时配好可避免后续触发服务更新);云函数在 cloudbaserc.json 声明一次后 tcb config update fn --all 批量下发,新增函数纳入配置文件即可继承。任何情况下都无需重新打通网络。

两边网段重叠怎么办?

对等连接建不起来;若只是主网段重叠而子网不重叠,改用云联网(其网段限制可细化到子网级)。子网也冲突时,只能重新规划一侧网段。

怎么快速确认某个函数绑没绑 VPC?

tcb fn detail <funcName> -e <envId>,看 Network configuration 行:绑定时显示 VPC/子网的 ID、名称与网段,未绑定显示 None

函数绑定 VPC 后访问不了公网了?

VPC 内函数的公网访问路径与默认环境不同,如需同时访问内网与公网,参考 VPC 的 NAT 网关/公网访问配置,或将仅访问公网的函数与内网函数分开部署。