VPC Egress Gateway 可观测性¶
VPC Egress Gateway 可以在每个网关 Pod 中运行一个原生可观测性 sidecar。该 sidecar 可以暴露内部和外部网卡计数器、低基数 conntrack NAT 指标,并将版本化 NAT 流日志写入容器标准输出。这三项功能默认均禁用,不影响网关数据平面就绪状态。
使用要求和升级说明¶
- observer 使用 restartable init container,因此需要 Kubernetes 1.29 或更高版本,并启用
SidecarContainers特性。控制器会对一个零副本 Deployment 执行服务端 dry-run,并验证 API Server 是否保留 restartable init 策略。如果版本过低或未启用该特性,控制器不会注入 observer,并设置ObservabilityConfigured=False;网关数据平面仍会正常协调。控制器会重试短暂的能力探测错误;无法验证能力时,已存在的 observer 保持最后一个已知良好配置。 - 创建使用
spec.observability的资源前,需要显式升级vpc-egress-gateways.kubeovn.ioCRD。Helm 不会自动升级已安装的 CRD。请使用常规 CRD 升级流程,应用与 Kube-OVN 版本匹配的 CRD。 - conntrack 采集需要网关 Pod 网络命名空间中的
NET_ADMIN。官方 observer binary 仅带有CAP_NET_ADMINfile capability,生成的容器 security context 仅允许NET_ADMIN进入 capability bounding set。allowPrivilegeEscalation已启用,使该可信 file capability 在非 root launcher 执行exec后仍然生效;observer 仍以 UID 和 GID 65534 运行,丢弃其他所有 capability,并使用只读根文件系统。 - Prometheus Operator 是可选依赖。缺少 ServiceMonitor CRD 时,网关仍可正常工作。
启用可观测性¶
以下示例启用两个指标采集器和 JSON 流日志:
apiVersion: kubeovn.io/v1
kind: VpcEgressGateway
metadata:
name: gateway1
namespace: default
spec:
vpc: ovn-cluster
replicas: 2
externalSubnet: macvlan1
policies:
- snat: true
subnets:
- ovn-default
observability:
resources:
requests:
cpu: 20m
memory: 64Mi
limits:
cpu: 200m
memory: 256Mi
interfaceMetrics:
enabled: true
conntrack:
metrics:
enabled: true
log:
enabled: true
events: [start, end]
rateLimit:
recordsPerSecond: 100
burst: 1000
filters:
include: []
exclude: []
serviceMonitor:
labels:
monitoring: platform
annotations: {}
resources 为空或省略时,observer 的 request 为 20m CPU 和 64Mi 内存,limit 为 200m CPU 和 256Mi 内存。 interface-only 模式会持续测试,以确保稳态常驻内存不超过 20MiB;更大的默认 request 为 conntrack cache 和日志队列增长保留了空间。
控制器将运行时配置存储在每个网关的 ConfigMap 中。采集器开关、流日志事件、filter 和 rate limit 可在不替换网关 Pod 的情况下热加载。以下更改会更新 Deployment 并替换 Pod:
- 首次启用可观测性。
- 禁用所有可观测性功能。
- 更改
observability.resources。 - 更改网关工作负载镜像。
如果能力探测、ConfigMap 或 Service 更新短暂失败,控制器会报告可观测性 condition,并保留现有 observer 容器、volume 和辅助资源。数据平面协调会继续,不会因为可观测性错误替换使用最后一个已知良好配置的网关 Pod。
如果显式选择的旧工作负载镜像不包含 /kube-ovn/vpc-egress-gateway-observer,launcher 会改为执行 sleep infinity,因此缺少 binary 不会阻塞数据平面。包含 observer 的自定义镜像必须保留其 CAP_NET_ADMIN file capability;否则网卡指标仍可用,但 conntrack 指标和流日志会报告采集器错误。
指标¶
observer 在 TCP 端口 10666 上提供 /metrics 和 /healthz。observer 使用私有 Prometheus registry,不暴露 go_*、process_* 或 promhttp_* 指标。每个指标都包含 namespace、name、pod 和 node 身份标签。
对于每个网关,liveness probe 会在容器内执行 observer binary,并通过 loopback 检查 /healthz。这使 observer 健康状态不受节点到 Pod 的可达性影响,也使旧工作负载镜像在缺少 observer binary 并使用 sleep infinity 回退时能够通过探测。
网卡指标¶
每次 scrape 都会从 /proc/net/dev 读取网卡指标。observer 在首次成功 scrape 时通过 Pod network-status annotation 解析主网卡和外部 Multus 网卡,并在进程生命周期内缓存这些名称。
| 指标 | 附加标签 | 描述 |
|---|---|---|
kube_ovn_vpc_egress_gateway_interface_rx_bytes_total | interface、type | 接收字节数。 |
kube_ovn_vpc_egress_gateway_interface_tx_bytes_total | interface、type | 发送字节数。 |
kube_ovn_vpc_egress_gateway_interface_rx_packets_total | interface、type | 接收报文数。 |
kube_ovn_vpc_egress_gateway_interface_tx_packets_total | interface、type | 发送报文数。 |
kube_ovn_vpc_egress_gateway_interface_drops_total | interface、type、direction | 丢弃报文数。 |
kube_ovn_vpc_egress_gateway_interface_errors_total | interface、type、direction | 报文错误数。 |
type 标签为 internal 或 external,direction 为 rx 或 tx。
Conntrack 指标¶
Conntrack 指标不使用 IP 地址或端口作为标签,仅对流量进行汇总:
| 指标 | 附加标签 | 描述 |
|---|---|---|
kube_ovn_vpc_egress_gateway_conntrack_nat_flows_active | address_family、protocol、nat_type | 当前 NAT 流数,从 conntrack table dump 初始化并通过事件维护。 |
kube_ovn_vpc_egress_gateway_conntrack_nat_flows_started_total | address_family、protocol、nat_type | observer 订阅后观测到的 NAT 流启动总数。 |
kube_ovn_vpc_egress_gateway_conntrack_nat_flows_ended_total | address_family、protocol、nat_type | 观测到的 NAT 流结束事件总数。 |
kube_ovn_vpc_egress_gateway_conntrack_nat_packets_total | address_family、protocol、nat_type、direction | conntrack accounting 可用时观测到的报文数。 |
kube_ovn_vpc_egress_gateway_conntrack_nat_bytes_total | address_family、protocol、nat_type、direction | conntrack accounting 可用时观测到的字节数。 |
address_family 为 ipv4 或 ipv6。已知 protocol 值为 tcp、udp、sctp、icmp 和 icmpv6;其他协议号均汇总为 other。nat_type 为 snat、dnat 或 snat_dnat,direction 为 original 或 reply。
运行指标使用 kube_ovn_vpc_egress_gateway_observability_* 前缀。它们报告采集器可用性、配置重新加载结果、conntrack 事件和错误、cache 条目/容量/驱逐、已输出和已丢弃日志记录,以及 conntrack accounting 可用性。一个采集器失败不会导致 /metrics 失败,也不会隐藏另一个采集器的数据。
ServiceMonitor 发现¶
启用任一指标采集器时,控制器会为每个网关创建一个设置了 publishNotReadyAddresses: true 的 headless Service,其数字 targetPort 为 10666。控制器还会在网关所在命名空间创建 ServiceMonitor。observability.serviceMonitor 中的用户 label 和 annotation 会合并到 ServiceMonitor 元数据,但不能覆盖控制器必需的 selector label。
如果 ServiceMonitor CRD 不存在,控制器会设置 ServiceMonitorReady=False 并定期重试。CRD 可用后,控制器会自动创建 ServiceMonitor。该 condition 与现有网关 Ready condition 相互独立。
JSON 流日志¶
流日志以 JSON Lines 形式仅写入 observability 容器标准输出,诊断信息写入标准错误。使用以下命令读取记录:
kubectl logs -n default <gateway-pod> -c observability
v1 schema 输出 start 和 end 生命周期记录,不记录原始 conntrack update 事件。记录示例如下:
{"schemaVersion":"v1","timestamp":"2026-08-05T03:40:00Z","event":"end","conntrackID":2471802592,"zone":0,"namespace":"default","name":"gateway1","pod":"gateway1-7c9b8f8db7-r9x8m","node":"worker-1","addressFamily":"ipv4","protocol":"tcp","protocolNumber":6,"natType":["snat"],"original":{"sourceIP":"10.16.0.25","sourcePort":42136,"destinationIP":"203.0.113.10","destinationPort":443},"translated":{"sourceIP":"172.17.0.11","sourcePort":42136,"destinationIP":"203.0.113.10","destinationPort":443},"counters":{"originalPackets":8,"originalBytes":624,"replyPackets":7,"replyBytes":591}}
对于汇总为 other 的协议,protocolNumber 保留原始 IP 协议号。natType 是稳定排序的数组,可同时包含 dnat 和 snat。conntrack accounting 不可用时省略 counters 对象;observer 从不更改 nf_conntrack_acct。
observer 在 dump 现有 conntrack table 前订阅 conntrack 事件。现有 NAT 流会初始化 active-flow 指标和 cache,但不会生成历史 start 日志。cache 限制为 65,536 个条目。netlink 事件 channel 和异步日志队列均限制为 4,096 个条目。容器日志 consumer 阻塞或日志队列已满时,系统会丢弃日志记录,且不会阻塞 conntrack 采集。
默认情况下,系统记录所有 NAT 流和两种生命周期事件,每个 Pod 限制为每秒 100 条记录,最大突发记录数为 1,000。这些记录和指标是 best-effort 运行数据,不适用于计费精度的计量。
流日志 Filter¶
每条 include 或 exclude 规则可以匹配地址族、协议、NAT 类型以及原始或转换后 tuple 的字段。同一字段内的值按 OR 组合,同一规则内已配置的字段按 AND 组合,同一列表内的规则按 OR 组合。exclude 规则优先于 include 规则。空 include 列表匹配所有 NAT 流。
端口使用包含边界的结构化范围。以下配置会记录从 10.16.0.0/16 到目标端口 80 至 443 的 TCP SNAT 流,但排除转换后目标地址位于 192.0.2.0/24 的流:
spec:
observability:
conntrack:
log:
enabled: true
filters:
include:
- protocols: [tcp]
natTypes: [snat]
original:
sourceCIDRs: [10.16.0.0/16]
destinationPorts:
- start: 80
end: 443
exclude:
- translated:
destinationCIDRs: [192.0.2.0/24]