Skip to main content

Data-plane and cluster component metrics

Inspect 1.36

The cluster components Syself Autopilot manages for you are where a whole class of problems becomes visible first: a Hetzner API rate limit that stalls load-balancer reconciles, a volume that will not attach, DNS latency that looks like an application bug, packets dropped by a policy nobody remembers writing. Cilium, Hubble, the Hetzner cloud controller manager, the CSI driver, and CoreDNS all report on themselves, and the collects them along with everything else on the node.

Where each one lives#

Two groups, split by which network namespace the endpoint is in.

Component Reached at Nodes
Cilium agent 127.0.0.1:9962 every node
Hubble 127.0.0.1:9965 every node
Cilium operator 127.0.0.1:9963 only the nodes running it
CSI node plugin 127.0.0.1:9189 cloud workers
Hetzner CCM pod IP on 8233 wherever the pods are scheduled
CSI controller pod IP on 9189 wherever the pods are scheduled
hubble-relay pod IP on 9966 wherever the pod is scheduled
CoreDNS the kube-dns endpoints on 9153 wherever the pods are scheduled

The Cilium agent, the Cilium operator, and the CSI node plugin run with hostNetwork: true, so their metrics are on the node's loopback. The rest run on the pod network, and the agent scrapes the pod IP of the pods on its own node, which spreads the work without any endpoint being scraped twice.

Note

The CSI node plugin is on the host network because it reads the Hetzner metadata service at its link-local address (169.254.169.254), which a pod network namespace cannot reach. Since worker nodes carry public IPs, it binds its metrics strictly to loopback so unauthenticated storage metrics are never published to the internet.

Important

The Cilium operator, hubble-relay, and the CSI controller each declare more than one container port, and Kubernetes pod discovery emits one target per port. A config that rewrites the address to a fixed metrics port without first selecting the metrics port scrapes each of them twice, which doubles every rate you compute from them. The System Alloy config filters on the port name for this reason.

What each one tells you#

Cilium agent. IP address pool consumption per node, which is what you check when pods stop getting addresses; eBPF map pressure; policy enforcement state; and the identity count, which grows with the number of distinct label sets in the cluster.

Hubble. Every dropped packet with its reason, which is the main network detection signal on this platform, plus connection-level flows and DNS and HTTP counters. The reason label is what separates a policy denial from a genuine failure. covers the groups the cluster enables, and turns them into alerts.

Cilium operator. Its own health and reconcile activity. It runs as a Deployment, so it exists on some nodes and not others, and a collector that expects it everywhere reports failures on the rest.

Hetzner CCM. Cloud API call counts and errors, rate-limit headroom, and load-balancer reconcile results. This is where a Hetzner API rate limit surfaces, and it surfaces here before it surfaces as a stuck Service.

Hetzner CSI. Volume provision, attach, detach, and resize results from the controller, and node-level plugin activity from the workers. Watch it when a PVC is slow to bind. Both halves also report the Hetzner API calls behind those operations, so an API problem looks the same here as it does in the CCM.

CoreDNS. Query and error rates per zone, plus latency. Rising SERVFAIL or latency here explains a surprising number of application timeouts, and is the next step when it does.

Confirm the data is arriving#

Run these against your Prometheus or in Grafana. Each one should return a value per node or per pod rather than nothing:

text
		# IP address capacity per node, from the Cilium agent
sum(cilium_ipam_capacity) by (instance)
 
# Dropped packets by reason and protocol, from Hubble
sum(rate(hubble_drop_total[5m])) by (reason, protocol)
 
# Hetzner API requests in flight, from both halves of the CSI driver
sum(hcloud_api_in_flight_requests{job=~"csi-.*"}) by (job, instance)
 
# CCM reconcile operations by operation
sum(rate(cloud_controller_manager_operations_total{job="ccm"}[5m])) by (op)
 
# CoreDNS requests by zone
sum(rate(coredns_dns_requests_total{job="coredns"}[5m])) by (zone)
	

If a query returns a doubled rate, check the port-name filter above before you trust the number. If it returns nothing at all, starts from the target list.

Cilium maintains Grafana dashboards for the agent, the operator, and Hubble that read these series directly; importing them is covered in .