关于 VPC 流日志记录

本页面介绍了 VPC 流日志记录格式,包括可用的基本字段和元数据字段,还介绍了如何使用日志过滤,以便仅生成符合特定条件的日志。

记录格式

日志记录包含基本字段(即每个日志记录的核心字段)以及添加额外信息的元数据字段。可以省略元数据字段,以节省存储费用。

某些日志字段采用多字段格式,在给定字段中包含多段数据。例如,connection 字段采用 IpConnection 格式,它在单个字段中包含来源 IP 地址和目的地 IP 地址、端口以及协议。记录格式表下方介绍了这些采用多字段格式的字段。

元数据字段具有以下限制:

  • 元数据字段的值并非基于数据层面路径;这些值属于近似值,可能缺失或不正确。与元数据字段不同,基本字段的值直接取自数据包标头。
  • 对于 internet_routing_details 字段,自治系统 (AS) 路径在某些情况下可能会缺失。例如,在虚拟私有云 (VPC) 中路由数据包时,不包含 AS 路径信息。
字段 字段格式 字段类型:基本或可选元数据
连接 IpConnection
描述此连接的 5 元组
基础
reporter 字符串
报告流的一方。可以是 SRCDEST
基础
rtt_msec int64
延迟基于时间间隔测量,仅适用于 TCP 流。测量延迟是发送 SEQ 和接收相应的 ACK 之间所经历的时间。延迟结果是网络 RTT 与应用所耗用的时间之和。
基础
bytes_sent int64
从来源发送到目的地的字节数
基础
packets_sent int64
从来源发送到目的地的数据包数量
基础
start_time 字符串
在汇总时间间隔内观察到的第一个数据包的时间戳(RFC 3339 日期字符串格式)
基础
end_time 字符串
在汇总时间间隔内观察到的最后一个数据包的时间戳(RFC 3339 日期字符串格式)
基础
internet_routing_details InternetRoutingDetails
如果连接是 Google Cloud 与互联网之间的连接,则此字段会填充路由详细信息。仅适用于出站流。
元数据
src_gke_details GkeDetails
适用于来源端点的 GKE 元数据。只有在端点为 GKE 时才可用。
元数据
dest_gke_details GkeDetails
目的地端点的 GKE 元数据。只有在端点为 GKE 时才可用。
元数据
src_instance InstanceDetails
如果连接来源是位于同一 VPC 上的虚拟机,则此字段会填充虚拟机实例详细信息。在共享 VPC 配置中,project_id 对应于拥有该实例的项目(通常是服务项目)。
元数据
dest_instance InstanceDetails
如果连接目的地是位于同一 VPC 上的虚拟机,则此字段会填充虚拟机实例详细信息。在共享 VPC 配置中,project_id 对应于拥有该实例的项目(通常是服务项目)。
元数据
src_location GeographicDetails
如果连接来源是位于 VPC 外部的虚拟机,则此字段会填充可用位置元数据。
元数据
dest_location GeographicDetails
如果连接目的地是位于 VPC 外部的虚拟机,则此字段会填充可用位置元数据。
元数据
src_vpc VpcDetails
如果连接来源是位于同一 VPC 上的虚拟机,则此字段会填充 VPC 网络详细信息。在共享 VPC 配置中,project_id 与宿主项目的相应参数相对应。
元数据
dest_vpc VpcDetails
如果连接目的地是位于同一 VPC 上的虚拟机,则此字段会填充 VPC 网络详细信息。在共享 VPC 配置中,project_id 与宿主项目的此内容相对应。
元数据

IpConnection 字段格式

字段 类型 说明
协议 int32 IANA 协议编号
src_ip 字符串 来源 IP 地址
dest_ip 字符串 目标 IP 地址
src_port int32 来源端口
dest_port int32 目标端口

InternetRoutingDetails 字段格式

字段 类型 说明
egress_as_path AsPath 相关 AS 路径的列表。如果流有多个可用的 AS 路径,则该字段可能包含多个 AS 路径。

AsPath 字段格式

字段 类型 说明
as_details AsDetails AS 路径中所有系统的 AS 详细信息列表。该列表从 Google Cloud 网络的外部第一个 AS 开始,以远程 IP 地址所属的 AS 结束。

AsDetails 字段格式

字段 类型 说明
asn uint32 AS 的自治系统编号 (ASN)。

GkeDetails 字段格式

字段 类型 说明
集群 ClusterDetails GKE 集群元数据
pod PodDetails GKE Pod 元数据,当流量的来源或目的地是 Pod 时填充
服务 ServiceDetails GKE Service 元数据,仅填充在 Service 端点中。记录最多包含两项 Service。如果有两项以上的相关 Service,则此字段包含一个带有特殊 MANY_SERVICES 标记的 Service。

ClusterDetails 字段格式

字段 类型 说明
cluster_location 字符串 集群的位置。这可以是可用区或区域,具体取决于集群是可用区级还是区域级集群。
cluster_name 字符串 GKE 集群名称。

PodDetails 字段格式

字段 类型 说明
pod_name 字符串 Pod 的名称
pod_namespace 字符串 Pod 的命名空间

ServiceDetails 字段格式

字段 类型 说明
service_name 字符串 Service 的名称。如果有两个以上的相关 Service,则该字段设置为特殊 MANY_SERVICES 标记。
service_namespace 字符串 Service 的命名空间

示例:

如果有两项 Service,则 Service 字段如下所示:

service: [
 0: {
  service_name: "my-lb-service"
  service_namespace: "default"
 }
 1: {
  service_name: "my-lb-service2"
  service_namespace: "default"
 }
]

如果有两项以上的 Service,则 Service 字段如下所示:

service: [
 0: {
  service_name: "MANY_SERVICES"
 }
]

InstanceDetails 字段格式

字段 类型 说明
project_id 字符串 包含此虚拟机的项目的 ID
区域 字符串 虚拟机的区域
vm_name 字符串 虚拟机的实例名称
可用区 字符串 虚拟机的地区

GeographicDetails 字段格式

字段 类型 说明
asn int32 此端点所属的外部网络的 ASN。
city 字符串 外部端点所在的城市
continent 字符串 外部端点所在的大洲
country 字符串 外部端点所在的国家/地区,采用 ISO 3166-1 Alpha-3 国家/地区代码的形式表示
区域 字符串 外部端点所在的区域

VpcDetails 字段格式

字段 类型 说明
project_id 字符串 包含 VPC 的项目的 ID
subnetwork_name 字符串 运行虚拟机的子网
vpc_name 字符串 运行虚拟机的 VPC

元数据注释

日志记录包含基本字段和元数据字段。记录格式部分列出了哪些字段是元数据类型,哪些是基本类型。所有基本字段始终包含在内。您可以自定义要保留哪些元数据字段。

  • 如果您选择了所有元数据,则流日志将包含 VPC 流日志记录格式中的所有元数据字段。向记录格式添加新的元数据字段后,流日志会自动包含新字段。

  • 如果您不选择任何元数据,则所有元数据字段都将被忽略。

  • 如果选择自定义元数据,您可以通过父字段(如 src_vpc)或其全名(如 src_vpc.project_id)指定要包含的元数据字段

    将新的元数据字段添加到记录格式后,这些字段会从流日志中排除,除非它们位于您指定要包含的父字段中。

    • 如果使用父字段指定自定义元数据,则在向父字段内的记录格式添加新元数据字段后,流日志将自动包含新字段。

    • 如果使用字段的全名指定自定义元数据,则添加到父字段的新元数据字段会从流日志中排除。

如需了解如何自定义元数据字段,请参阅在创建子网时启用 VPC 流日志记录的 Google Cloud CLI 或 API 说明。

GKE 元数据注解

在 GKE 集群中具有端点的流可以使用 GKE 元数据注释进行注释,其中可以包含该端点的集群、Pod 和 Service 的详细信息。

GKE Service 注释

发送到 ClusterIP、NodePort 或 LoadBalancer 的流量可以接收 Service 注释。如果发送到 NodePort 或 LoadBalancer,则流在连接的两个跃点上接收 Service 注释。

直接发送到 Pod 的 Service 端口的流量通过目的地端点上的 Service 注释进行注释。

发送到 Pod 的 Service 端口的流量(其中 Pod 支持同一 Service 端口上的多个 Service)在目的地端点上标注了多个 Service。这仅限于两项 Service。如果超过了该数量,端点将带有一个特殊的 MANY_SERVICES 标记。

互联网流量上的 Pod 注释

默认情况下,Pod 和互联网之间的流量不会接收 Pod 注解。VPC 流日志无法添加 Pod 注解,因为对于发送到互联网的数据包,伪装代理会在 VPC 流日志查看数据包之前将 Pod IP 地址转换为节点 IP 地址。

由于伪装问题,仅当目的地位于默认非伪装目的地自定义 nonMasqueradeCIDRs 列表之一时,Pod 注释才可见。如果您将互联网目的地添加到自定义 nonMasqueradeCIDRs 列表中,则需要提供一种方法来转换内部 Pod IP 地址,然后才将其传送到互联网。对于专用集群和非专用集群,您可以使用 Cloud NAT。如需了解详情,请参阅 GKE 互动

日志过滤

启用 VPC 流日志时,您可以根据基本字段和元数据字段设置过滤条件,以仅保留与该过滤条件匹配的日志。所有其他日志在写入 Logging 之前都会被舍弃,这样可以节省资金并缩短查找所需信息的时间。

您可以根据记录格式中列出的任意字段子集进行过滤,但以下字段除外:

  • rtt_msec
  • bytes_sent
  • packets_sent
  • start_time
  • end_time

VPC 流日志过滤使用 CEL,这是一种基于特性 (Attribute) 的逻辑表达式的嵌入式表达式语言。VPC 流日志的过滤表达式不得超过 2,048 个字符。如需了解详情,请参阅支持的 CEL 逻辑运算符

如需详细了解 CEL,请参阅 CEL 简介语言定义。生成过滤器功能仅支持有限的 CEL 语法子集。

如需了解如何创建使用日志过滤的子网,请参阅有关创建子网时启用 VPC 流日志的 gcloud CLI 或 API 说明。

如需了解如何配置日志过滤,请参阅 gcloud CLI 或 API 说明,了解如何更新 VPC 流日志参数

示例 1:只允许收集名为 my-vm 的特定虚拟机的日志。在这种情况下,仅记录符合下列条件的日志:流量来源报告的 src_instance 字段为 my-vm,或者流量目的地报告的 dst_instance 字段为 my-vm

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr="(src_instance.vm_name == 'my-vm' && reporter=='SRC') || (dest_instance.vm_name == 'my-vm' && reporter=='DEST')"

示例 2:只允许收集其来源 IP 地址位于 10.0.0.0/8 子网中的数据包的日志。

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr="inIpRange(connection.src_ip, '10.0.0.0/8')"

示例 3:只收集 VPC 外部流量的日志。

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr '!(has(src_vpc.vpc_name) && has(dest_vpc.vpc_name))'

支持的 CEL 逻辑运算符

表达式 受支持的类型 说明
true、false 布尔值 布尔常量

x == y

x != y

布尔值、整数、字符串

比较运算符

示例:connection.protocol == 6

x && y

x || y

布尔值

布尔值逻辑运算符

示例:connection.protocol == 6 && src_instance.vm_name == "vm_1"

!x 布尔值 取反
1, 2.0, 0, ... Int 数字字面常量
x + y 字符串 字符串串联
"foo", 'foo', ... 字符串 字符串字面常量
x.lower() 字符串 返回字符串 x 的小写值
x.upper() 字符串 返回字符串 x 的大写值
x.contains(y) 字符串 如果字符串包含指定的子字符串,则返回 true
x.startsWith(y) 字符串 如果字符串以指定的子字符串开头,则返回 true
x.endsWith(y) 字符串 如果字符串以指定的子字符串结尾,则返回 true
inIpRange(X, Y) 字符串

如果 X 是 IP 地址且 Y 是包含 X 的 IP 地址范围,则返回 true

示例:inIpRange("1.2.3.1", "1.2.3.0/24")

x.containsFieldValue(y) x: list
y: map(string, string)

如果列表包含的对象的字段与指定的键值对匹配,则返回 true

示例:dest_gke_details.service.containsFieldValue({'service_name': 'service1', 'service_namespace': 'namespace1'})

has(x) 字符串

如果该字段存在,则返回 true。

后续步骤