Envoy 的统计信息

Envoy 代理收集了关于网络流量的详细统计信息。

Envoy 的统计信息只覆盖了特定 Envoy 实例的流量。参考可观测性 了解关于服务级别的 Istio 遥测方面的内容。这些由 Envoy 代理产生的统计数据记录能够提供更多关 Pod 实例的具体信息。

查看某个 Pod 的统计信息:

$ kubectl exec "$POD" -c istio-proxy -- pilot-agent request GET stats

Envoy 会生成与 Pod 行为相关的统计数据,并通过代理函数来限定统计范围。 参考示例包括:

Istio 默认配置下 Envoy 只会记录最小化的统计信息, 以减少代理服务器的整体 CPU 和内存占用情况。缺省的关键词集合有:

  • cluster_manager
  • listener_manager
  • server
  • cluster.xds-grpc

要查看关于统计数据收集的 Envoy 配置,可以使用 istioctl proxy-config bootstrap 命令,还可以参考深入研究 Envoy 配置。 Envoy 只收集在 stats_matcher JSON 字段中能匹配上 inclusion_list 的统计数据。

想让 Istio 代理能够记录更多的统计信息,您可以在您的网格配置中添加 ProxyConfig.ProxyStatsMatcher。 例如,为了全局启用断路器、请求重试、上游连接和请求超时的统计数据, 您可以指定如下的数据统计的匹配配置:

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    defaultConfig:
      proxyStatsMatcher:
        inclusionRegexps:
          - ".*outlier_detection.*"
          - ".*upstream_rq_retry.*"
          - ".*upstream_cx_.*"
        inclusionSuffixes:
          - "upstream_rq_timeout"

通过使用每个代理的 proxy.istio.io/config 注解,您也可以重载全局数据统计对应的配置。 例如,为了生成上述相同的统计数据,您可以在一个 Gateway 代理或者工作负载上添加以下注解:

metadata:
  annotations:
    proxy.istio.io/config: |-
      proxyStatsMatcher:
        inclusionRegexps:
        - ".*outlier_detection.*"
        - ".*upstream_rq_retry.*"
        - ".*upstream_cx_.*"
        inclusionSuffixes:
        - "upstream_rq_timeout"

Istio 对 Envoy 资源的命名

Envoy 按其所属的集群、连接管理器或侦听器地址来确定大多数统计信息的范围。 Istio 在将网格配置转换为 Envoy 配置时生成集群和连接管理器名称, 因此它们也出现在统计名称、Prometheus 标签和访问日志中。

这些名称适用于 Sidecar 代理和网关。Ambient 模式下的 waypoint 代理使用不同的集群名称, 并且 ztunnel 不使用 Envoy。

资源名称格式示例
出站集群outbound|<port>|<subset>|<service FQDN>outbound|9080|v1|reviews.default.svc.cluster.local
入站集群inbound|<target port>||inbound|9080||
出站 TLS 服务器名称(SNI)outbound_.<port>_.<subset>_.<service FQDN>outbound_.9080_._.reviews.default.svc.cluster.local
全部集群PassthroughCluster, BlackHoleCluster, InboundPassthroughClusterPassthroughCluster
代理引导集群xds-grpc, sds-grpc, prometheus_stats, agentxds-grpc
出站 HTTP 连接管理器outbound_<bind address>_<port>outbound_0.0.0.0_9080
入站 HTTP 连接管理器inbound_<bind address>_<target port>inbound_0.0.0.0_9080
TCP 代理目标集群统计名称,或加权路由的 VirtualService 的 <name>.<namespace>outbound|3306||mysql.default.svc.cluster.local

当没有 DestinationRule 子集适用时, 出站集群名称的子集段为空,例如 outbound|9080||reviews.default.svc.cluster.local。 当代理首次向其发送流量时,Envoy 会创建集群的流量统计信息,例如 upstream_rq_total, 因此对于尚未接收流量的集群,这些统计信息会丢失。要列出代理的集群和监听器, 请参阅调试 Envoy 和 istiod。

Istio 在统计中使用的大多数集群和 HTTP 连接管理器名称都以 ; 分隔符结尾,例如:

cluster.outbound|9080||reviews.default.svc.cluster.local;.upstream_rq_total
http.outbound_0.0.0.0_9080;.downstream_rq_total

代理引导配置将这些名称提取到标签中,这些标签成为 Envoy Prometheus 输出中的标签。 例如,envoy_cluster_upstream_rq_total 有一个 cluster_name 标签, 其值为 outbound|9080||reviews.default.svc.cluster.local。最常用的标签是:

  • cluster_name:集群名称。
  • http_conn_manager_prefix:HTTP 连接管理器名称。
  • tcp_prefix:TCP 代理名称。
  • response_code 和 response_code_class:HTTP 响应码,例如 200 或 2xx。
  • listener_address:监听器的地址,例如 0.0.0.0_15006。

要查看标签的完整列表以及提取它们的表达式, 请查看 istioctl proxy-config bootstrap 输出中的 stats_config 元素。

自定义集群统计信息名称

inboundClusterStatName 和 outboundClusterStatName 网格配置选项将统计信息中的集群名称替换为您控制的模式。集群本身的名称不会更改, 因此路由和 istioctl proxy-config 输出不会受到影响。该模式可以使用以下变量:

变量值
%SERVICE%服务的 <name>.<namespace>,否则为完整主机名
%SERVICE_NAME%Kubernetes 服务的 <name>,否则为完整主机名
%SERVICE_FQDN%服务的完整主机名,例如 reviews.default.svc.cluster.local
%SERVICE_PORT%服务端口
%SERVICE_PORT_NAME%服务端口名称
%TARGET_PORT%工作负载的目标端口。仅在 inboundClusterStatName 集群名称中有意义
%SUBSET_NAME%DestinationRule 子集名称。仅适用于 outboundClusterStatName

Istio 将 ; 分隔符附加到结果中,因此 cluster_name 标签继续工作。 相同的模式还命名 TCP 代理的统计信息,不带分隔符。他们不会更改访问日志中的集群名称。

如果模式省略 %SUBSET_NAME%,则服务的所有子集的集群共享相同的统计信息。 例如,要在服务和端口之后命名出站集群统计信息:

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    outboundClusterStatName: "%SERVICE%_%SERVICE_PORT%"

通过此设置,对 default 命名空间中端口 8000 上的 httpbin 服务的请求统计信息以 cluster.httpbin.default_8000; 开头, 而不是 cluster.outbound|8000||httpbin.default.svc.cluster.local;。

这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!