Container Network Observability로 Kubernetes 워크로드 트래픽 모니터링하기

Container Network Observability로 Kubernetes 워크로드 트래픽 모니터링하기

Amazon EKS는 컨테이너 네트워킹 환경에 대한 더 깊은 인사이트를 제공하는 향상된 네트워크 관찰성(network observability) 기능을 제공해요. 이러한 기능은 AWS에서 Kubernetes 네트워크 환경을 더 잘 이해·모니터링·문제 해결하도록 도와줘요. 향상된 컨테이너 네트워크 관찰성을 사용하면 클러스터 트래픽, 교차 AZ 흐름, AWS 서비스 전반에 걸친 사전 예방적 이상 감지를 위해 세분화된 네트워크 관련 지표를 활용할 수 있어요. 이러한 지표를 사용해 시스템 성능을 측정하고 선호하는 관찰성 스택으로 기본 지표를 시각화할 수 있어요.

또한 Amazon EKS는 이제 AWS 콘솔에서 네트워크 모니터링 시각화를 제공하여 더 빠르고 정확한 문제 해결과 근본 원인 분석을 지원해요. 이러한 시각 기능을 활용해 재전송(retransmission)과 재전송 시간 초과를 일으키는 top-talkers와 네트워크 흐름을 정확히 짚어내어 장애(incident) 중 맹점을 없앨 수 있어요.

이러한 기능은 Amazon CloudWatch Network Flow Monitor가 지원해요.

출처: 문서

본문

사용 사례 (Use cases)

네트워크 성능을 측정해 이상 감지

여러 팀이 시스템 성능을 측정하고 시스템 지표를 시각화하며 특정 임계값이 초과될 때 알람을 받을 수 있는 관찰성 스택을 표준화해 사용해요. EKS의 컨테이너 네트워크 관찰성은 Pod와 워커 노드 수준에서 시스템 네트워크 성능의 관찰성을 넓히기 위해 스크래핑할 수 있는 핵심 시스템 지표를 노출해 이에 맞춰져 있어요.

콘솔 시각화를 활용한 더 정밀한 문제 해결

모니터링 시스템에서 알람이 발생하면 문제가 발생한 클러스터와 워크로드에 집중하고 싶을 수 있어요. 이를 지원하기 위해 EKS 콘솔의 시각화를 활용해 클러스터 수준에서 조사 범위를 좁히고, 가장 많은 재전송·재전송 시간 초과·전송 데이터량을 담당한 네트워크 흐름을 빠르게 파악할 수 있어요.

Amazon EKS 환경의 top-talkers 추적

많은 팀이 플랫폼의 기반으로 EKS를 실행하여 애플리케이션 환경의 네트워크 활동 중심점으로 삼아요. 이 기능의 네트워크 모니터링 기능을 사용하면 클러스터 안에서, AZ에 걸쳐, 그리고 AWS 안(DynamoDB, S3)과 AWS 클라우드 밖(인터넷 또는 온프레미스)의 외부 대상으로 가장 많은 트래픽(데이터량 기준)을 담당하는 워크로드를 추적할 수 있어요. 또한 재전송, 재전송 시간 초과, 전송 데이터량을 기준으로 각 흐름의 성능도 모니터링할 수 있어요.

기능 (Features)

  • 성능 지표 (Performance metrics) – 이 기능은 EKS 클러스터에서 실행되는 Network Flow Monitor(NFM) 에이전트에서 Pod와 워커 노드의 네트워크 관련 시스템 지표를 직접 스크래핑할 수 있게 해줘요.
  • 서비스 맵 (Service map) – 이 기능은 클러스터 내 워크로드 간 통신을 동적으로 시각화하여, 통신하는 Pod 간 네트워크 흐름과 관련된 핵심 지표(RT - 재전송, RTO - 재전송 시간 초과, DT - 전송 데이터량)를 빠르게 파악할 수 있게 해줘요.
  • 흐름 테이블 (Flow table) – 이 테이블로 세 가지 다른 관점(AWS 서비스 보기, 클러스터 보기, 외부 보기)에서 클러스터의 Kubernetes 워크로드 전반의 top-talkers를 모니터링할 수 있어요. 각 보기에서 소스 Pod와 그 대상 사이의 재전송, 재전송 시간 초과, 전송 데이터량을 볼 수 있어요.
    • AWS service view: AWS 서비스(DynamoDB 및 S3)로의 top-talkers를 보여줘요.
    • Cluster view: 클러스터 내(동 ← → 서 방향)의 top-talkers를 보여줘요.
    • External view: AWS 밖의 클러스터 외부 대상으로의 top-talkers를 보여줘요.

시작하기 (Get started)

시작하려면 EKS 콘솔에서 새 클러스터 또는 기존 클러스터에 Container Network Observability를 활성화하세요. 이렇게 하면 Network Flow Monitor(NFM) 종속성(Scope 및 Monitor 리소스) 생성이 자동화돼요. 또한 Network Flow Monitor Agent 애드온을 설치해야 해요. 또는 AWS CLI, EKS API(애드온용), NFM API 또는 IaC(Infrastructure as Code, 예: Terraform)로 이러한 종속성을 설치할 수 있어요. 종속성이 마련되면 선호하는 모니터링 도구를 구성해 NFM 에이전트에서 Pod와 워커 노드의 네트워크 성능 지표를 스크래핑할 수 있어요. 워크로드의 네트워크 활동과 성능을 시각화하려면 EKS 콘솔에서 클러스터의 observability dashboard의 "Network" 탭 아래로 이동하세요.

EKS에서 Network Flow Monitor를 사용하면 기존 관찰성 워크플로우와 기술 스택을 유지하면서, EKS 환경의 네트워크 계층을 이해·최적화하는 데 더 도움이 되는 추가 기능 세트를 활용할 수 있어요. Network Flow Monitor 요금에 대해 더 알아보려면 여기를 참고하세요.

사전 요구 사항 및 중요 사항

위에서 언급했듯이 EKS 콘솔에서 Container Network Observability를 활성화하면 기본 NFM 리소스 종속성(Scope 및 Monitor)이 대신 자동 생성되며, NFM용 EKS 애드온 설치 과정이 안내돼요.

Terraform 같은 IaC(Infrastructure as Code)로 이 기능을 활성화하려면 IaC에서 다음 종속성을 정의해야 해요: NFM Scope, NFM Monitor, NFM용 EKS 애드온. 또한 Pod Identity 또는 IRSA(IAM roles for service accounts)를 사용해 EKS 애드온에 관련 권한을 부여해야 해요.

  • NFM 에이전트의 EKS 애드온은 최소 버전 1.1.0을 실행해야 해요.
  • Network Flow Monitor 리소스를 지원하려면 Terraform AWS Provider v6.21.0 이상을 사용해야 해요.

필요한 IAM 권한

NFM 에이전트용 EKS 애드온

CloudWatchNetworkFlowMonitorAgentPublishPolicy AWS 관리형 정책을 Pod Identity와 함께 사용할 수 있어요. 이 정책은 NFM 에이전트가 Network Flow Monitor 엔드포인트로 텔레메트리 보고서(지표)를 보낼 권한을 포함해요.

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

EKS 콘솔의 Container Network Observability

콘솔에서 기능을 활성화하고 서비스 맵과 흐름 테이블을 시각화하려면 다음 권한이 필요해요.

{
  "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(Infrastructure as Code) 사용

Terraform

Terraform으로 AWS 클라우드 인프라를 관리한다면 다음 리소스 구성을 포함해 클러스터에 Container Network Observability를 활성화할 수 있어요.

NFM Scope

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 Monitor

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"
}

동작 방식 (How does it work?)

성능 지표

시스템 지표

Prometheus와 Grafana 같은 제3자(3P) 도구로 EKS 환경을 모니터링 중이라면 NFM 에이전트에서 지원되는 시스템 지표를 직접 스크래핑할 수 있어요. 이러한 지표는 모니터링 스택으로 보내 Pod와 워커 노드 수준에서 시스템 네트워크 성능의 측정을 확장할 수 있어요. 사용 가능한 지표는 아래의 지원 시스템 지표 표에 나열되어 있어요.

이 지표를 활성화하려면 설치 과정에서 구성 변수로 다음 환경 변수를 재정의하세요(참고: 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]

흐름 수준 지표

또한 Network Flow Monitor는 네트워크 흐름 데이터와 함께 흐름 수준 지표(재전송, 재전송 시간 초과, 전송 데이터량)를 캡처해요. 이 데이터는 Network Flow Monitor가 처리하고 EKS 콘솔에서 시각화되어 클러스터 환경의 트래픽과 이러한 흐름 수준 지표에 따른 성능을 표면화해요.

아래 다이어그램은 두 유형의 지표(시스템 및 흐름 수준)를 모두 활용해 더 많은 운영 인텔리전스를 얻을 수 있는 워크플로우를 보여줘요.

플랫폼 팀은 모니터링 스택에서 시스템 지표를 수집하고 시각화할 수 있어요. 알림을 설정한 상태에서 NFM 에이전트의 시스템 지표로 Pod나 워커 노드에 영향을 주는 네트워크 이상 또는 문제를 감지할 수 있어요.

다음 단계로 플랫폼 팀은 EKS 콘솔의 기본 시각화를 활용해 흐름 표현과 관련 지표를 기반으로 조사 범위를 더 좁히고 문제 해결을 가속화할 수 있어요.

중요 참고: NFM 에이전트의 시스템 지표 스크래핑과 NFM 에이전트가 흐름 수준 지표를 NFM 백엔드로 push하는 과정은 독립적인 프로세스예요.

지원 시스템 지표

중요 참고: 시스템 지표는 OpenMetrics 형식으로 내보내집니다.

지표 이름 유형 차원 설명
ingress_flow Gauge instance_id, iface, pod, namespace, node 수신 TCP 흐름 수 (TcpPassiveOpens)
egress_flow Gauge instance_id, iface, pod, namespace, node 송신 TCP 흐름 수 (TcpActiveOpens)
ingress_packets Gauge instance_id, iface, pod, namespace, node 수신 패킷 수 (delta)
egress_packets Gauge instance_id, iface, pod, namespace, node 송신 패킷 수 (delta)
ingress_bytes Gauge instance_id, iface, pod, namespace, node 수신 바이트 수 (delta)
egress_bytes Gauge instance_id, iface, pod, namespace, node 송신 바이트 수 (delta)
bw_in_allowance_exceeded Gauge instance_id, eni, node 인바운드 대역폭 한도로 큐잉/드롭된 패킷
bw_out_allowance_exceeded Gauge instance_id, eni, node 아웃바운드 대역폭 한도로 큐잉/드롭된 패킷
pps_allowance_exceeded Gauge instance_id, eni, node 양방향 PPS 한도로 큐잉/드롭된 패킷
conntrack_allowance_exceeded Gauge instance_id, eni, node 연결 추적(conntrack) 한도로 드롭된 패킷
linklocal_allowance_exceeded Gauge instance_id, eni, node 로컬 프록시 서비스 PPS 한도로 드롭된 패킷

지원 흐름 수준 지표

지표 이름 유형 설명
TCP retransmissions Counter 송신자가 전송 중 손실되거나 손상된 패킷을 재전송한 횟수
TCP retransmission timeouts Counter 송신자가 패킷이 전송 중 손실되었는지 판단하기 위해 대기 기간을 시작한 횟수
Data (bytes) transferred Counter 주어진 흐름에서 소스와 대상 사이에 전송된 데이터량

서비스 맵과 흐름 테이블

설치되면 Network Flow Monitor 에이전트는 모든 워커 노드에서 DaemonSet으로 실행되며 30초마다 상위 500개 네트워크 흐름(전송 데이터량 기준)을 수집해요.

이 네트워크 흐름은 Intra AZ, Inter AZ, EC2 → S3, EC2 → DynamoDB (DDB), Unclassified 범주로 정렬돼요. 각 흐름에는 재전송, 재전송 시간 초과, 전송 데이터량(바이트)이라는 3가지 지표가 연결돼요.

  • Intra AZ – 같은 AZ의 Pod 간 네트워크 흐름
  • Inter AZ – 다른 AZ의 Pod 간 네트워크 흐름
  • EC2 → S3 – Pod에서 S3로의 네트워크 흐름
  • EC2 → DDB – Pod에서 DDB로의 네트워크 흐름
  • Unclassified – Pod에서 인터넷 또는 온프레미스로의 네트워크 흐름

Network Flow Monitor Top Contributors API의 네트워크 흐름은 EKS 콘솔의 다음 환경을 지원하는 데 사용돼요.

  • 서비스 맵 (Service map): 클러스터 내 네트워크 흐름(Intra AZ 및 Inter AZ)의 시각화.
  • 흐름 테이블 (Flow table): 클러스터 내 네트워크 흐름(Intra AZ 및 Inter AZ), Pod에서 AWS 서비스로의 흐름(EC2 → S3 및 EC2 → DDB), Pod에서 외부 대상으로의 흐름(Unclassified)의 테이블 표현.

Top Contributors API에서 가져온 네트워크 흐름은 1시간 시간 범위로 제한되며 각 범주에서 최대 500개 흐름을 포함할 수 있어요. 서비스 맵의 경우 1시간 시간 범위에서 Intra AZ와 Inter AZ 흐름 범주에서 최대 1000개 흐름을 가져와 표시할 수 있어요. 흐름 테이블의 경우 2시간 시간 범위에서 5개 네트워크 흐름 범주 모두에서 최대 2500개 네트워크 흐름을 가져와 표시할 수 있어요.

고려 사항 및 제한 사항

  • EKS의 Container Network Observability는 Network Flow Monitor가 지원되는 리전에서만 사용할 수 있어요.
  • 지원 시스템 지표는 OpenMetrics 형식이며 Network Flow Monitor(NFM) 에이전트에서 직접 스크래핑할 수 있어요.
  • Terraform 같은 IaC(Infrastructure as Code)로 EKS의 Container Network Observability를 활성화하려면 구성에 다음 종속성을 정의하고 생성해야 해요: NFM scope, NFM monitor, NFM agent.
  • Network Flow Monitor는 분당 최대 약 5백만 흐름을 지원해요. 이는 Network Flow Monitor 에이전트가 설치된 약 5,000개의 EC2 인스턴스(EKS 워커 노드)에 해당해요. 5,000개 이상의 인스턴스에 에이전트를 설치하면 추가 용량이 확보될 때까지 모니터링 성능에 영향을 줄 수 있어요.
  • NFM 에이전트의 EKS 애드온은 최소 버전 1.1.0을 실행해야 해요.
  • Network Flow Monitor 리소스를 지원하려면 Terraform AWS Provider v6.21.0 이상을 사용해야 해요.
  • 네트워크 흐름을 Pod 메타데이터로 보강하려면 Pod가 호스트 네트워크 네임스페이스가 아닌 자체 격리된 네트워크 네임스페이스에서 실행되어야 해요.

더 알아보기 (Learn more)