×

网络可观测性操作符使用flowlogs-pipeline从流日志生成指标。您可以通过设置自定义警报和查看仪表板来利用这些指标。

查看网络可观测性指标仪表板

在OpenShift Container Platform控制台的**概述**选项卡中,您可以查看集群网络流量的整体聚合指标。您可以选择按节点、命名空间、所有者、Pod和服务显示信息。您还可以使用过滤器和显示选项来进一步细化指标。

步骤
  1. 在Web控制台**观察**→**仪表板**中,选择**Netobserv**仪表板。

  2. 查看以下类别中的网络流量指标,每个类别都包含每个节点、命名空间、源和目标的子集

    • 字节速率

    • 数据包丢弃

    • DNS

    • RTT

  3. 选择**Netobserv/Health**仪表板。

  4. 查看以下类别中关于操作符健康状况的指标,每个类别都包含每个节点、命名空间、源和目标的子集。

    • 流量

    • 流量开销

    • 流量速率

    • 代理

    • 处理器

    • 操作符

**基础设施**和**应用程序**指标在命名空间和工作负载的分割视图中显示。

预定义指标

flowlogs-pipeline生成的指标可在FlowCollector自定义资源的spec.processor.metrics.includeList中配置,以添加或删除指标。

网络可观测性指标

您还可以使用Prometheus规则中的includeList指标创建警报,如“创建警报”示例所示。

当在Prometheus中查找这些指标时,例如在控制台中通过**观察**→**指标**,或在定义警报时,所有指标名称都以netobserv_为前缀。例如,netobserv_namespace_flows_total。可用的指标名称如下所示

includeList指标名称

后跟星号*的名称默认启用。

  • namespace_egress_bytes_total

  • namespace_egress_packets_total

  • namespace_ingress_bytes_total

  • namespace_ingress_packets_total

  • namespace_flows_total *

  • node_egress_bytes_total

  • node_egress_packets_total

  • node_ingress_bytes_total *

  • node_ingress_packets_total

  • node_flows_total

  • workload_egress_bytes_total

  • workload_egress_packets_total

  • workload_ingress_bytes_total *

  • workload_ingress_packets_total

  • workload_flows_total

PacketDrop指标名称

当在spec.agent.ebpf.features中启用PacketDrop功能(使用privileged模式)时,以下附加指标可用

  • namespace_drop_bytes_total

  • namespace_drop_packets_total *

  • node_drop_bytes_total

  • node_drop_packets_total

  • workload_drop_bytes_total

  • workload_drop_packets_total

DNS指标名称

当在spec.agent.ebpf.features中启用DNSTracking功能时,以下附加指标可用

  • namespace_dns_latency_seconds *

  • node_dns_latency_seconds

  • workload_dns_latency_seconds

FlowRTT指标名称

当在spec.agent.ebpf.features中启用FlowRTT功能时,以下附加指标可用

  • namespace_rtt_seconds *

  • node_rtt_seconds

  • workload_rtt_seconds

创建警报

您可以为Netobserv仪表板指标创建自定义警报规则,以便在满足某些定义的条件时触发警报。

先决条件
  • 您可以作为具有集群管理员角色或对所有项目具有查看权限的用户访问集群。

  • 您已安装网络可观测性操作符。

步骤
  1. 单击导入图标**+**创建YAML文件。

  2. 将警报规则配置添加到YAML文件。在以下YAML示例中,当集群入口流量达到每个目标工作负载每秒10 MBps的给定阈值时,将创建警报。

    apiVersion: monitoring.openshift.io/v1
    kind: AlertingRule
    metadata:
      name: netobserv-alerts
      namespace: openshift-monitoring
    spec:
      groups:
      - name: NetObservAlerts
        rules:
        - alert: NetObservIncomingBandwidth
          annotations:
            message: |-
              {{ $labels.job }}: incoming traffic exceeding 10 MBps for 30s on {{ $labels.DstK8S_OwnerType }} {{ $labels.DstK8S_OwnerName }} ({{ $labels.DstK8S_Namespace }}).
            summary: "High incoming traffic."
          expr: sum(rate(netobserv_workload_ingress_bytes_total     {SrcK8S_Namespace="openshift-ingress"}[1m])) by (job, DstK8S_Namespace, DstK8S_OwnerName, DstK8S_OwnerType) > 10000000      (1)
          for: 30s
          labels:
            severity: warning
    1 netobserv_workload_ingress_bytes_total指标在spec.processor.metrics.includeList中默认启用。
  3. 单击**创建**将配置文件应用于集群。

自定义指标

您可以使用FlowMetric API从流日志数据创建自定义指标。在收集的每个流日志数据中,每个日志都有一些标记字段,例如源名称和目标名称。这些字段可以作为Prometheus标签来利用,从而能够在您的仪表板上自定义集群信息。

使用FlowMetric API配置自定义指标

您可以配置FlowMetric API,使用流日志数据字段作为Prometheus标签来创建自定义指标。您可以向一个项目添加多个FlowMetric资源以查看多个仪表板视图。

步骤
  1. 在Web控制台中,导航到操作符已安装的操作符

  2. NetObserv操作符提供的API标题下,选择FlowMetric

  3. 项目:下拉列表中,选择网络可观察性操作符实例的项目。

  4. 单击创建FlowMetric

  5. 配置FlowMetric资源,类似于以下示例配置

    生成一个跟踪从集群外部来源接收的入站字节的指标
    apiVersion: flows.netobserv.io/v1alpha1
    kind: FlowMetric
    metadata:
      name: flowmetric-cluster-external-ingress-traffic
      namespace: netobserv                              (1)
    spec:
      metricName: cluster_external_ingress_bytes_total  (2)
      type: Counter                                     (3)
      valueField: Bytes
      direction: Ingress                                (4)
      labels: [DstK8S_HostName,DstK8S_Namespace,DstK8S_OwnerName,DstK8S_OwnerType] (5)
      filters:                                          (6)
      - field: SrcSubnetLabel
        matchType: Absence
    1 需要在FlowCollector spec.namespace中定义的命名空间(默认为netobserv)中创建FlowMetric资源。
    2 Prometheus指标的名称,在Web控制台中显示时带有前缀netobserv-<metricName>
    3 type指定指标的类型。Counter type对于计数字节或数据包很有用。
    4 要捕获的流量方向。如果未指定,则会捕获入站和出站流量,这可能会导致计数重复。
    5 标签定义了指标的外观以及不同实体之间的关系,还定义了指标基数。例如,SrcK8S_Name是一个高基数指标。
    6 根据列出的条件细化结果。在此示例中,仅选择集群外部流量是通过仅匹配SrcSubnetLabel不存在的流来完成的。这假设启用了子网标签功能(通过spec.processor.subnetLabels),默认情况下已启用。
    验证
    1. 吊舱刷新后,导航到观察指标

    2. 表达式字段中,键入指标名称以查看相应的结果。您还可以输入表达式,例如topk(5, sum(rate(netobserv_cluster_external_ingress_bytes_total{DstK8S_Namespace="my-namespace"}[2m])) by (DstK8S_HostName, DstK8S_OwnerName, DstK8S_OwnerType))

    显示集群外部入站流量的RTT延迟
    apiVersion: flows.netobserv.io/v1alpha1
    kind: FlowMetric
    metadata:
      name: flowmetric-cluster-external-ingress-rtt
      namespace: netobserv    (1)
    spec:
      metricName: cluster_external_ingress_rtt_seconds
      type: Histogram                 (2)
      valueField: TimeFlowRttNs
      direction: Ingress
      labels: [DstK8S_HostName,DstK8S_Namespace,DstK8S_OwnerName,DstK8S_OwnerType]
      filters:
      - field: SrcSubnetLabel
        matchType: Absence
      - field: TimeFlowRttNs
        matchType: Presence
      divider: "1000000000"      (3)
      buckets: [".001", ".005", ".01", ".02", ".03", ".04", ".05", ".075", ".1", ".25", "1"]  (4)
    1 需要在FlowCollector spec.namespace中定义的命名空间(默认为netobserv)中创建FlowMetric资源。
    2 type指定指标的类型。Histogram type对于延迟值(TimeFlowRttNs)很有用。
    3 由于往返时间 (RTT) 在流中以纳秒表示,因此使用 10 亿的除数转换为秒,这符合 Prometheus 指南的标准。
    4 自定义桶指定了 RTT 的精度,最佳精度范围在 5 毫秒到 250 毫秒之间。
    验证
    1. 吊舱刷新后,导航到观察指标

    2. 表达式字段中,您可以键入指标名称以查看相应的结果。

高基数会影响 Prometheus 的内存使用情况。您可以在网络流量格式参考中检查特定标签是否具有高基数。

使用FlowMetric API配置自定义图表

您可以为OpenShift Container Platform Web控制台中的仪表板生成图表,您可以在仪表板菜单中以管理员身份查看这些图表,方法是定义FlowMetric资源的charts部分。

步骤
  1. 在Web控制台中,导航到操作符已安装的操作符

  2. NetObserv操作符提供的API标题下,选择FlowMetric

  3. 项目:下拉列表中,选择网络可观察性操作符实例的项目。

  4. 单击创建FlowMetric

  5. 配置FlowMetric资源,类似于以下示例配置

跟踪从集群外部来源接收的入站字节的图表
apiVersion: flows.netobserv.io/v1alpha1
kind: FlowMetric
metadata:
  name: flowmetric-cluster-external-ingress-traffic
  namespace: netobserv   (1)
# ...
  charts:
  - dashboardName: Main  (2)
    title: External ingress traffic
    unit: Bps
    type: SingleStat
    queries:
    - promQL: "sum(rate($METRIC[2m]))"
      legend: ""
  - dashboardName: Main  (2)
    sectionName: External
    title: Top external ingress traffic per workload
    unit: Bps
    type: StackArea
    queries:
    - promQL: "sum(rate($METRIC{DstK8S_Namespace!=\"\"}[2m])) by (DstK8S_Namespace, DstK8S_OwnerName)"
      legend: "{{DstK8S_Namespace}} / {{DstK8S_OwnerName}}"
# ...
1 需要在FlowCollector spec.namespace中定义的命名空间(默认为netobserv)中创建FlowMetric资源。
验证
  1. 吊舱刷新后,导航到观察仪表板

  2. 搜索NetObserv / 主页仪表板。查看NetObserv / 主页仪表板下的两个面板,或者可以选择您创建的仪表板名称。

    • 显示跨所有维度汇总的全局外部入站速率的文本单一统计信息

    • 显示每个目标工作负载的相同指标的时间序列图

有关查询语言的更多信息,请参阅Prometheus文档

集群外部入站流量的RTT延迟图表
apiVersion: flows.netobserv.io/v1alpha1
kind: FlowMetric
metadata:
  name: flowmetric-cluster-external-ingress-traffic
  namespace: netobserv   (1)
# ...
  charts:
  - dashboardName: Main  (2)
    title: External ingress TCP latency
    unit: seconds
    type: SingleStat
    queries:
    - promQL: "histogram_quantile(0.99, sum(rate($METRIC_bucket[2m])) by (le)) > 0"
      legend: "p99"
  - dashboardName: Main  (2)
    sectionName: External
    title: "Top external ingress sRTT per workload, p50 (ms)"
    unit: seconds
    type: Line
    queries:
    - promQL: "histogram_quantile(0.5, sum(rate($METRIC_bucket{DstK8S_Namespace!=\"\"}[2m])) by (le,DstK8S_Namespace,DstK8S_OwnerName))*1000 > 0"
      legend: "{{DstK8S_Namespace}} / {{DstK8S_OwnerName}}"
  - dashboardName: Main  (2)
    sectionName: External
    title: "Top external ingress sRTT per workload, p99 (ms)"
    unit: seconds
    type: Line
    queries:
    - promQL: "histogram_quantile(0.99, sum(rate($METRIC_bucket{DstK8S_Namespace!=\"\"}[2m])) by (le,DstK8S_Namespace,DstK8S_OwnerName))*1000 > 0"
      legend: "{{DstK8S_Namespace}} / {{DstK8S_OwnerName}}"
# ...
1 需要在FlowCollector spec.namespace中定义的命名空间(默认为netobserv)中创建FlowMetric资源。
2 使用不同的dashboardName会创建一个以Netobserv为前缀的新仪表板。例如,Netobserv / <dashboard_name>

此示例使用histogram_quantile函数显示p50p99

您可以通过将指标$METRIC_sum除以指标$METRIC_count来显示直方图的平均值,这些指标在创建直方图时会自动生成。使用前面的示例,执行此操作的Prometheus查询如下所示:

promQL: "(sum(rate($METRIC_sum{DstK8S_Namespace!=\"\"}[2m])) by (DstK8S_Namespace,DstK8S_OwnerName) / sum(rate($METRIC_count{DstK8S_Namespace!=\"\"}[2m])) by (DstK8S_Namespace,DstK8S_OwnerName))*1000"
验证
  1. 吊舱刷新后,导航到观察仪表板

  2. 搜索NetObserv / 主页仪表板。查看NetObserv / 主页仪表板下的新面板,或者可以选择您创建的仪表板名称。

有关查询语言的更多信息,请参阅Prometheus文档

使用FlowMetric API和TCP标志检测SYN泛洪

您可以创建一个AlertingRule资源来警告SYN泛洪。

步骤
  1. 在Web控制台中,导航到操作符已安装的操作符

  2. NetObserv操作符提供的API标题下,选择FlowMetric

  3. 项目下拉列表中,选择网络可观察性操作符实例的项目。

  4. 单击创建FlowMetric

  5. 创建FlowMetric资源以添加以下配置

    配置每个目标主机和资源的流量计数,带TCP标志
    apiVersion: flows.netobserv.io/v1alpha1
    kind: FlowMetric
    metadata:
      name: flows-with-flags-per-destination
    spec:
      metricName: flows_with_flags_per_destination_total
      type: Counter
      labels: [SrcSubnetLabel,DstSubnetLabel,DstK8S_Name,DstK8S_Type,DstK8S_HostName,DstK8S_Namespace,Flags]
    配置每个源主机和资源的流量计数,带TCP标志
    apiVersion: flows.netobserv.io/v1alpha1
    kind: FlowMetric
    metadata:
      name: flows-with-flags-per-source
    spec:
      metricName: flows_with_flags_per_source_total
      type: Counter
      labels: [DstSubnetLabel,SrcSubnetLabel,SrcK8S_Name,SrcK8S_Type,SrcK8S_HostName,SrcK8S_Namespace,Flags]
  6. 部署以下AlertingRule资源以警告SYN泛洪

    AlertingRule用于SYN泛洪
    apiVersion: monitoring.openshift.io/v1
    kind: AlertingRule
    metadata:
      name: netobserv-syn-alerts
      namespace: openshift-monitoring
    # ...
      spec:
      groups:
      - name: NetObservSYNAlerts
        rules:
        - alert: NetObserv-SYNFlood-in
          annotations:
            message: |-
              {{ $labels.job }}: incoming SYN-flood attack suspected to Host={{ $labels.DstK8S_HostName}}, Namespace={{ $labels.DstK8S_Namespace }}, Resource={{ $labels.DstK8S_Name }}. This is characterized by a high volume of SYN-only flows with different source IPs and/or ports.
            summary: "Incoming SYN-flood"
          expr: sum(rate(netobserv_flows_with_flags_per_destination_total{Flags="2"}[1m])) by (job, DstK8S_HostName, DstK8S_Namespace, DstK8S_Name) > 300      (1)
          for: 15s
          labels:
            severity: warning
            app: netobserv
        - alert: NetObserv-SYNFlood-out
          annotations:
            message: |-
              {{ $labels.job }}: outgoing SYN-flood attack suspected from Host={{ $labels.SrcK8S_HostName}}, Namespace={{ $labels.SrcK8S_Namespace }}, Resource={{ $labels.SrcK8S_Name }}. This is characterized by a high volume of SYN-only flows with different source IPs and/or ports.
            summary: "Outgoing SYN-flood"
          expr: sum(rate(netobserv_flows_with_flags_per_source_total{Flags="2"}[1m])) by (job, SrcK8S_HostName, SrcK8S_Namespace, SrcK8S_Name) > 300       (1)
          for: 15s
          labels:
            severity: warning
            app: netobserv
    # ...
    1 在此示例中,警报的阈值为300;但是,您可以根据经验调整此值。过低的阈值可能会产生误报,如果过高则可能会错过实际的攻击。
验证
  1. 在Web控制台中,单击网络流量表格视图中的管理列,然后单击TCP标志

  2. 网络流量表格视图中,过滤TCP协议SYN TCPFlag。具有相同byteSize的大量流量表示SYN泛洪。

  3. 转到观察警报并选择警报规则选项卡。

  4. 过滤netobserv-synflood-in警报。发生SYN泛洪时,警报应触发。