일반적으로 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

전처리 체인
- 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초 단위 변경(per second)
- 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

전처리 체인
- 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초 단위 변경(per second)
- JavaScript: bps 환산
— code 시작 —
returnvalue * 8;
— code 끝 —

4. 트리거 전략
물리 네트워크 인터페이스 트래픽은 별도 모니터링으로 커버 중. Pod-level 지표는 흐름 분석 용도로만 사용. 따라서 트리거는 생성하지 않았다. 필요 시 동일한 프로토타입 기반으로 트리거 추가 가능.
5. 엔터프라이즈 활용 가치
- Zabbix 기본 템플릿 한계를 직접 보완.
- Prometheus 없이도 Pod-level 네트워크 가시성 확보.
- Discovery + 프로토타입 구조로 자동 확장 대응.
- 운영 환경에서 안정성 검증 완료.
이 설계는 Zabbix를 단순 노드/리소스 모니터링 도구에서 Pod-level 네트워크까지 커버하는 엔터프라이즈급 솔루션으로 확장시킨 사례.
ⓒ 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
답글 남기기
댓글을 달기 위해서는 로그인해야합니다.