利用容器网络可观测性监控 Kubernetes 工作负载流量 - Amazon EKS

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

利用容器网络可观测性监控 Kubernetes 工作负载流量

Amazon EKS 提供了增强型网络可观测性功能,可让您更深入地了解容器网络环境。这些功能可帮助您更好地了解、监控 AWS 中的 Kubernetes 网络格局并对其进行问题排查。借助增强型容器网络可观测性,您可以利用与网络相关的精细指标,更好地主动检测集群流量、跨可用区流量和 AWS 服务的异常。通过这些指标,您可以使用首选的可观测性堆栈来衡量系统性能并可视化基础指标。

此外,Amazon EKS 现在在 AWS 控制台中提供网络监控可视化功能,可加快和增强准确的问题排查,从而更快地分析根本原因。您还可以利用这些视觉功能来精确定位导致重新传输和重新传输超时的主要贡献者和网络流量,从而消除事件期间的盲点。

这些功能由 Amazon CloudWatch 网络流量监测仪启用。

使用案例

衡量网络性能以检测异常

一些团队对可观测性堆栈进行了标准化,该堆栈允许他们衡量系统的性能,可视化系统指标,并在超出特定阈值时收到警报。EKS 中的容器网络可观测性与此保持一致,公开了关键的系统指标,您可以抓取这些指标来扩大对系统在容器组(pod)和 Worker 节点级别的网络性能可观测性。

利用控制台可视化进行更准确的问题排查

如果监控系统发出警报,您可能需要仔细研究问题来源所在的集群和工作负载。为了支持此操作,您可以利用 EKS 控制台中的可视化来缩小集群级别的调查范围,并加速披露导致重新传输次数最多的网络流量、重新传输超时和已传输数据量。

在 Amazon EKS 环境中跟踪主要贡献者

许多团队都将 EKS 作为其平台的基础来运行,使其成为应用程序环境网络活动的焦点。使用此功能中的网络监控功能,可以跟踪哪些工作负载负责集群内、跨可用区的大多数流量(按数据量衡量),以及流向 AWS 内(DynamoDB 和 S3)和 AWS 云外(互联网或本地)外部目标的流量。此外,您可以根据重新传输次数、重新传输超时和已传输数据量监控这些流量的性能。

功能

  1. 性能指标:此功能允许您直接从 EKS 集群中运行的网络流量监测仪(NFM)代理中获取容器组(pod)和 Worker 节点的网络相关系统指标。

  2. 服务地图:此功能可动态可视化集群中工作负载之间的互通,允许您快速披露与通信容器组(pod)之间的网络流量相关的关键指标(重新传输次数 – RT、重新传输超时 – RTO 和已传输数据量 – DT)。

  3. 流表:使用此表,可以从三个不同角度监控集群中 Kubernetes 工作负载中的主要贡献者:AWS 服务视图、集群视图和外部视图。对于每个视图,可以查看重新传输次数、重新传输超时以及源容器组(pod)与其目标之间传输的数据量。

    • AWS 服务视图:显示 AWS 服务(DynamoDB 和 S3)的主要贡献者

    • 集群视图:显示集群内的主要贡献者(东 ← 到 → 西)

    • 外部视图:向 AWS 外部的外部集群目标显示主要贡献者

开始使用

要开始使用,请在 EKS 控制台中为新集群或现有集群启用容器网络可观测性功能。这将自动创建网络流量监测仪(NFM)依赖项(范围监视器资源)。此外,还必须安装网络流量监测仪代理附加组件。或者,可以使用 AWS CLIEKS API(用于附加组件)、NFM API 或基础设施即代码(如 Terraform)来安装这些依赖项。这些依赖项安装到位后,便可配置首选的监控工具,以从 NFM 代理中获取容器组(pod)和 Worker 节点的网络性能指标。要可视化工作负载的网络活动和性能,可以导航到集群可观测性控制面板的“网络”选项卡下的 EKS 控制台。

在 EKS 中使用网络流量监测仪时,可以维护现有的可观测性工作流程和技术堆栈,同时利用一系列其他功能,进一步了解和优化 EKS 环境的网络层。您可以在此处了解有关网络流量监测仪定价的更多信息。

先决条件和重要提示

  1. 如上所述,如果您从 EKS 控制台启用容器网络可观测性,则系统将代表您自动创建基础 NFM 资源依赖项(范围和监视器),并指导您完成适用于 NFM 的 EKS 附加组件的安装过程。

  2. 如果要使用 Terraform 之类的基础设施即代码(IaC)启用此功能,则必须在 IaC 中定义以下依赖项:NFM 范围、NFM 监视器、适用于 NFM 的 EKS 附加组件。此外,必须使用容器组身份服务账户的 IAM 角色(IRSA)向 EKS 附加组件授予相关权限

  3. NFM 代理的 EKS 附加组件运行的最低版本必须为 1.1.0。

  4. 您必须使用 Terraform AWS Provider 的 v6.21.0 或更高版本才能支持网络流量监测仪资源。

所需的 IAM 权限

适用于 NFM 代理的 EKS 附加组件

可将 CloudWatchNetworkFlowMonitorAgentPublishPolicy AWS 托管式策略与容器组身份结合使用。此策略包含 NFM 代理向网络流量监测仪端点发送遥测报告(指标)所需的权限。

{ "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : [ "networkflowmonitor:Publish" ], "Resource" : "*" } ] }

EKS 控制台中的容器网络可观测性

需要以下权限才能启用该功能并在控制台中可视化服务地图和流表。

{ "Version" : "2012-10-17", "Statement" : [ { "Effect": "Allow", "Action": [ "networkflowmonitor:ListScopes", "networkflowmonitor:ListMonitors", "networkflowmonitor:GetScope", "networkflowmonitor:GetMonitor", "networkflowmonitor:CreateScope", "networkflowmonitor:CreateMonitor", "networkflowmonitor:TagResource", "networkflowmonitor:StartQueryMonitorTopContributors", "networkflowmonitor:StopQueryMonitorTopContributors", "networkflowmonitor:GetQueryStatusMonitorTopContributors", "networkflowmonitor:GetQueryResultsMonitorTopContributors" ], "Resource": "*" } ] }

使用 AWS CLI、EKS API 和 NFM API

#!/bin/bash # Script to create required Network Flow Monitor resources set -e CLUSTER_NAME="my-eks-cluster" CLUSTER_ARN="arn:aws:eks:{Region}:{Account}:cluster/{ClusterName}" REGION="us-west-2" AGENT_NAMESPACE="amazon-network-flow-monitor" echo "Creating Network Flow Monitor resources..." # Check if Network Flow Monitor agent is running in the cluster echo "Checking for Network Flow Monitor agent in cluster..." if kubectl get pods -n "$AGENT_NAMESPACE" --no-headers 2>/dev/null | grep -q "Running"; then echo "Network Flow Monitor agent exists and is running in the cluster" else echo "Network Flow Monitor agent not found. Installing as EKS addon..." aws eks create-addon \ --cluster-name "$CLUSTER_NAME" \ --addon-name "$AGENT_NAMESPACE" \ --region "$REGION" echo "Network Flow Monitor addon installation initiated" fi # Get Account ID ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) echo "Cluster ARN: $CLUSTER_ARN" echo "Account ID: $ACCOUNT_ID" # Check for existing scope echo "Checking for existing Network Flow Monitor Scope..." EXISTING_SCOPE=$(aws networkflowmonitor list-scopes --region $REGION --query 'scopes[0].scopeArn' --output text 2>/dev/null || echo "None") if [ "$EXISTING_SCOPE" != "None" ] && [ "$EXISTING_SCOPE" != "null" ]; then echo "Using existing scope: $EXISTING_SCOPE" SCOPE_ARN=$EXISTING_SCOPE else echo "Creating new Network Flow Monitor Scope..." SCOPE_RESPONSE=$(aws networkflowmonitor create-scope \ --targets "[{\"targetIdentifier\":{\"targetId\":{\"accountId\":\"${ACCOUNT_ID}\"},\"targetType\":\"ACCOUNT\"},\"region\":\"${REGION}\"}]" \ --region $REGION \ --output json) SCOPE_ARN=$(echo $SCOPE_RESPONSE | jq -r '.scopeArn') echo "Scope created: $SCOPE_ARN" fi # Create Network Flow Monitor with EKS Cluster as local resource echo "Creating Network Flow Monitor..." MONITOR_RESPONSE=$(aws networkflowmonitor create-monitor \ --monitor-name "${CLUSTER_NAME}-monitor" \ --local-resources "type=AWS::EKS::Cluster,identifier=${CLUSTER_ARN}" \ --scope-arn "$SCOPE_ARN" \ --region $REGION \ --output json) MONITOR_ARN=$(echo $MONITOR_RESPONSE | jq -r '.monitorArn') echo "Monitor created: $MONITOR_ARN" echo "Network Flow Monitor setup complete!" echo "Monitor ARN: $MONITOR_ARN" echo "Scope ARN: $SCOPE_ARN" echo "Local Resource: AWS::EKS::Cluster (${CLUSTER_ARN})"

使用基础设施即代码(IaC)

Terraform

如果您使用 Terraform 来管理 AWS 云基础设施,则可以包括以下资源配置,以便为集群启用容器网络可观测性功能。

NFM 范围

data "aws_caller_identity" "current" {} resource "aws_networkflowmonitor_scope" "example" { target { region = "us-east-1" target_identifier { target_type = "ACCOUNT" target_id { account_id = data.aws_caller_identity.current.account_id } } } tags = { Name = "example" } }

NFM 监视器

resource "aws_networkflowmonitor_monitor" "example" { monitor_name = "eks-cluster-name-monitor" scope_arn = aws_networkflowmonitor_scope.example.scope_arn local_resource { type = "AWS::EKS::Cluster" identifier = aws_eks_cluster.example.arn } remote_resource { type = "AWS::Region" identifier = "us-east-1" # this must be the same region that the cluster is in } tags = { Name = "example" } }

适用于 NFM 的 EKS 附加组件

resource "aws_eks_addon" "example" { cluster_name = aws_eks_cluster.example.name addon_name = "aws-network-flow-monitoring-agent" }

如何工作?

性能指标

系统指标

如果您正在运行第三方(3P)工具来监控 EKS 环境(例如 Prometheus 和 Grafana),则可以直接从网络流量监测仪代理抓取支持的系统指标。这些指标可以发送到监控堆栈,以扩展对系统在容器组(pod)和 Worker 节点级别的网络性能的衡量范围。可用指标列于表格的“支持的系统指标”下。

抓取系统指标的插图

要启用这些指标,请在安装过程中使用配置变量覆盖以下环境变量(请参阅:https://aws.amazon.com/blogs/containers/amazon-eks-add-ons-advanced-configuration/):

OPEN_METRICS: Enable or disable open metrics. Disabled if not supplied Type: String Values: [“on”, “off”] OPEN_METRICS_ADDRESS: Listening IP address for open metrics endpoint. Defaults to 127.0.0.1 if not supplied Type: String OPEN_METRICS_PORT: Listening port for open metrics endpoint. Defaults to 80 if not supplied Type: Integer Range: [0..65535]

流量级别指标

此外,网络流量监测仪会捕获网络流量数据以及流量级别指标:重新传输次数、重新传输超时和已传输数据量。这些数据由网络流量监测仪处理,并在 EKS 控制台中进行可视化,以显示集群环境中的流量,以及基于这些流量级别指标的表现。

下图描绘了一个工作流程,在该工作流程中,可以利用两种类型的指标(系统和流量级别)来获得更多的运营情报。

具有不同性能指标的工作流程示意图
  1. 平台团队可以在其监控堆栈中收集和可视化系统指标。有了警报,他们就可以使用 NFM 代理中的系统指标来检测网络异常或影响容器组(pod)或 Worker 节点的问题。

  2. 下一步,平台团队可以利用 EKS 控制台中的原生可视化来进一步缩小调查范围,并根据流表示及其相关指标加快问题排查。

重要说明:从 NFM 代理抓取系统指标和 NFM 代理将流量级别指标推送到 NFM 后端的过程是独立的过程。

支持的系统指标

重要说明:系统指标以 OpenMetrics 格式导出。

指标名称 类型 Dimensions 说明

ingress_flow

计量表

instance_id、iface、pod、namespace、node

入口 TCP 流计数(tcpAssiveOpens)

egress_flow

计量表

instance_id、iface、pod、namespace、node

出口 TCP 流计数(tcpActiveOpens)

ingress_packets

计量表

instance_id、iface、pod、namespace、node

入口数据包计数(增量)

egress_packets

计量表

instance_id、iface、pod、namespace、node

出口数据包计数(增量)

ingress_bytes

计量表

instance_id、iface、pod、namespace、node

入口字节数(增量)

egress_bytes

计量表

instance_id、iface、pod、namespace、node

出口字节计数(增量)

bw_in_lowance_exceede

计量表

instance_id、eni、node

由于入站带宽限制,数据包已排队/已丢弃

bw_out_allowance_exceeded

计量表

instance_id、eni、node

由于出站带宽限制,数据包已排队/已丢弃

pps_allowance_exceeded

计量表

instance_id、eni、node

由于双向 PPS 限制,数据包已排队/已丢弃

conntrack_allowance_exceeded

计量表

instance_id、eni、node

由于连接跟踪限制,数据包已丢弃

linklocal_allowance_exceeded

计量表

instance_id、eni、node

由于本地代理服务 PPS 限制,数据包已丢弃

支持的流量级别指标
指标名称 类型 说明

TCP 重新传输次数

计数器

发送端重新发送在传输过程中丢失或损坏的数据包的次数。

TCP 重新传输超时

计数器

发送端启动等待期以确定数据包是否在传输过程中丢失的次数。

已传输数据量(字节数)

计数器

给定流量在源和目标之间传输的数据量。

服务地图和流表

NFM 如何与 EKS 合作的示意图
  1. 安装后,网络流量监测仪代理将作为 DaemonSet 在每个 Worker 节点上运行,并每 30 秒收集排名前 500 的网络流(基于已传输数据量)。

  2. 这些网络流分为以下类别:可用区内、可用区间、EC2 → S3、EC2 → DynamoDB(DDB)和未分类。每个流都有 3 个与之关联的指标:重新传输次数、重新传输超时和已传输数据量(以字节为单位)。

    • 可用区内部:同一可用区中容器组(pod)之间的网络流

    • 可用区间:不同可用区中容器组(pod)之间的网络流

    • EC2 → S3:从容器组(pod)流向 S3 的网络流

    • EC2 → DDB:从容器组(pod)流向 DDB 的网络流

    • 未分类:从容器组(pod)流向互联网或本地的网络流

  3. 来自网络流量监测仪 Top Contributors API 的网络流用于在 EKS 控制台中支持以下体验:

    • 服务地图:集群内网络流的可视化(可用区内和可用区间)。

    • 流表:集群内(可用区内和可用区间)、从容器组(pod)到 AWS 服务(EC2 → S3 和 EC2 → DDB)以及从容器组(pod)到外部目标(未分类)的网络流的表格呈现。

从 Top Contributors API 提取的网络流限定为 1 小时的时间范围,并且每个类别最多可以包含 500 个流。对于服务地图,这意味着在 1 小时的时间范围内可以从可用区内和可用区间流类别中获取和呈现多达 1000 个流。对于流表,这意味着在 2 小时的时间范围内可以从所有 6 个网络流类别中获取和呈现多达 3000 个网络流。

示例:服务地图

部署视图

部署视图中包含电子商务应用程序的服务地图示意图

容器组(pod)视图

容器组(pod)视图中包含电子商务应用程序的服务地图示意图

部署视图

部署视图中包含照片库应用程序的服务地图示意图

容器组(pod)视图

容器组(pod)视图中包含照片库应用程序的服务地图示意图

示例:流表

AWS 服务视图

流表视图示意图

集群视图

集群视图中流表示意图

注意事项和限制

  • EKS 中的容器网络可观测性功能仅在支持网络流量监测仪的区域中提供。

  • 支持的系统指标采用 OpenMetrics 格式,可以直接从网络流量监测仪(NFM)代理中抓取。

  • 要使用 Terraform 之类的基础设施即代码(IaC)在 EKS 中启用容器网络可观测性功能,您需要在配置中定义和创建这些依赖项:NFM 范围、NFM 监视器和 NFM 代理。

  • 网络流量监测仪每分钟最多支持约 500 万个流。这是安装了网络流量监测仪代理的大约 5000 个 EC2 实例(EKS Worker 节点)。在有更多容量可用之前,在超过 5000 个实例上安装代理可能会影响监控性能。

  • NFM 代理的 EKS 附加组件运行的最低版本必须为 1.1.0。

  • 您必须使用 Terraform AWS Provider 的 v6.21.0 或更高版本才能支持网络流量监测仪资源。

  • 要使用容器组(pod)元数据丰富网络流,您的容器组(pod)应在自己的隔离网络命名空间中运行,而不是在主机网络命名空间中运行。