VPC 流日志

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

您可以在 Cloud Logging 中查看流日志,并将日志导出至 Cloud Logging 导出功能支持的任意目的地。

流日志通过连接从 Compute Engine 虚拟机进行汇总并实时导出。通过订阅 Pub/Sub,您可以使用实时流式传输 API 来分析流日志。

关键属性

  • VPC 流日志是 Andromeda 的一部分,后者是为 VPC 网络提供支持的软件。VPC 流日志在启用后不会造成延迟或性能损失。
  • VPC 流日志支持 VPC 网络,但不支持传统网络。您可以按子网启用或停用 VPC 流日志。为子网启用 VPC 流日志后,VPC 流日志会从该子网中的所有虚拟机实例收集数据。
  • VPC 流日志对每个虚拟机的 TCP、UDP、ICMP、ESP 和 GRE 流进行采样。系统将对入站和出站流进行采样。这些流可以存在于虚拟机与其他虚拟机、本地数据中心的主机、Google 服务或者互联网上的主机之间。如果通过采样采集流,VPC 流日志将生成该流的日志。每个流记录都包含记录格式部分中所述的信息。
  • VPC 流日志通过以下方式与防火墙规则进行交互:
    • 出站数据包在出站防火墙规则之前进行抽样。即使出站防火墙规则拒绝出站数据包,VPC 流日志也可以对这些数据包进行采样。
    • 入站数据包依照入站防火墙规则进行采样。如果入站防火墙规则拒绝入站数据包,则 VPC 流日志不会对这些数据包进行采样。
  • 您可以在 VPC 流日志中使用过滤条件以仅生成某些日志。
  • VPC 流日志支持具有多个网络接口的虚拟机。您需要为每个包含网络接口的每个子网启用 VPC 流日志。
  • 如需记录同一 Google Kubernetes Engine (GKE) 节点上的 Pod 之间的流,您必须为集群启用节点内可见性

使用场景

网络监控

VPC 流日志为您提供网络吞吐量和性能的实时显示。您可以执行以下操作:

  • 监控 VPC 网络
  • 执行网络诊断
  • 按虚拟机和应用过滤流日志以了解流量变化
  • 了解流量增长情况以执行容量预测

了解网络使用情况并优化网络流量费用

您可以使用 VPC 流日志分析网络使用情况。您可以分析网络流以获取以下信息:

  • 地区和区域之间的流量
  • 发往互联网特定国家/地区的流量
  • 用量最高者

根据分析结果,您可以优化网络流量费用。

网络取证

您可以利用 VPC 流日志进行网络取证。例如,如果出现突发事件,您可以检查以下内容:

  • 哪些 IP 在何时与谁进行过通信
  • 通过分析所有入站和出站网络流来调查任何遭入侵的 IP

实时安全分析

您可以通过 Pub/Sub 利用实时流式传输 API,还可以集成 SIEM(安全信息和事件管理)系统。这样能够进行实时监控、事件关联、分析和安全提醒。

日志收集

按特定时间间隔为每个虚拟机连接收集流日志。针对给定连接的给定时间间隔收集的所有数据包会在一段时间(汇总时间间隔)汇总到单个流日志条目。然后,此数据会发送到 Logging

日志默认在 Logging 中存储 30 天。如果您希望延长日志保留时间,可以设置自定义保留期限导出日志到支持的平台。

日志采样和处理

Google Cloud 会对离开和进入虚拟机的数据包进行采样,以生成流日志。并非每个数据包都会被捕获到其自己的日志记录中。每 30 个数据包中约有 1 个数据包会被捕获,不过根据虚拟机上负载的不同,具体采样率可能会更低。此比率无法调整。

流日志生成后,Google Cloud 会按照以下过程来处理这些流日志:

  1. 过滤:您可以指定只生成与指定条件匹配的日志。例如,您可以过滤,以便仅生成特定虚拟机的日志或仅生成具有特定元数据值的日志,并舍弃其余日志。 如需了解详情,请参阅日志过滤
  2. 汇总:系统会按可配置的汇总时间间隔汇总有关采样的数据包的信息,以生成一个流日志条目
  3. 流日志采样:这是第二个采样流程。系统会根据可配置的采样率参数,对流日志条目进行进一步采样。
  4. 元数据:如果停用,则会舍弃所有元数据注释。如果要保留元数据,可以指定保留所有字段或某些指定的字段。如需了解详情,请参阅元数据注解
  5. 写入 Logging:最终日志条目会写入 Cloud Logging。

由于 VPC 流日志不会采集每个数据包,因此它会通过从采集的数据包进行插值来补偿丢失的数据包。由于初始配置和用户可配置的采样设置而丢失的数据包会发生这种情况。

尽管 Google Cloud 无法捕获每一个数据包,日志记录捕获量也可能相当庞大。您可以通过调整日志收集的以下方面来平衡流量可见性和存储费用需求:

  • 汇总时间间隔:在一段时间间隔内采样的数据包会汇总到单个日志条目。此时间间隔可以是 5 秒(默认)、30 秒、1 分钟、5 分钟、10 分钟或 15 分钟。
  • 采样率:在写入 Logging 之前,可以对日志数进行采样,以减少其数量。默认情况下,日志条目量按 0.5 (50%) 扩缩,这意味着会保留一半的条目。您可以将此值的范围设置为从 1.0(100%,保留所有日志条目)到 0.0(0%,不保留任何日志)。
  • 元数据注释:默认情况下,流日志条目使用元数据信息进行注释,例如来源虚拟机和目的地虚拟机的名称或外部来源和目的地的地理地区。元数据注释可以关闭,也可以仅指定特定注释以节省存储空间。
  • 过滤:默认情况下,系统会为子网中的每个流生成日志。您可以设置过滤条件,以便仅生成符合特定条件的日志。

元数据注释

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

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

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

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

    将新的元数据字段添加到记录格式后,流日志将不会包含这些字段,除非这些字段是您在父字段中指定要包含的新字段。

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

    • 如果使用字段的全名指定自定义元数据,在向父字段添加新元数据字段后,流日志将不会包含新字段。

如需了解如何自定义元数据字段,请参阅在创建子网时启用 VPC 流日志记录的 gcloud 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 注释。对于发送到互联网的数据包,伪装代理会将 Pod IP 地址转换为节点 IP 地址,然后 VPC 流日志才会看到数据包,因此 VPC 流日志不知道 Pod 的任何信息,也无法添加 Pod 注释。

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

记录格式

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

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

字段 字段格式 字段类型:基本或可选元数据
连接 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 日期字符串格式)
基础
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 目标端口

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)。
城市 字符串 外部端点所在的城市
continent 字符串 外部端点所在的大洲
country 字符串 外部端点所在的国家/地区,采用 ISO 3166-1 Alpha-3 国家/地区代码的形式表示
区域 字符串 外部端点所在的区域

VpcDetails 字段格式

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

日志过滤

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

您可以根据记录格式对任意字段子集进行过滤。

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

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

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

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

示例 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。

流量模式示例

本部分演示了 VPC 流日志如何用于各种用例。

同一 VPC 网络中虚拟机之间的流

一个 VPC 网络内的虚拟机流。
VPC 网络中的虚拟机流。(点击可放大。)

对于同一个 VPC 网络内虚拟机之间的流,只要两个虚拟机位于启用了 VPC 流日志的子网中,系统就会报告来自两个虚拟机的流日志。在此示例中,虚拟机 10.10.0.2 向虚拟机 10.50.0.2 发送一个 1,224 字节的请求,该虚拟机也位于已启用日志记录的子网中。反过来,10.50.0.2 会响应该请求,并返回一个包含 5,342 字节的回复。请求和回复都是由发出请求和做出响应的虚拟机记录的。

由发出请求的虚拟机 (10.10.0.2) 报告
请求/回复 connection.src_ip connection.dest_ip bytes_sent 注解
请求 10.10.0.2 10.50.0.2 1224 src_instance.*
dest_instance.*
src_vpc.*
dest_vpc.*
回复 10.50.0.2 10.10.0.2 5,342 src_instance.*
dest_instance.*
src_vpc.*
dest_vpc.*
由做出响应的虚拟机 (10.50.0.2) 报告
请求/回复 connection.src_ip connection.dest_ip 字节 注解
请求 10.10.0.2 10.50.0.2 1224 src_instance.*
dest_instance.*
src_vpc.*
dest_vpc.*
回复 10.50.0.2 10.10.0.2 5,342 src_instance.*
dest_instance.*
src_vpc.*
dest_vpc.*

虚拟机到外部 IP 地址的流

虚拟机到外部 IP 地址的流。
虚拟机到外部 IP 地址的流(点击可放大)。

对于在 VPC 网络中的虚拟机与具有外部 IP 地址的端点之间遍历互联网的流,仅由 VPC 网络中的虚拟机报告流日志:

  • 对于出站流,由作为流量来源的 VPC 网络虚拟机报告日志。
  • 对于入站流,由作为流量目的地的 VPC 网络虚拟机报告日志。

在此示例中,虚拟机 10.10.0.2 通过互联网与具有外部 IP 地址 203.0.113.5 的端点交换数据包。从 10.10.0.2 发送到 203.0.113.5 的出站流量(1,224 字节)由来源虚拟机 10.10.0.2 报告。从 203.0.113.5 发送到 10.10.0.2 的入站流量(5,342 字节)由该流量的目的地虚拟机 10.10.0.2 报告。

请求/回复 connection.src_ip connection.dest_ip bytes_sent 注解
请求 10.10.0.2 203.0.113.5 1224 src_instance.*
src_vpc.*
dest_location.*
回复 203.0.113.5 10.10.0.2 5,342 dest_instance.*
dest_vpc.*
src_location.*

虚拟机到本地的流

虚拟机到本地的流。
虚拟机到本地的流(点击可放大)。

对于 VPC 网络中的虚拟机与具有内部 IP 地址的本地端点之间的流,仅由 VPC 网络中的虚拟机报告流日志:

  • 对于出站流,由作为流量来源的 VPC 网络虚拟机报告日志。
  • 对于入站流,由作为流量目的地的 VPC 网络虚拟机报告日志。

在此示例中,虚拟机 10.10.0.2 和本地端点 10.30.0.2 通过 VPN 网关或 Cloud Interconnect 进行连接。从 10.10.0.2 发送到 10.30.0.2 的出站流量(1,224 字节)由来源虚拟机 10.10.0.2 报告。从 10.30.0.2 发送到 10.10.0.2 的入站流量(5,342 字节)由该流量的目的地虚拟机 10.10.0.2 报告。

请求/回复 connection.src_ip connection.dest_ip bytes_sent 注解
请求 10.10.0.2 10.30.0.2 1224 src_instance.*
src_vpc.*
回复 10.30.0.2 10.10.0.2 5,342 dest_instance.*
dest_vpc.*

共享 VPC 中虚拟机之间的流

共享 VPC 流。
共享 VPC 流(点击可放大)。

对于共享 VPC 中虚拟机之间的流,您可以为宿主项目中的子网启用 VPC 流日志。例如,子网 10.10.0.0/20 属于宿主项目中定义的共享 VPC 网络。您可以查看属于此子网的虚拟机发出的流日志,包括服务项目创建的日志。在此示例中,服务项目名为“webserver”、“recommendation”、“database”。

对于虚拟机之间的流,如果两台虚拟机在同一个项目中或使用一个共享网络,则为连接中的另一个端点提供相同的宿主项目、项目 ID 的注释等。如果其他虚拟机位于不同的项目中,则不会为该虚拟机提供注释。

下表展示了由 10.10.0.1010.10.0.20 报告的流。

  • src_vpc.project_iddest_vpc.project_id 用于宿主项目,因为 VPC 子网属于宿主项目。
  • src_instance.project_iddest_instance.project_id 用于服务项目,因为实例属于服务项目。
connection
.src_ip
src_instance
.project_id
src_vpc
.project_id
connection
.dest_ip
dest_instance
.project_id
dest_vpc
.project_id
10.10.0.10 webserver host_project 10.10.0.20 recommendation host_project

服务项目没有自有的共享 VPC 网络,也无权访问共享 VPC 网络的流日志。

VPC 对等互连中虚拟机之间的流

VPC 网络对等互连流(点击可放大)。
VPC 网络对等互连流(点击可放大)。

除非两台虚拟机在同一个 Google Cloud 项目中,否则对等互连 VPC 网络的虚拟机之间的流与外部端点的报告方式相同,不提供另一个虚拟机的项目和其他注释信息。如果这两个虚拟机在同一个项目中,即使位于不同的网络中,也会为另一个虚拟机提供项目和其他注释信息。

在此示例中,虚拟机 10.10.0.2(位于项目 analytics-prod 中)和虚拟机 10.50.0.2(位于项目 webserver-test 中)通过 VPC 对等互连进行连接。在项目 analytics-prod 中启用 VPC 流日志时,从 10.10.0.2 发送到 10.50.0.2 的流量(1224 字节)由虚拟机 10.10.0.2(流的来源)报告。从 10.50.0.2 发送到 10.10.0.2 的流量(5342 字节)也是由虚拟机 10.10.0.2(流的目的地)报告。

在此示例中,项目 webserver-test 中未启用 VPC 流日志,因此虚拟机 10.50.0.2 不会记录任何日志。

reporter connection.src_ip connection.dest_ip bytes_sent 注解
来源 10.10.0.2 10.50.0.2 1224 src_instance.*
src_vpc.*
目标 10.50.0.2 10.10.0.2 5,342 dest_instance.*
dest_vpc.*

内部直通式网络负载均衡器中虚拟机之间的流

内部直通式网络负载均衡器流(点击可放大)。
内部直通式网络负载均衡器流(点击可放大)。

将虚拟机添加到内部直通式网络负载均衡器的后端服务时,Linux 或 Windows 客机环境会将此负载均衡器的 IP 地址添加到该虚拟机的本地路由表中。这样,该虚拟机就可以接受目的地设置为此负载平衡器的 IP 地址的请求数据包。当该虚拟机回复时,它会直接发送响应;但是,响应数据包的来源 IP 地址会设置为负载平衡器的 IP 地址(而不是实现负载平衡的虚拟机)。

通过内部直通式网络负载均衡器发送的虚拟机之间的流会同时由来源和目的地报告。对于示例 HTTP 请求/响应对,下表说明了观察到的流日志条目的字段。 为便于说明这一点,请考虑以下网络配置:

  • 浏览器实例,位于 192.168.1.2
  • 内部直通式网络负载均衡器,位于 10.240.0.200
  • 网络服务器实例,位于 10.240.0.3
流量方向 reporter connection.src_ip connection.dest_ip connection.src_instance connection.dest_instance
请求 SRC 192.168.1.2 10.240.0.200 浏览器实例
请求 DEST 192.168.1.2 10.240.0.200 浏览器实例 网络服务器实例
响应 SRC 10.240.0.3 192.168.1.2 网络服务器实例 浏览器实例
响应 DEST 10.240.0.200 192.168.1.2 浏览器实例

发出请求的虚拟机不知道哪个虚拟机将响应该请求。此外,由于另一个虚拟机会发送将内部负载平衡器 IP 作为来源地址的响应,因此它不知道哪个虚拟机做出了响应。 由于这些原因,发出请求的虚拟机无法将 dest_instance 信息添加到其报告中,只能添加 src_instance 信息。由于做出响应的虚拟机确实知道另一个虚拟机的 IP 地址,因此它可以同时提供 src_instancedest_instance 信息。

Pod 到 ClusterIP 流

Pod 到集群 IP 地址流(点击可放大)。
Pod 到集群 IP 地址流(点击可放大)。

在此示例中,流量会从客户端 Pod (10.4.0.2) 发送到 cluster-service (10.0.32.2:80)。系统会将目的地解析为目标端口 (8080) 上选定的服务器 Pod IP 地址 (10.4.0.3)。

在节点边缘上,流会使用转换后的 IP 地址和端口进行两次采样。对于这两个采样点,我们将识别目的地 Pod 是否支持端口 8080 上的 cluster-service 服务,并在记录中添加 Service 详情和 Pod 详情。如果流量被路由到同一节点上的 Pod,则流量不会离开该节点,并且根本不会进行采样。

在此示例中,找到以下记录。

报告者 connection.src_ip connection.dst_ip bytes_sent 注解
SRC 10.4.0.2 10.4.0.3 1224 src_instance.*
src_vpc.*
src_gke_details.cluster.*
src_gke_details.pod.*
dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.pod.*
dest_gke_details.service.*
DEST 10.4.0.2 10.4.0.3 1224 src_instance.*
src_vpc.*
src_gke_details.cluster.*
src_gke_details.pod.*
dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.pod.*
dest_gke_details.service.*

GKE 外部 LoadBalancer 流

外部负载均衡器流(点击可放大)。
外部负载均衡器流(点击可放大)。

从外部 IP 地址到 GKE 服务 (35.35.35.35) 的流量将路由到集群中的节点(在此示例中为 10.0.12.2)以实现路由。默认情况下,外部直通式网络负载均衡器会在集群的所有节点之间分配流量,即使未运行相关 Pod 的节点也是如此。流量可能需要额外的跃点才能到达相关 Pod。如需了解详情,请参阅集群外部网络

然后,流量会从节点 (10.0.12.2) 路由到选定的服务器 Pod (10.4.0.2)。由于所有节点边缘都经过采样,因此系统会记录两个跃点。如果流量路由到同一节点上的 Pod(在此示例中为 10.4.0.3),则系统不会记录第二个跃点,因为它未离开该节点。第二个跃点由两个节点的采样点记录。第二个跃点由两个节点的采样点记录。对于第一个跃点,我们根据负载平衡器 IP 和 Service 端口 (80) 确定 Service。对于第二个跃点,我们确定目的地 Pod 支持目标端口 (8080) 上的 Service。

在此示例中,找到以下记录。

报告者 connection.src_ip connection.dst_ip bytes_sent 注解
DEST 203.0.113.1 35.35.35.35 1224 src_location.*
dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.service.*
SRC 10.0.12.2 10.4.0.2 1224 src_instance.*
src_vpc.*
src_gke_details.cluster.*
dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.pod.*
dest_gke_details.service.*
DEST 10.0.12.2 10.4.0.2 1224 src_instance.*
src_vpc.*
src_gke_details.cluster.*
dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.pod.*
dest_gke_details.service.*

GKE Ingress 流

Ingress 流(点击可放大)。
Ingress 流(点击可放大)。

从公共 IP 地址到 Ingress 目的地的连接会在负载平衡器服务上终结。根据网址将连接映射到 NodePort Service。为了处理请求,负载平衡器 (130.211.0.1) 会连接到其中一个集群节点 (10.0.12.2),以便使用 Service 的 NodePort 进行路由。默认情况下,在创建 Ingress 时,GKE Ingress 控制器会配置一个 HTTP(S) 负载均衡器,以将流量分配到集群中的所有节点,甚至包括未运行相关 Pod 的节点。流量可能需要额外的跃点才能到达相关 Pod。如需了解详情,请参阅集群外部网络。然后,流量从节点 (10.0.12.2) 路由到选定的服务器 Pod (10.4.0.2)。

由于所有节点边缘都经过采样,因此系统会记录两个跃点。对于第一个跃点,我们根据 Service 的 NodePort (60000) 确定 Service。对于第二个跃点,我们确定目的地 Pod 支持目标端口 (8080) 上的 Service。第二个跃点由两个节点的采样点记录。但是,如果流量路由到同一节点 (10.4.0.3) 上的 Pod,则不会记录第二个跃点,因为流量未离开该节点。

在此示例中,找到以下记录。

报告者 connection.src_ip connection.dst_ip bytes_sent 注解
DEST 130.211.0.1 10.0.12.2 1224 dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.service.*
SRC 10.0.12.2 10.4.0.2 1224 src_instance.*
src_vpc.*
src_gke_details.cluster.*
dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.pod.*
dest_gke_details.service.*
DEST 10.0.12.2 10.4.0.2 1224 src_instance.*
src_vpc.*
src_gke_details.cluster.*
dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.pod.*
dest_gke_details.service.*

使用容器原生负载平衡的 GKE Ingress 流

使用容器原生负载均衡的 Ingress 流(点击可放大)。
使用容器原生负载均衡的 Ingress 流(点击可放大)。

从公共 IP 地址发送到使用容器原生负载平衡的 Ingress 的请求会在负载平衡器终结。在此类型的 Ingress 中,Pod 是负载平衡的核心对象。然后,请求会从负载平衡器(130.211.0.1)直接发送到选定的 Pod(10.4.0.2)。我们确定目的地 Pod 支持目标端口 (8080) 上的 Service。

在此示例中,找到以下记录。

报告者 connection.src_ip connection.dst_ip bytes_sent 注解
DEST 130.211.0.1 10.4.0.2 1224 dest_instance.*
dest_vpc.*
dest_gke_details.cluster.*
dest_gke_details.pod.*
dest_gke_details.service.*

Pod 到外部流

Pod 到外部的流(点击可放大)。
Pod 到外部的流(点击可放大)。

从 Pod (10.4.0.3) 到外部 IP 地址 (203.0.113.1) 的流量会被 IP 地址伪装修改,因此,数据包从节点 IP 地址 (10.0.12.2)(而不是 Pod IP 地址)发出。默认情况下,GKE 集群配置为将流量伪装成外部目的地。如需了解详情,请参阅 IP 地址伪装代理

为了查看此流量的 Pod 注释,您可以将伪装代理配置为不伪装 Pod IP 地址。在这种情况下,如需允许将流量传入互联网,您可以配置 Cloud NAT 以处理 Pod IP 地址。如需详细了解 Cloud NAT 与 GKE,请查看 GKE 交互

在此示例中,找到以下记录。

报告者 connection.src_ip connection.dst_ip bytes_sent 注解
SRC 10.0.12.2 203.0.113.1 1224 src_instance.*
src_vpc.*
src_gke_details.cluster.*
dest_location.*

价格

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

常见问题解答

  • VPC 流日志是否包含基于防火墙规则允许和拒绝的流量?

    • VPC 流日志涵盖从虚拟机角度观察到的流量。对于来自虚拟机的所有出站(传出)流量,即使该流量被出站流量拒绝防火墙规则阻止,系统也会将该流量记录到日志中。如果入站(传入)流量被入站允许防火墙规则允许,则会记录该流量。不会记录入站流量拒绝防火墙规则阻止的入站流量。
  • VPC 流日志是否可以与具有多个接口的虚拟机实例配合使用?

  • VPC 流日志是否可以与旧版网络配合使用?

后续步骤