使用Terraform管理弹性网卡典型实践
概述
百度智能云弹性网卡能够在多个云主机间自由迁移。通过在云主机上绑定多个弹性网卡,可以实现高可用网络方案;也可以在弹性网卡上绑定多个内网 IP,每个内网 IP 都可以绑定一个 EIP。用户配置好 IP 地址后,通过配置应用策略即可实现不同业务流量以不同源 IP 从网卡流出,实现单主机多 IP 部署。
通过 Terraform 这种基础设施架构自动化编排工具,能够降低企业在基础设施构建过程中的成本,同时也可以提高云基础设施开发人员在 IAC(基础设施即代码)方面的技能。使用 Terraform 允许您通过代码方式快速创建、部署和管理弹性网卡。
需求场景
- 部署高可用集群:弹性网卡是系统架构中的关键组件,满足系统高可用架构对于单实例多网卡的需求。
- 快速故障迁移:通过将弹性网卡从云主机实例卸载后再挂载到另外一台云主机实例,将故障实例上的业务流量快速迁移到备用实例,实现服务的容灾部署。
- 精细化网络管理:实例可以挂载多个弹性网卡,弹性网卡可分别位于不同的子网,可独立配置安全组、ACL 安全访问规则,从而对每个弹性网卡的流量进行安全访问控制,同时可实现不同业务间数据隔离。
配置前您需要了解:
- 每个 VPC 可支持 500 个弹性网卡。
- BCC 实例与弹性网卡必须在同一可用区、同一 VPC,可以在不同子网,挂载不同的安全组。
- BCC 的带宽能力由实例规格决定,在一台实例上挂载多个弹性网卡不能提高实例带宽性能。
- BCC 主网卡不属于弹性网卡,不在弹性网卡列表中,主网卡在 BCC 详情页面中配置。
- 单网卡上 IP 数量最少 1 个,最多 40 个。
- 云主机可挂载弹性网卡数量 = min(主机核数,8)。
- 云主机绑定的网卡上可配置 IP 数量:
| 内存 | IP数量 |
|---|---|
| 1G | 2 |
| (1-8]G | 8 |
| (8-32]G | 16 |
| (32-64]G | 30 |
| 大于64G | 40 |
配置步骤
1、环境准备
Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具。它以配置文件为驱动,您在文件中定义各种组件,Terraform 会基于该文件完成所有组件的创建、变更和管理。目前百度智能云已与 Terraform 集成,您可通过 Terraform 来创建、管理 ENI、VPC、BCC 等多种百度智能云资源,具体请参考Terraform BaiduCloud Provider。
使用前请完成以下准备:
- 安装 Terraform。
- 准备百度智能云访问凭证,并通过环境变量、Terraform 变量或 Provider 配置传入。文档示例中不要写入真实 AK/SK。
- 确认账户在目标地域具备创建 VPC、子网、安全组、EIP、弹性网卡和 BCC 实例的配额及支付条件。 安装 Terraform。
- 准备百度智能云访问凭证,并通过环境变量、Terraform 变量或 Provider 配置传入。文档示例中不要写入真实 AK/SK。 确认账户在目标地域具备创建 VPC、子网、安全组、EIP、弹性网卡和 BCC 实例的配额及支付条件。
2、初始化Terraform
- 登录 Terraform 官网下载适用于您的操作系统的程序包。
- 配置 terraform baidu provider 信息,配置文件可参考如下的代码,在当前文件夹内保存为 version.tf。
1 terraform {
2 required_providers {
3 baiducloud = {
4 source = "baidubce/baiducloud"
5 version = "1.16.2" #版本号 从1.16.2版本开始支持弹性网卡
6 }
7 }
8 }
- 执行命令 terraform init,Terraform 会根据当前文件夹内的 version.tf 文件初始化工作空间。
-
编辑 Terraform 配置文件。新建文件 main.tf,在文件中指定VPC、弹性网卡、安全组等元信息。参考配置和步骤如下:
更多弹性网卡参数信息可参考baidu provider官方文档
3、创建弹性网卡
在 main.tf 文件中加入如下代码,在之后执行 terraform apply 的时候即可创建弹性网卡
1resource "baiducloud_eni" "eni" {
2 # 弹性网卡名称
3 name = "terraform-eni"
4 # 弹性网卡所属子网的ID
5 subnet_id = baiducloud_subnet.subnet.id
6 # 弹性网卡描述
7 description = "terraform test"
8 # 弹性网卡的安全组
9 security_group_ids = [
10 baiducloud_security_group.sg.id
11 ]
12 # 弹性网卡的私有IP配置
13 private_ip {
14 # 是否为主IP
15 primary = true
16 # 内网IP
17 private_ip_address = "172.16.0.10"
18 # 公网IP(选配)
19 public_ip_address = baiducloud_eip.eip2.eip
20 }
21 private_ip {
22 primary = false
23 private_ip_address = "172.16.0.11"
24 public_ip_address = baiducloud_eip.eip1.eip
25 }
26 private_ip {
27 primary = false
28 private_ip_address = "172.16.0.13"
29 }
30}
说明:用户可使用 Terraform 创建弹性网卡所需要的 EIP、VPC、子网等资源,然后通过引用的方式填入弹性网卡创建时需要的字段中,也可直接填入弹性网卡依赖的资源的 ID。
本示例中弹性网卡依赖的 EIP、VPC、子网、安全组配置信息如下
1# 新建 VPC
2resource "baiducloud_vpc" "vpc" {
3 name = "terraform_vpc"
4 cidr = "172.16.0.0/20"
5}
6# 新建子网
7resource "baiducloud_subnet" "subnet" {
8 name = "terraform_subnet"
9 zone_name = "cn-bj-d"
10 cidr = "172.16.0.0/24"
11 vpc_id = baiducloud_vpc.vpc.id
12 description = "terraform test subnet"
13}
14# 新建安全组
15resource "baiducloud_security_group" "sg" {
16 name = "terraform-sg"
17 description = "security group created by terraform"
18 vpc_id = baiducloud_vpc.vpc.id
19}
20# 创建两个 EIP
21resource "baiducloud_eip" "eip1" {
22 bandwidth_in_mbps = 1
23 billing_method = "ByBandwidth"
24 payment_timing = "Postpaid"
25}
26resource "baiducloud_eip" "eip2" {
27 bandwidth_in_mbps = 1
28 billing_method = "ByBandwidth"
29 payment_timing = "Postpaid"
30}
4、弹性网卡配置更新
支持更新的字段如下,只需对字段值进行修改,然后应用变更计划即可完成更新
- name
- description
-
security_group_ids
注意:
- 请确保至少有一个安全组ID
-
private_ip
注意:
- 一个 private_ip 为一个代码块,在弹性网卡的配置里声明即完成了内网IP的创建
- 主 IP 不能删除
- 仅可删除辅助 IP
- 新增的内网 IP 都是辅助 IP
- 如果删除内网 IP,只需要在弹性网卡的配置中,删除想要删除的内网 IP 代码块
- 如果想绑定 EIP,只需要在内网 IP 的代码块中进行配置即可
5、弹性网卡绑定实例
- 注意事项:
- 一个云主机可以绑定多个弹性网卡,但只能绑定一个主网卡。
- 一个弹性网卡只能同时绑定一个云主机。
- 只有运行中或者已关机状态的云主机才能绑定弹性网卡。
- 弹性网卡和绑定的云主机必须是在同一私有网络内,且两者所在子网的可用区相同。
-
示例代码如下:
注意:如果实例没有完全启动,此时绑定弹性网卡可能会造成失败
1# 创建一个1c4g的实例
2resource "baiducloud_instance" "server1" {
3 availability_zone = "cn-bj-d"
4 instance_spec = "bcc.gr1.c1m4"
5 image_id = data.baiducloud_images.images.images.0.id
6 billing = {
7 payment_timing = "Postpaid"
8 }
9 admin_pass = "Eni12345"
10 subnet_id = baiducloud_subnet.subnet.id
11 security_groups = [
12 baiducloud_security_group.sg.id
13 ]
14 # action = "stop"
15}
16# 等待60s 实例完全启动
17resource "time_sleep" "wait_60_seconds" {
18 depends_on = [baiducloud_instance.server1, baiducloud_eni.eni]
19 create_duration = "60s"
20}
21# 实例绑定弹性网卡
22resource "baiducloud_eni_attachment" "default" {
23 depends_on = [time_sleep.wait_30_seconds]
24 eni_id = baiducloud_eni.eni.id
25 instance_id = baiducloud_instance.server1.id
26}
说明:
- 挂载云主机后,还需要手动配置辅助 IP,参见BCC文档-配置弹性网卡。
- 弹性网卡主 IP 无法释放,辅助IP可以释放。
6、应用配置
- 执行如下代码,可查看资源变更计划
1$ terraform plan
- 执行如下代码,可应用资源变更计划,完成资源的创建或更新,如图所示
1$ terraform apply

- 在全部变更计划完成之后,会显示出结果

测试验证
- 1、在百度智能云控制台的产品界面查看对应的资源是否都创建成功。
-
2、在完成了上述步骤的配置之后,可测试是否能够通过两个不同的公网IP连接到实例。
注意:示例中的代码没有配置安全组规则,如果需要测试某个端口的连通性,请按需创建安全组规则
如果能够通过不同的公网 IP 连接到实例,说明弹性网卡配置和绑定成功。
资源删除
- 若实例需要解绑弹性网卡,只需要删除 baiducloud_eni_attachment 这一资源即可,可通过如下代码
1 # 通过-target指定资源进行删除
2 terraform destroy -target baiducloud_eni_attachment.default
- 可通过如下命令释放当前 main.tf 中的所有资源
1 terraform destroy
相关产品
评价此篇文章
