作者:MeshCloud脉时云公有云架构师 王彬
一.引言
在众多Google cloud的使用者中(尤其是初次接触GCP的客户)有不少用户都有这样的需求,不同的实例需要配置不同的防火墙规则(例如限制来源IP或放通不同的端口等)。如果遇到实例数量较多的时候这是一个较为头疼的问题,不少用户希望有一种方法能够高效的解决这个问题,减轻在使用GCP过程中的工作量。GCP网络标记则可以完美的解决这个需求。
二.GCP网络标记介绍
GCP网络标记只是添加到资源中“标记”字段的字符串,例如虚拟机实例或实例模版。标记不是单独的资源,因此无法单独创建它。具有该字符串的所有资源都被视为具有该标记。利用标记,您可以将防火墙规则和路由应用于特定虚拟机实例。
网络标记的添加方式有两种:
1.在创建新的实例时分配网络标记
2.为现有的实例进行修改添加网络标记(修改时无需停机操作)
网络标记规范:
1.分配给实例的网络标记适用于该实例的所有网络接口
2.网络标记仅适用于直接连接到实例的网络接口的 vpc网络(包括VPC对等连接)
3.网络标记必须以小写字母开头,可以包含小写字母、数字和连字符,必须是小写字母或数字结尾
4.网络标记在多个 VPC 网络中无需是唯一的,您可以在不同的网络中使用相同的标记
网络标记限制:
1.每台虚拟机最多分配 64 个不同的标记。
2.每个标记的字符数上限为63个字符
3.标记可接受的字符为小写字母、数字、短划线(标记必须以小写字母开头,并且必须以数字或小写字母结尾。)
三.配置GCP网络标记
1.所需权限
对于在创建新实例时或为现有实例分配网络标记您需要有项目的Owner或者Editor或者Instance Admin
对于添加、移除或修改防火墙规则您需要有项目的Owner或者Editor或者Security Admin
2.创建网络标记
1.在GCP控制台找到VPC网络

2.选择需要创建网络标记的VPC

3.以使用网络标记创建不同的防火墙规则为例,选择在vpc中选择防火墙,并点击创建防火墙规则

4.创建防火墙规则

5.创建运用防火墙规则的网络标记

3.使用网络标记
对于新创建的实例使用此网络标记来应用防火墙规则
在控制台找到实例选项
点击创建实例
点击展开高级选项
在网络标记栏输入防火墙规则的网络标记(需要和之前创建的防火墙规则在同一个VPC下)

对于现有实例添加网络标记
找到需要添加网络标记的实例
点击修改
在网络标记处填写你的标记名称
点击保存

4.直接 API 请求
您可以通过发出直接 API 请求来设置与实例关联的网络标记。与使用 Google Cloud 控制台或 gcloud命令不同,通过直接 API 请求更新标记时不会保留任何现有标记。以这种方式更新标记时,请务必指定应与实例关联的整组标记。
要使用直接 API 请求来更新标记,请执行以下操作:
确定与这些标记关联的最新指纹。指纹用于防止同时发出的 API 请求之间发生冲突。更新实例的网络标记的过程与更新实例元数据类似。 对实例执行 GET 请求;例如:
GET https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/example-instance
在响应中寻找 tags.fingerprint属性:
200 OK
{
...
"tags": {
"items": [
"http-server",
"db-client"
],
"fingerprint": "MW8EqhxILtc="
},
...
}
您还可以使用 gcloud命令获取 fingerprint,如以下示例所示:
gcloud compute instances describe INSTANCE_NAME
--zone ZONE
--format="get(tags.fingerprint)"
向 instance().setTags 方法发出POST请求。请求正文必须包含应与实例关联的所有标记以及 fingerprint值。 示例请求:
POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/example-instance/setTags
{
"items": [
"http-server",
"db-client",
"allow-internet-access"
],
"fingerprint": "MW8EqhxILtc="
}
示例响应:
200 OK
{
"kind": "compute#operation",
"id": "9251830049681941507",
"name": "operation-1442414898862-51fde63aa57b1-422323e0-c439fb04",
"zone": "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f",
"operationType": "setTags",
"targetLink": "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/example-instance",
"targetId": "4392196237934605253",
"status": "PENDING",
"user": "user@example.com",
"progress": 0,
...
}
5.注意事项
如果您将入站防火墙规则与来源标记配合使用,则可能会出现传播延迟。此延迟通常为几秒钟,但在极少数情况下,可能会达到几分钟。当您进行以下更改时,入站防火墙规则可能需要一段时间才能应用到关联的实例或从关联的实例中移除:
- 启动或停止具有与规则的来源标记关联的标记的实例
- 启动具有与规则的目标标记关联的标记的实例
- 如果在规则的来源字段或目标字段中使用了标记,则可以在实例中添加或移除标记
- 在规则中添加或移除来源标记或目标标记
此传播延迟仅适用于使用来源标记的入站规则。所有其他防火墙规则都会立即在实例上生效。例如,使用来源 IP 地址范围和目标标记的入站规则不会出现传播延迟。