fix(alloy): scrape cadvisor from the kubelet port instead of the API server proxy

Alloy Helm 차트의 ClusterRole에는 nodes/metrics는 있지만 nodes/proxy가 없어(실측 2026-10-08)
/api/v1/nodes/<n>/proxy/metrics/cadvisor 경로가 거부되고 container_* 지표가 비었다. kubelet
10250을 직접 스크랩한다(자체 서명 인증서라 insecure_skip_verify). up도 남겨 스크랩 성공 여부를
볼 수 있게 하고, container_* 는 demo·ingress-nginx·argocd 네임스페이스만 유지한다.
This commit is contained in:
seon committed 2026-10-08 02:03:56 +09:00
1 parent bc8a8fbc97
commit aa99da8a81
1 file changed
+12 -12
+12 -12
View File
@@ -103,30 +103,30 @@ spec:
clustering { enabled = true } clustering { enabled = true }
} }
// ---- cadvisor through the API server proxy (container CPU/memory of namespace demo) ---- // ---- cadvisor straight from each kubelet (container CPU/memory of namespace demo) ----
// nodes/metrics is in the chart ClusterRole, nodes/proxy is not (checked 2026-10-08), so the kubelet
// port is scraped directly; the kubeadm kubelet serving certificate is self-signed, hence insecure_skip_verify.
discovery.kubernetes "nodes" { role = "node" } discovery.kubernetes "nodes" { role = "node" }
discovery.relabel "cadvisor" { discovery.relabel "cadvisor" {
targets = discovery.kubernetes.nodes.targets targets = discovery.kubernetes.nodes.targets
rule { rule {
target_label = "__address__"
replacement = "kubernetes.default.svc:443"
}
rule {
source_labels = ["__meta_kubernetes_node_name"]
regex = "(.+)"
target_label = "__metrics_path__" target_label = "__metrics_path__"
replacement = "/api/v1/nodes/$1/proxy/metrics/cadvisor" replacement = "/metrics/cadvisor"
} }
rule { rule {
source_labels = ["__meta_kubernetes_node_name"] source_labels = ["__meta_kubernetes_node_name"]
target_label = "node" target_label = "node"
} }
rule {
target_label = "job"
replacement = "cadvisor"
}
} }
prometheus.scrape "cadvisor" { prometheus.scrape "cadvisor" {
targets = discovery.relabel.cadvisor.output targets = discovery.relabel.cadvisor.output
scheme = "https" scheme = "https"
bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token" bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token"
tls_config { ca_file = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" } tls_config { insecure_skip_verify = true }
scrape_interval = "30s" scrape_interval = "30s"
forward_to = [prometheus.relabel.cadvisor_keep.receiver] forward_to = [prometheus.relabel.cadvisor_keep.receiver]
clustering { enabled = true } clustering { enabled = true }
@@ -135,12 +135,12 @@ spec:
forward_to = [prometheus.remote_write.mimir.receiver] forward_to = [prometheus.remote_write.mimir.receiver]
rule { rule {
source_labels = ["__name__"] source_labels = ["__name__"]
regex = "container_(cpu_usage_seconds_total|memory_working_set_bytes|oom_events_total|network_receive_bytes_total|network_transmit_bytes_total)" regex = "up|container_(cpu_usage_seconds_total|memory_working_set_bytes|oom_events_total|network_receive_bytes_total|network_transmit_bytes_total)"
action = "keep" action = "keep"
} }
rule { rule {
source_labels = ["namespace"] source_labels = ["__name__", "namespace"]
regex = "demo|ingress-nginx|argocd" regex = "container_.*;(demo|ingress-nginx|argocd)"
action = "keep" action = "keep"
} }
rule { rule {