使用 VPC 流日志

VPC 流日志记录虚拟机实例(包括用作 GKE 节点的实例)发送和接收的网络流样本。这些日志可用于网络监控、取证、实时安全分析和费用优化。

本页面假定您熟悉 VPC 流日志概览中介绍的概念。

启用 VPC 流日志

启用 VPC 流日志时,可以为子网中的所有虚拟机启用此功能。但是,您可以减少写入日志记录的信息量。如需详细了解您可以控制的参数,请参阅日志采样和汇总

创建子网时启用 VPC 流日志

控制台

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击要在其中添加子网的网络。
  3. 点击添加子网
  4. 流日志下,选择开启
  5. 如果要调整日志采样和汇总,请点击配置日志并调整以下任意项:
    • 汇总时间间隔
    • 是否在最后的日志条目中包括元数据
      默认情况下,包括元数据仅包括特定字段。如需了解详情,请参阅自定义元数据字段。如需自定义元数据字段,您必须使用 gcloud 命令行界面或 API。
    • 采样率100% 表示保留所有条目。
  6. 根据需要填写其他字段。
  7. 点击添加

gcloud

gcloud compute networks subnets create subnet-name \
    --enable-flow-logs \
    [--logging-aggregation-interval=aggregation-interval \
    [--logging-flow-sampling=0.0...1.0] \
    [--logging-filter-expr=expression] \
    [--logging-metadata=(include-all | exclude-all | custom)] \
    [--logging-metadata-fields=fields] \
    [other flags as needed]

其中

  • --logging-aggregation-interval=aggregation-interval 设置该子网中流日志的汇总时间间隔。该时间间隔可以设置为以下任何值:5 秒(默认)、30 秒、1 分钟、5 分钟、10 分钟或 15 分钟。
  • --logging-flow-sampling 是流采样率。流采样的范围可以设置为从 0.0(不采样)到 1.0(所有日志)。默认值为 0.5
  • --logging-filter-expr=expression 将日志收集限制为仅收集匹配表达式的日志。如需了解详情,请参阅日志过滤
  • --logging-metadata=(include-all | exclude-all | custom) 开启、关闭记录元数据注释,或将其设置为 custom。如果设置为 custom,还要指定 --logging-metadata-fields。默认为 include-all。注意:并非所有字段都包括在 include-all 中。如需了解详情,请参阅自定义元数据字段
  • --logging-metadata-fields 是您要包括到日志中的元数据字段的列表(以英文逗号分隔)。示例:--logging-metadata-fields=src_instance,dst_instance。仅当 --logging-metadata=custom 时才能设置。

API

在创建新子网时启用 VPC 流日志。

POST https://www.googleapis.com/compute/v1/projects/project-id/regions/region/subnetworks
{
  "logConfig": {
    "aggregationInterval": "aggregation-interval",
    "flowSampling": sampling-rate,
    "filterExpr": expression,
    "metadata": metadata-setting,
    "metadataFields": metadata-fields,
    "enable": true
  },
  "ipCidrRange": "ip-range",
  "network": "network-url",
  "name": "subnet-name"
}

请将占位符替换为有效值:

  • project-id 是将在其中创建子网的项目的 ID。
  • region 是将在其中创建子网的区域。
  • aggregation-interval 设置该子网中流日志的汇总时间间隔。此时间间隔可以设置为以下任何值:INTERVAL_5_SECINTERVAL_30_SECINTERVAL_1_MININTERVAL_5_MININTERVAL_10_MININTERVAL_15_MIN
  • sampling-rate 是流采样率。流采样的范围可以设置为从 0.0(不采样)到 1.0(所有日志)。默认值为 .0.5
  • expression 是用于过滤实际写入的日志的过滤条件表达式。如需了解详情,请参阅日志过滤
  • metadata-setting 指定是否记录所有元数据 (INCLUDE_ALL_METADATA)、不记录任何元数据 (EXCLUDE_ALL_METADATA),或者仅记录特定元数据 (CUSTOM_METADATA)。如果此字段设置为 CUSTOM_METADATA,还需要填充 metadataFields 字段。并非所有字段都包括在 INCLUDE_ALL_METADATA 中。如需了解详情,请参阅自定义元数据字段
  • metadata-fields 是您设置 metadata: CUSTOM_METADATA 后希望捕获的元数据字段。这是一个以英文逗号分隔的元数据字段列表,例如 src_instance, src_vpc.project_id
  • ip-range 是子网的主要内部 IP 地址范围。
  • network-url 是将在其中创建子网的 VPC 网络的网址。
  • subnet-name 是子网的名称。

如需了解详情,请参阅 subnetworks.insert 方法。

为现有子网启用 VPC 流日志记录

控制台

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击要更新的子网。
  3. 点击修改
  4. 流日志下,选择开启
  5. 如果要调整日志采样和汇总,请点击配置日志并调整以下任意项:
    • 汇总时间间隔
    • 是否在最后的日志条目中包括元数据
      默认情况下,包括元数据仅包括特定字段。如需了解详情,请参阅自定义元数据字段。如需自定义元数据字段,您必须使用 gcloud 命令行界面或 API。
    • 采样率100% 表示保留所有条目。
  6. 点击保存

gcloud

gcloud compute networks subnets update subnet-name \
    --enable-flow-logs \
    [--logging-aggregation-interval=aggregation-interval] \
    [--logging-flow-sampling=0.0...1.0] \
    [--logging-filter-expr=expression] \
    [--logging-metadata=(include-all | exclude-all | custom)] \
    [--logging-metadata-fields=fields]

其中

  • --logging-aggregation-interval=aggregation-interval 设置该子网中流日志的汇总时间间隔。该时间间隔可以设置为以下任何值:5 秒(默认)、30 秒、1 分钟、5 分钟、10 分钟或 15 分钟。
  • --logging-flow-sampling 是流采样率。流采样的范围可以设置为从 0.0(不采样)到 1.0(所有日志)。默认值为 .0.5
  • --logging-filter-expr=expression 将日志收集限制为仅收集匹配表达式的日志。如需了解详情,请参阅日志过滤
  • --logging-metadata=(include-all | exclude-all | custom) 开启、关闭记录元数据注释,或将其设置为 custom。如果设置为 custom,还要指定 --logging-metadata-fields。默认值为打开。 注意:include-all 不包括 GKE 注释。如需查看 GKE 注释,请选择 custom 并指定这些注释。
  • --logging-metadata-fields 是您要包括到日志中的元数据字段的列表(以英文逗号分隔)。示例:--logging-metadata-fields=src_instance,dst_instance。仅当 --logging-metadata=custom 时才能设置。

API

为现有子网启用 VPC 流日志。

PATCH https://www.googleapis.com/compute/v1/projects/project-id/regions/region/subnetworks/subnet-name
{
  "logConfig": {
    "enable": true
    ...other logging fields.
  },
  "fingerprint": "SUBNETWORK_FINGERPRINT"
}

请将占位符替换为有效值:

  • project-id 是子网所在项目的 ID。
  • region 是子网所在的区域。
  • subnet-name 是现有子网的名称。
  • SUBNET_FINGERPRINT 是现有子网的指纹 ID,由您在描述子网时提供。
  • 如需了解其他日志记录字段,请参阅在创建子网时启用 VPC 流日志记录

如需了解详情,请参阅 subnetworks.patch 方法。

查看现有子网的估算日志量

Google Cloud Console 会为现有子网提供日志量估算,然后您可以使用该估算值来估算启用流日志的费用。估算值基于过去 7 天内按照 5 秒的时间间隔为子网捕获的流。此外,每个日志的大小都取决于您是否启用了元数据注释。

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击要为其估算费用的子网。
  3. 点击修改
  4. 流日志下,选择开启
  5. 点击配置日志
  6. 查看估算的每日生成日志量,以了解估算值。
  7. 点击取消以免保存任何更改。

查看哪些子网启用了 VPC 流日志

您可以检查网络中的哪些子网启用了 VPC 流日志。

控制台

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 查看流日志列,了解日志记录功能是处于开启还是关闭状态。

gcloud

gcloud compute networks subnets list \
    --project project-id \
    --filter="network=network-url" \
    --format="csv(name,logConfig.enable)"

其中

  • project-id 是您正在查询的项目的 ID。
  • network-url 是包含子网的网络的 FQDN。

更新 VPC 流日志参数

您可以修改日志采样参数。如需详细了解您可以控制的参数,请参阅日志采样和汇总

控制台

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击要更新的子网。
  3. 点击修改
  4. 点击配置日志以调整日志采样和汇总
    • 汇总时间间隔
    • 是否在最后的日志条目中包括元数据
      默认情况下,包括元数据仅包括特定字段。如需了解详情,请参阅自定义元数据字段。如需自定义元数据字段,您必须使用 gcloud 命令行界面或 API。
    • 采样率100% 表示保留所有条目。
  5. 点击保存

gcloud

gcloud compute networks subnets update subnet-name \
    [--logging-aggregation-interval=aggregation-interval] \
    [--logging-flow-sampling=0.0...1.0] \
    [--logging-filter-expr=expression] \
    [--logging-metadata=(include-all | exclude-all | custom)] \
    [--logging-metadata-fields=fields]

其中

  • --logging-aggregation-interval=aggregation-interval 设置该子网中流日志的汇总时间间隔。该时间间隔可以设置为以下任何值:5 秒(默认)、30 秒、1 分钟、5 分钟、10 分钟或 15 分钟。
  • --logging-flow-sampling 是流采样率。流采样的范围可以设置为从 0.0(不采样)到 1.0(所有日志)。默认值为 .0.5
  • --logging-filter-expr=expression 将日志收集限制为仅收集匹配表达式的日志。如需了解详情,请参阅日志过滤
  • --logging-metadata=(include-all | exclude-all | custom) 开启、关闭记录元数据注释,或将其设置为 custom。如果设置为 custom,还要指定 --logging-metadata-fields。默认值为打开。 注意:include-all 不包括 GKE 注释。如需查看 GKE 注释,请选择 custom 并指定这些注释。
  • --logging-metadata-fields 是您要包括到日志中的元数据字段的列表(以英文逗号分隔)。示例:--logging-metadata-fields=src_instance,dst_instance。仅当 --logging-metadata=custom 时才能设置。

API

修改各日志采样字段,以更新 VPC 流日志行为。

PATCH https://www.googleapis.com/compute/v1/projects/project-id/regions/region/subnetworks/subnet-name
{
  "logConfig": {
    ...fields to modify
  },
  "fingerprint": "SUBNETWORK_FINGERPRINT"
}

请将占位符替换为有效值:

  • project-id 是子网所在项目的 ID。
  • region 是子网所在的区域。
  • subnet-name 是现有子网的名称。
  • SUBNET_FINGERPRINT 是现有子网的指纹 ID,由您在描述子网时提供。
  • 如需了解您可以修改的字段,请参阅在创建子网时启用 VPC 流日志记录

如需了解详情,请参阅 subnetworks.patch 方法。

为子网停用 VPC 流日志记录

控制台

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击要更新的子网。
  3. 点击修改
  4. 流日志下,选择关闭
  5. 点击保存

gcloud

gcloud compute networks subnets update subnet-name \
    --no-enable-flow-logs

API

在子网上停用 VPC 流日志即可停止收集日志记录。

PATCH https://www.googleapis.com/compute/v1/projects/project-id/regions/region/subnetworks/subnet-name
{
  "logConfig": {
    "enable": false
  },
  "fingerprint": "SUBNETWORK_FINGERPRINT"
}

请将占位符替换为有效值:

  • project-id 是子网所在项目的 ID。
  • region 是子网所在的区域。
  • subnet-name 是现有子网的名称。
  • SUBNET_FINGERPRINT 是现有子网的指纹 ID,由您在描述子网时提供。

如需了解详情,请参阅 subnetworks.patch 方法。

通过 Logging 访问日志

配置 IAM

按照 Logging 访问权限控制指南进行操作。

通过“日志查看器”页面查看日志。

为了执行这些命令,您需要提供您的项目的 ID

访问所有流日志

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 在第一个下拉菜单中选择 GCE 子网
  3. 在第二个下拉菜单中选择 vpc_flows
  4. 点击确定

或者,按照如下方式操作:

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 点击按标签过滤或搜索文字字段右侧的下拉箭头,然后选择转换为高级过滤条件
  3. 将以下内容粘贴到字段中。将 project-id 替换为您的项目 ID。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    
  4. 点击提交过滤条件

访问特定子网的日志

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 在第一个下拉菜单中,将光标移动到 GCE 子网,然后将其向右移动以打开单个子网选择菜单。
  3. 在第二个下拉菜单中,选择 vpc_flows
  4. 点击确定

或者,按照如下方式操作:

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 点击按标签过滤或搜索文字字段右侧的下拉箭头,然后选择转换为高级过滤条件
  3. 将以下内容粘贴到字段中。将 project-id 替换为您的项目 ID,将 subnet-name 替换为您的子网。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    resource.labels.subnetwork_name="subnet-name"
    
  4. 点击提交过滤条件

访问特定虚拟机的日志

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 点击按标签过滤或搜索文字字段右侧的下拉箭头,然后选择转换为高级过滤条件
  3. 将以下内容粘贴到字段中。将 project-id 替换为您的项目 ID,将 VM_NAME 替换为您的虚拟机。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.src_instance.vm_name="VM_NAME"
    
  4. 点击提交过滤条件

访问发往特定子网范围的流量的日志

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 点击按标签过滤或搜索文字字段右侧的下拉箭头,然后选择转换为高级过滤条件
  3. 将以下内容粘贴到字段中。将 project-id 替换为您的项目 ID,将 subnet-range 替换为 CIDR 范围 (192.168.1.0/24).
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    ip_in_net(jsonPayload.connection.dest_ip, subnet-range)
    
  4. 点击提交过滤条件

访问特定 GKE 集群的日志

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 点击按标签过滤或搜索文字字段右侧的下拉箭头,然后选择转换为高级过滤条件
  3. 将以下内容粘贴到字段中。将 project-id 替换为您的项目 ID,将 subnet-name 替换为您的子网。
    resource.type="gce_subnetwork"
    logName="projects/{#project_id}/logs/vpc_flows"
    jsonPayload.src_gke_details.cluster.cluster_name="{#cluster_name}" OR jsonPayload.dest_gke_details.cluster.cluster_name="{#cluster_name}"
    
  4. 点击提交过滤条件

访问特定端口和协议的日志

针对单个目标端口

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 点击按标签过滤或搜索文字字段右侧的下拉箭头,然后选择转换为高级过滤条件
  3. 将以下内容粘贴到字段中。将 project-id 替换为您的项目 ID,将 PORT 替换为目标端口,并将 PROTOCOL 替换为协议。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.dest_port=PORT
    jsonPayload.connection.protocol=PROTOCOL
    
  4. 点击提交过滤条件

针对多个目标端口

  1. 转到 Google Cloud Console 中的“日志”页面。
    转到“日志”页面
  2. 点击按标签过滤或搜索文字字段右侧的下拉箭头,然后选择转换为高级过滤条件
  3. 将以下内容粘贴到字段中。将 project-id 替换为您的项目 ID,将 PORT1PORT2 替换为目标端口,并将 PROTOCOL 替换为协议。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.dest_port=(PORT1 OR PORT2)
    jsonPayload.connection.protocol=PROTOCOL
    
  4. 点击提交过滤条件

将日志导出到 BigQuery、Pub/Sub 和自定义目标

您可以按照 Logging 文档中所述,将 Logging 中的流日志导出到您选择的目的地。请参阅上一部分中的示例过滤条件。

问题排查

Logging 中的 gce_subnetwork 资源下不显示任何 vpc_flows

  • 确认给定子网已启用日志记录。
  • 只有 VPC 网络支持 VPC 流。如果您使用的是旧式网络,则不会看到任何日志。
  • 共享 VPC 网络中,日志只会出现在宿主项目中,不会出现在服务项目中。务必在宿主项目中查找日志。
  • Logging 排除过滤条件会屏蔽指定的日志。确保没有会舍弃 VPC 流日志的排除规则。
    1. 转到资源使用情况
    2. 点击排除项标签。
    3. 确保没有可能会舍弃 VPC 流日志的排除规则。

某些日志中没有 RTT 或字节值

  • 如果没有获取足够的数据包作为样本来捕获 RTT,RTT 测量结果可能会缺失。在低容量连接中发生这种情况的几率更高。
  • 没有 RTT 值可用于 UDP 流。
  • 发送的某些数据包没有负载。如果抽样的是仅有标头的数据包,则字节值为 0。

某些流缺失

  • 只有 UDP 和 TCP 协议受支持。VPC 流日志不支持任何其他协议。
  • 对日志进行采样。某些数据包流的容量极小,可能会丢失。

某些日志中缺少 GKE 注释

如需详细了解 GKE 注释,请参阅 GKE 注释

  • 确保已在集群中启用 Google Kubernetes Engine Monitoring。在某些情况下,如果未启用 GKE Monitoring,可能会缺少某些注释。要检查集群中是否启用了 GKE 监控,请按照说明操作。
  • 如果在集群中启用了 GKE Monitoring,但仍然看到缺少 GKE 注释,则可以访问 Cloud Console 中您项目的 Monitoring API 信息中心 来检查将元数据更新发送到 Monitoring 的代理是否成功发送了更新。在某些情况下,由于超出 API 的配额,可能会发生错误。请转到 API 的配额信息中心,检查是否存在任何超出配额的错误。如果存在超出配额的错误,请按照管理配额中的说明申请增加配额。

某些 GKE 流缺少日志

确保已在集群中启用了节点内可见性。否则,系统不会记录同一节点上的 pod 之间的流。

即使您启用了流日志,看似仍处于停用状态

  • 当您为内部 HTTP(S) 负载平衡器配置代理专用子网并且使用 gcloud compute networks subnets 命令启用 VPC 流日志时,该命令看似执行成功,但流日志实际上并未启用。如果您还添加了 --purpose=INTERNAL_HTTPS_LOAD_BALANCER 标志,则 --enable-flow-logs 标志不会生效。

    使用 Cloud Console 或 API 启用流日志时,您会看到错误消息:“字段 'resource.enableFlowLogs':'true' 的值无效。具有 INTERNAL_HTTPS_LOAD_BALANCER 用途的子网中设置的字段无效”。

    由于代理专用子网没有虚拟机,因此 VPC 流日志不受支持。这是预期行为。

价格

适用 Logging、BigQuery 或 Pub/Sub 标准价格。如需了解 VPC 流日志价格,请参阅 Network Telemetry 价格

后续步骤