엔터프라이즈 Zabbix 확장 패턴: K8S Pod 네트워크 트래픽 수집 (cAdvisor 기반)

일반적으로 Zabbix Kubernetes 템플릿은 CPU, 메모리, 디스크, 노드 상태, 컨테이너 상태 위주의 기본 지표만 제공한다. Pod 단위 네트워크 트래픽은 빠져 있다. 많은 운영 환경에서는 Prometheus를 통해 이 문제를 해결하지만, 여기서는 Zabbix만으로 Pod-level 네트워크 트래픽 수집을 완성한 사례를 공유한다.

이 설계는 레퍼런스가 전혀 없는 상태에서 직접 만든 것으로, 검증된 운영 환경에서 이미 활용 중이다.


설계 개요

  • 데이터 원천: Kubelet cAdvisor 메트릭
  • 수집 구조: HTTP agent → 마스터 아이템 → Discovery(LDD) → 아이템 프로토타입 → 전처리 체인
  • 최종 목표: Pod/Namespace/Interface 단위 RX, TX 트래픽(bps)

1. 마스터 아이템

  • Kubernetes Kubelet by HTTP: Get cadvisor metrics를 마스터 아이템으로 지정.
  • 모든 Discovery와 아이템 프로토타입은 이 데이터를 기반으로 동작.

2. Discovery 규칙 (Prod K8S NODE)

  • 이름: cadvisor network interface discovery
  • 종류: 의존 아이템
  • 키: kubelet.cadvisor.net.discovery
  • 마스터 아이템: Prod-K8S NODE: Get cadvisor metrics

전처리 (JavaScript)

Pod, Namespace, Interface를 추출. 중복 제거 포함.

— code 시작 —

varlines = value.split(“\n”);

varseen = {};

varresult = [];

for (vari = 0; i < lines.length; i++) {

// RX 메트릭만 필터링

varmatch = lines[i].match(/^container_network_receive_bytes_total\{([^}]+)\}/);

if (!match) continue;

varlabelBlock = match[1];

variface = (labelBlock.match(/interface=”([^”]+)”/) || [])[1];

varpod = (labelBlock.match(/pod=”([^”]+)”/) || [])[1];

varns = (labelBlock.match(/namespace=”([^”]+)”/) || [])[1];

if (!iface || !pod || !ns) continue;

varkey = iface + pod + ns;

if (seen[key]) continue;

seen[key] = true;

result.push({

“{#IFACE}”: iface,

“{#POD}”: pod,

“{#NAMESPACE}”: ns

});

}

returnJSON.stringify({ data: result });

— code 끝 —


3. 아이템 프로토타입

A. RX 트래픽

  • 이름: RX: [{#NAMESPACE}] {#POD} ({#IFACE})
  • 키: cadvisor.net.rx[{#IFACE},{#POD},{#NAMESPACE}]
  • 단위: bps
  • 데이터형: 수치(float)
  • 마스터 아이템: Prod K8S NODE: Get cadvisor metrics

전처리 체인

  1. JavaScript: RX 최신값 추출

— code 시작 —

varlines = value.split(“\n”);

variface = “{#IFACE}”;

varpod = “{#POD}”;

varns = “{#NAMESPACE}”;

varlatestTs = 0;

varlatestVal = 0;

for (vari = 0; i < lines.length; i++) {

varm = lines[i].match(/^container_network_receive_bytes_total\{([^}]+)\}\s+([0-9.eE+-]+)\s+(\d+)$/);

if (!m) continue;

varlabels = m[1];

varval = parseFloat(m[2]);

varts = parseInt(m[3]);

if (labels.includes(‘interface=”‘ + iface + ‘”‘) &&

labels.includes(‘pod=”‘ + pod + ‘”‘) &&

labels.includes(‘namespace=”‘ + ns + ‘”‘)) {

if (ts > latestTs) {

latestTs = ts;

latestVal = val;

}

}

}

if (latestTs > 0) returnlatestVal;

throw”No matching metric found”;

— code 끝 —

  1. 1초 단위 변경(per second)
  2. JavaScript: bps 환산 (cadvisor 카운터 원본 = Byte)

    — code 시작 —

returnvalue * 8;

— code 끝 —


B. TX 트래픽

  • 이름: TX: [{#NAMESPACE}] {#POD} ({#IFACE})
  • 키: cadvisor.net.tx[{#IFACE},{#POD},{#NAMESPACE}]
  • 단위: bps
  • 데이터형: 수치(float)
  • 마스터 아이템: Prod K8S NODE: Get cadvisor metrics

전처리 체인

  1. JavaScript: TX 최신값 추출

    — code 시작 —

varlines = value.split(“\n”);

variface = “{#IFACE}”;

varpod = “{#POD}”;

varns = “{#NAMESPACE}”;

varlatestTs = 0;

varlatestVal = 0;

for (vari = 0; i < lines.length; i++) {

varm = lines[i].match(/^container_network_transmit_bytes_total\{([^}]+)\}\s+([0-9.eE+-]+)\s+(\d+)$/);

if (!m) continue;

varlabels = m[1];

varval = parseFloat(m[2]);

varts = parseInt(m[3]);

if (labels.includes(‘interface=”‘ + iface + ‘”‘) &&

labels.includes(‘pod=”‘ + pod + ‘”‘) &&

labels.includes(‘namespace=”‘ + ns + ‘”‘)) {

if (ts > latestTs) {

latestTs = ts;

latestVal = val;

}

}

}

if (latestTs > 0) returnlatestVal;

throw”No matching metric found”;

— code 끝 —

  1. 1초 단위 변경(per second)
  2. JavaScript: bps 환산

    — code 시작 —

returnvalue * 8;

— code 끝 —


4. 트리거 전략

물리 네트워크 인터페이스 트래픽은 별도 모니터링으로 커버 중. Pod-level 지표는 흐름 분석 용도로만 사용. 따라서 트리거는 생성하지 않았다. 필요 시 동일한 프로토타입 기반으로 트리거 추가 가능.


5. 엔터프라이즈 활용 가치

  • Zabbix 기본 템플릿 한계를 직접 보완.
  • Prometheus 없이도 Pod-level 네트워크 가시성 확보.
  • Discovery + 프로토타입 구조로 자동 확장 대응.
  • 운영 환경에서 안정성 검증 완료.

이 설계는 Zabbix를 단순 노드/리소스 모니터링 도구에서 Pod-level 네트워크까지 커버하는 엔터프라이즈급 솔루션으로 확장시킨 사례.

ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. 본문 및 이미지를 무단 복제·배포할 수 없습니다. 공유 시 반드시 원문 링크를 명시해 주세요.
ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. All rights reserved. Unauthorized copying or redistribution of the text and images is prohibited. When sharing, please include the original source link.

🛠 마지막 수정일: 2025.09.18