본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Prometheus로 Felix 모니터링하기

원문 보기 위키 갱신

Prometheus로 Felix 모니터링하기 (Monitoring Felix with Prometheus)

Felix는 설정하면 여러 메트릭을 Prometheus로 보고할 수 있어요. 메트릭 보고를 활성화하는 방법은 구성 참조를 보세요. 이 문서는 Felix가 노출하는 카운터와 게이지를 정리한 메트릭 참조예요.

출처: 문서

본문

Felix는 설정하면 여러 메트릭을 Prometheus로 보고할 수 있어요. 메트릭 보고를 활성화하는 방법은 구성 참조를 보세요.

메트릭 참조

Felix 고유 메트릭

Felix는 여러 Prometheus 메트릭을 내보내요. 현재 집합은 다음과 같아요. 일부 메트릭은 Felix 내부의 특정 구현 선택에 묶여 있기 때문에, 메트릭이 릴리스 간에 유지된다는 보장은 하드하게 할 수 없어요. 다만 기존 메트릭에 불필요한 변화를 만들지 않는 것을 목표로 하고 있어요.

클러스터 전체 메트릭

이름 설명
felix_cluster_num_host_endpoints 클러스터 전체의 호스트 엔드포인트 총 개수예요.
felix_cluster_num_hosts 클러스터의 Calico 호스트 총 개수예요.
felix_cluster_num_policies 클러스터의 정책 총 개수예요.
felix_cluster_num_profiles 클러스터의 프로파일 총 개수예요.
felix_cluster_num_tiers 클러스터의 Calico 티어(tier) 총 개수예요.
felix_cluster_num_workload_endpoints 클러스터 전체의 워크로드 엔드포인트 총 개수예요.

일반 메트릭

이름 설명
felix_active_local_endpoints 이 호스트의 활성 엔드포인트(워크로드+호스트) 개수예요.
felix_active_local_policies 이 호스트의 활성 정책 개수예요. 로컬 엔드포인트에 매칭되는 "활성" 정책만 유의미한 비용을 가져요.
felix_active_local_selectors 이 호스트의 활성 셀렉터 개수예요. "활성" 규칙 src/dest 셀렉터만 유의미한 비용을 가져요.
felix_exec_time_micros 자식 프로세스를 fork/exec하는 데 걸린 시간 요약이에요.
felix_log_errors 정상적인 "process" 로그(예: stdout)를 만드는 중 마주친 에러 개수예요.
felix_logs_dropped 출력 스트림이 막혀서 버려진 로그 개수예요.

계산 그래프 메트릭

계산 그래프(calculation graph)는 데이터스토어에서 들어온 업데이트를 처리해 이 노드의 활성 엔드포인트/정책 등을 계산해요.

이름 설명
felix_calc_graph_output_events 계산 그래프가 내보낸 이벤트 개수예요.
felix_calc_graph_update_time_seconds 데이터스토어 OnUpdate 호출마다 계산 그래프를 갱신하는 데 걸린 초예요.
felix_calc_graph_updates_processed 계산 그래프가 처리한 데이터스토어 업데이트 개수예요.

공통 데이터플레인 메트릭

이름 설명
felix_resyncs_started Felix가 데이터스토어와의 재동기화(resync)를 시작한 횟수예요. (Typha 배포에서는 의미가 없어요.)
felix_resync_state 현재 데이터스토어-데이터플레인 동기화 상태를 숫자로 인코딩한 값이에요. 1="데이터스토어 대기 중", 2="재동기화 진행 중", 3="데이터스토어와 동기화됨".
felix_int_dataplane_addr_msg_batch_size 각 배치에서 처리한 인터페이스 주소 메시지 개수예요. 값이 높다는 것은 따라잡으려고 더 많은 배칭을 하고 있다는 뜻이에요.
felix_int_dataplane_apply_time_seconds 데이터플레인 업데이트를 적용하는 데 걸린 시간(초)이에요.
felix_int_dataplane_failures 데이터플레인 업데이트가 실패해서 재시도 대기가 된 횟수예요.
felix_int_dataplane_iface_msg_batch_size 각 배치에서 처리한 인터페이스 상태 메시지 개수예요. 값이 높다는 것은 따라잡으려고 더 많은 배칭을 하고 있다는 뜻이에요.
felix_int_dataplane_messages 타입별 데이터플레인 메시지 개수예요.
felix_int_dataplane_msg_batch_size 각 배치에서 처리한 메시지 개수예요. 값이 높다는 것은 따라잡으려고 더 많은 배칭을 하고 있다는 뜻이에요.
felix_route_table_list_seconds 재동기화 중 모든 인터페이스를 나열하는 데 걸린 시간이에요.
felix_route_table_per_iface_sync_seconds 인터페이스 하나를 동기화하는 데 걸린 시간이에요.

iptables 데이터플레인 메트릭

이름 설명
felix_iptables_chains 활성 iptables 체인 개수예요.
felix_iptables_lines_executed 실행된 iptables 규칙 업데이트 개수예요.
felix_iptables_lock_acquire_secs iptables 락을 획득하는 데 걸린 시간이에요.
felix_iptables_lock_retries iptables 락이 이미 점유되어 있어 felix가 재시도로 획득해야 했던 횟수예요.
felix_iptables_restore_calls iptables-restore 호출 횟수예요.
felix_iptables_restore_errors iptables-restore 에러 개수예요.
felix_iptables_rules 활성 iptables 규칙 개수예요.
felix_iptables_save_calls iptables-save 호출 횟수예요.
felix_iptables_save_errors iptables-save 에러 개수예요.

BPF 데이터플레인 메트릭

이름 설명
felix_bpf_dataplane_endpoints 데이터플레인에서 관리 중인 BPF 엔드포인트 개수예요.
felix_bpf_dirty_dataplane_endpoints 데이터플레인에서 관리 중인 BPF 엔드포인트 중 장애 후 dirty 상태로 남은 개수예요.
felix_bpf_happy_dataplane_endpoints 성공적으로 프로그래밍된 BPF 엔드포인트 개수예요.
felix_bpf_num_ip_sets 데이터플레인에서 관리 중인 BPF IP 셋 개수예요.

Prometheus 메트릭은 스스로를 설명해요. 메트릭을 켜 놓으면 curl로 메트릭 목록과 도움말 텍스트, 타입 정보를 함께 볼 수 있어요.

curl -s http://localhost:9091/metrics | head

응답 예시:

# HELP felix_active_local_endpoints Number of active endpoints on this host.
# TYPE felix_active_local_endpoints gauge
felix_active_local_endpoints 91
# HELP felix_active_local_policies Number of active policies on this host.
# TYPE felix_active_local_policies gauge
felix_active_local_policies 0
# HELP felix_active_local_selectors Number of active selectors on this host.
# TYPE felix_active_local_selectors gauge
felix_active_local_selectors 82
...

레이블 인덱스 메트릭

레이블 인덱스는 Felix의 하위 컴포넌트로, 활성 정책 규칙에 들어 있는 각 셀렉터에 매칭되는 엔드포인트와 네트워크 셋의 집합을 계산하는 역할을 해요. 정책 규칙은 그 정책이 속한 정책의 최상위 셀렉터(spec.selector)가 해당 노드의 워크로드 또는 호스트 엔드포인트를 고를 때 그 노드에서 활성이 돼요. 비활성 정책은 셀렉터가 인덱싱되지 않기 때문에 CPU 비용이 거의 없어요.

레이블 인덱스는 활성 셀렉터를 클러스터의 모든 엔드포인트와 네트워크 셋에 매칭해야 하기 때문에 성능이 중요하고, CPU 사용량을 최소화하려고 다양한 최적화를 지원해요. 그 메트릭을 사용하면 여러분의 정책 집합에 최적화가 활성화되어 있는지 확인할 수 있어요.

felix_label_index_num_endpoints

인덱스가 추적 중인 엔드포인트(및 네트워크 셋 같은 유사 객체)의 총 개수를 보고해요. 이 값은 클러스터의 엔드포인트와 네트워크 셋 개수와 일치해야 해요.

felix_label_index_num_active_selectors{optimized="true|false"}

활성 셀렉터의 총 개수를 optimized="true"와 optimized="false" 부분합으로 나눠 보고해요.

optimized="true" 합계는 레이블 인덱스가 최적화에 성공한 셀렉터 수를 추적해요. 그 셀렉터들은 수십만 엔드포인트를 가진 클러스터에서도 효율적으로 계산될 수 있어야 해요. 일반적으로 그 계산에 쓰이는 CPU는 그 셀렉터에 매칭되는 엔드포인트 수와 그 엔드포인트들의 변동률(churn rate)에 비례해요.

optimized="false" 합계는 최적화할 수 없었던 셀렉터 수를 추적해요. 최적화되지 않은 셀렉터는 계산 비용이 훨씬 커요. 그 계산에 쓰이는 CPU는 클러스터의 엔드포인트 총수와 그 변동률에 비례해요. 최적화되지 않은 셀렉터가 몇 개 정도 있는 건 보통 괜찮지만, 많은 셀렉터가 최적화되지 않으면 큰 규모에서 CPU 사용량이 상당해질 수 있어요.

최적화 가능한 셀렉터를 작성하는 방법에 대한 자세한 내용은 NetworkPolicy 참조의 이 섹션을 보세요.

felix_label_index_selector_evals{result="true|false"}

셀렉터가 엔드포인트와 매칭 여부를 판단하려고 평가된 총 횟수를, 매칭(true)과 미매칭(false)으로 나눠 세어요. 매칭 대비 미매칭 비율은 셀렉터 인덱싱 최적화가 여러분의 정책 집합에 얼마나 효과적인지 보여줘요. 레이블 인덱스가 셀렉터를 더 효과적으로 최적화할수록 "match"에 비해 "no-match" 결과를 더 적게 보고할 거예요.

활성 셀렉터가 몇 개를 넘게 있는데 felix_label_index_selector_evals{result="false"}가 felix_label_index_selector_evals{result="true"}의 여러 배라면, 정책 집합의 일부 셀렉터가 효과적으로 최적화되지 않고 있을 가능성이 커요.

felix_label_index_strategy_evals{strategy="..."}

레이블 인덱스가 사용 가능한 각 최적화 전략을 몇 번 사용했는지 보여주는 기술 통계예요. 전략은 시간이 지나면 달라질 수 있지만, 작성 시점 기준으로 다음과 같아요:

  • endpoint-full-scan: 최적화되지 않은 셀렉터용 가장 비효율적인 폴백 전략이에요. 인덱스가 셀렉터의 매칭을 찾으려고 모든 엔드포인트를 훑었어요.

  • endpoint|parent-no-match: 가장 효율적인 전략이에요. 인덱스가 셀렉터에 매칭되는 것이 없음을 증명해서 스캔을 완전히 건너뛸 수 있었어요.

  • endpoint|parent-single-value: 레이블 인덱스가 스캔을 특정 레이블과 값 조합을 가진 엔드포인트/부모로만 제한할 수 있었어요. 예를 들어 label == "value" 셀렉터는 그 레이블이 정확히 "value"로 설정된 항목만 스캔해요.

  • endpoint|parent-multi-value: 레이블 인덱스가 스캔을 특정 레이블과 몇 가지 값 중 하나를 가진 엔드포인트/부모로만 제한할 수 있었어요. 예를 들어 label in {"a", "b") 셀렉터는 그 레이블이 주어진 값 중 하나로 설정된 항목만 스캔해요.

  • endpoint|parent-label-name: 레이블 인덱스가 스캔을 특정 레이블을 가진 엔드포인트/부모로만 제한할 수 있었어요(다만 특정 값 집합으로는 제한하지 못했어요). 예를 들어 has(label)은 이런 종류의 스캔을 유발해요.

용어 정리: 여기서 "endpoint"는 "엔드포인트 또는 NetworkSet"을 뜻하고, "parent"는 쿠버네티스 네임스페이스 같은 리소스에 대한 Felix의 내부 명칭이에요. "parent" 스캔은 레이블 인덱스가 해당 전략에 맞는 부모를 가진 모든 엔드포인트를 훑었다는 뜻이에요.

CPU / 메모리 메트릭

Felix는 Prometheus가 기본으로 제공하는 메트릭 집합도 내보내요. 현재로서는 다음을 포함해요:

이름 설명
go_gc_duration_seconds GC 호출 소요 시간의 요약이에요.
go_goroutines 현재 존재하는 고루틴 개수예요.
go_memstats_alloc_bytes 할당되어 아직 사용 중인 바이트 수예요.
go_memstats_alloc_bytes_total 해제되었더라도 포함해 총 할당된 바이트 수예요.
go_memstats_buck_hash_sys_bytes 프로파일링 버킷 해시 테이블이 사용하는 바이트 수예요.
go_memstats_frees_total 총 해제(free) 횟수예요.
go_memstats_gc_sys_bytes 가비지 컬렉션 시스템 메타데이터에 사용되는 바이트 수예요.
go_memstats_heap_alloc_bytes 할당되어 아직 사용 중인 힙 바이트 수예요.
go_memstats_heap_idle_bytes 사용을 기다리는 힙 바이트 수예요.
go_memstats_heap_inuse_bytes 사용 중인 힙 바이트 수예요.
go_memstats_heap_objects 할당된 객체 개수예요.
go_memstats_heap_released_bytes_total OS로 반납한 힙 바이트 총량이에요.
go_memstats_heap_sys_bytes 시스템에서 얻은 힙 바이트 수예요.
go_memstats_last_gc_time_seconds 마지막 가비지 컬렉션 이후 1970년 기준 경과 초예요.
go_memstats_lookups_total 포인터 조회 총 횟수예요.
go_memstats_mallocs_total 총 malloc 횟수예요.
go_memstats_mcache_inuse_bytes mcache 구조체가 사용 중인 바이트 수예요.
go_memstats_mcache_sys_bytes 시스템에서 얻은 mcache 구조체용 바이트 수예요.
go_memstats_mspan_inuse_bytes mspan 구조체가 사용 중인 바이트 수예요.
go_memstats_mspan_sys_bytes 시스템에서 얻은 mspan 구조체용 바이트 수예요.
go_memstats_next_gc_bytes 다음 가비지 컬렉션이 일어날 때의 힙 바이트 수예요.
go_memstats_other_sys_bytes 기타 시스템 할당에 사용되는 바이트 수예요.
go_memstats_stack_inuse_bytes 스택 할당자가 사용 중인 바이트 수예요.
go_memstats_stack_sys_bytes 시스템에서 스택 할당자용으로 얻은 바이트 수예요.
go_memstats_sys_bytes 시스템에서 얻은 바이트 수예요. 모든 시스템 할당의 합이에요.
process_cpu_seconds_total 소비한 총 사용자/시스템 CPU 시간(초)이에요.
process_max_fds 열 수 있는 파일 디스크립터의 최대 개수예요.
process_open_fds 열려 있는 파일 디스크립터 개수예요.
process_resident_memory_bytes 상주 메모리 크기(바이트)예요.
process_start_time_seconds Unix epoch 기준 프로세스 시작 시간(초)이에요.
process_virtual_memory_bytes 가상 메모리 크기(바이트)예요.

WireGuard 메트릭

Felix는 발견/감지되면 WireGuard 디바이스 통계도 내보내요. Felix 구성으로 비활성화할 수 있어요.

이름 설명
wireguard_meta Gauge. felix/calico 노드의 디바이스/인터페이스 정보이고, 값은 이 메트릭의 레이블에 있어요
wireguard_bytes_rcvd Counter. 피어 공개키와 엔드포인트로 식별되는 피어로부터 현재 수신한 바이트예요
wireguard_bytes_sent Counter. 피어 공개키와 엔드포인트로 식별되는 피어에게 현재 보낸 바이트예요
wireguard_latest_handshake_seconds Gauge. 피어와의 마지막 핸드셰이크, 초 단위 Unix 타임스탬프예요.

로드 밸런서 메트릭

Felix는 로드 밸런싱 모니터링용 통계를 내보내요.

felix_bpf_conntrack_maglev_entries_total{destination="local|remote",ip_family="4|6"}

IP 버전별로, 그리고 목적지 백엔드가 원격(우리가 프런트엔드 역할)인지 로컬(우리가 백엔드 노드)인지에 따라 나눈 conntrack 테이블의 Maglev 엔트리 총 개수예요.

더 알아보기 (Learn more)

  • 메트릭 보고를 켜는 방법은 Felix 구성 참조를 참고하세요.
  • 최적화 가능한 셀렉터를 작성하는 요령은 NetworkPolicy 참조의 selector performance 섹션에 정리되어 있어요.
  • 메트릭을 수집하는 Prometheus 설정 방법은 컴포넌트 메트릭 모니터링 튜토리얼을 참고하세요.