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가 호스트 네트워크 네임스페이스가 아닌 자체 격리된 네트워크 네임스페이스에서 실행되어야 해요.