Hh

2026. 7. 2. 11:15카테고리 없음

맞습니다. Headless Service는 clusterIP: None이기 때문에 실질적으로 IP 대역을 전혀 차지하지 않는데, apiserver_storage_objects 메트릭은 그냥 쿠버네티스 Object의 총개수만 세다 보니 수치가 왜곡(오염)되는 치명적인 문제가 있습니다.
만약 **Cilium**을 CNI로 사용 중이시라면 (kubeProxyReplacement=true 등으로) Cilium이 커널 영역(eBPF Map)에서 실제로 관리하는 **진짜 ClusterIP 서비스 개수만 추려내는 메트릭**을 제공하므로 이를 활용하시면 됩니다.
## 🛠️ Cilium 메트릭으로 해결하기
Cilium Agent(cilium-agent) 노드에서 발행하는 메트릭 중 **cilium_bpf_map_ops_total** 또는 **cilium_bpf_maps_max_entries** 관련 맵을 추적하거나, eBPF 내부 서비스 테이블 크기를 확인할 수 있습니다.
하지만 더 직접적으로 **"진짜 IP가 할당된 서비스"**만 카운트하고 싶다면, 아래의 2가지 PromQL 접근 방식을 강력히 추천합니다.
### 방법 1. API Server 메트릭에서 Headless만 빼버리기 (가장 깔끔)
Cilium 메트릭으로 넘어가기 전에, 기존 API Server 메트릭을 유지하면서 **Headless Service의 개수만 수식으로 빼주는 방법**입니다. 쿠버네티스는 Headless 서비스의 개수도 따로 추적할 수 있습니다.
```promql
# (전체 서비스 개수 - Headless 서비스 개수) = 진짜 ClusterIP 사용 개수
(
  max(apiserver_storage_objects{resource="services", cluster="$cluster"}) 
  - 
  max(count(kube_service_info{cluster="$cluster", cluster_ip="None"}))
)

```
> 💡 **설명:** 프로메테우스에 kube-state-metrics가 연동되어 있다면 kube_service_info{cluster_ip="None"} 쿼리로 Headless 서비스만 정확히 골라내어 전체 개수에서 차감할 수 있습니다. 가장 오염 없는 순수 ClusterIP 개수가 나옵니다.

### 방법 2. Cilium eBPF LoadBalancer Map 메트릭 활용
Cilium은 가상 IP(ClusterIP)를 실제 Pod IP로 포워딩하기 위해 eBPF 맵(cilium_lb4_services_v2)에 서비스 정보를 등록합니다. 여기에 등록된 내역을 기반으로 카운트하는 방법입니다.
Cilium Agent가 내보내는 메트릭 중 아래 쿼리를 그라파나 Explore에서 먼저 검색해 보세요.
```promql
# Cilium이 바라보는 백엔드 서비스(LB) 맵의 현재 엔트리 개수
sum(cilium_bpf_map_pressure{map_name="cilium_lb4_services_v2", cluster="$cluster"})

```
 * **특징:** Headless 서비스는 eBPF 가상 IP 라우팅 레이어를 거치지 않으므로, 이 맵(Map) 카운트에서 **자동으로 제외**됩니다.
 * 다만, 이 메트릭은 서비스 1개당 포트 개수나 엔드포인트 세부 사항에 따라 숫자가 1:1 매칭이 아닐 수 있으므로, 현재 클러스터에서 실제 ClusterIP 서비스 개수와 이 메트릭의 수치가 대략 몇 배수 차이 나는지 기준점(Baseline)을 확인하신 후 분모를 조정하여 사용하셔야 합니다.
## 👨‍💻 결론 및 추천
가장 오차가 없고 명확한 것은 **[방법 1]**입니다.
그라파나 수식을 아래와 같이 변경하시면 Headless로 인한 오염이 완벽하게 필터링된 **순수 IP 사용률**을 구할 수 있습니다.
```promql
((max(apiserver_storage_objects{resource="services", cluster="$cluster"}) - max(count(kube_service_info{cluster="$cluster", cluster_ip="None"}))) / 24576) * 100

```
이 수식으로 게이지(Gauge)를 다시 구성해 보세요. 스케일링으로 늘어난 Headless 서비스들이 싹 빠지면서 눈에 띄게 수치가 안정되는 것을 보실 수 있을 겁니다!