Provider Connectors

What the agent reads

Every Kubernetes permission the LevelFour agent holds, every field it sends to LevelFour, and what it never reads or sends.

The agent is read-only. Its ClusterRole grants only read verbs (get, list and watch), so it cannot create, change or delete anything in your cluster. It installs no webhook and no CRD, holds no cloud credentials, and opens no port to the outside. Connect a cluster covers installing and removing it.

Permissions

API groupResourcesWhy the agent reads them
corepods, nodes, namespaces, persistentvolumeclaims, persistentvolumesRequests, limits, restarts, placement, node capacity, namespace labels, volume size and owner
corenodes/metricsCPU, memory and throttling per container, network bytes per pod and node, and used bytes per volume, from the kubelet
corenodes/statsEphemeral storage per container and pod, node filesystem use and process counts, from the kubelet Summary API (read-only)
appsdeployments, statefulsets, daemonsets, replicasetsWhich workload owns each pod, and its replica count
batchjobs, cronjobsWhich workload owns each pod
autoscalinghorizontalpodautoscalersScaling targets and current replicas, so a recommendation never fights the autoscaler
autoscaling.k8s.ioverticalpodautoscalersA workload a VPA already sizes gets no recommendation; its own recommendation is shown next to ours
keda.shscaledobjects, scaledjobsScaling targets of KEDA-scaled workloads
policypoddisruptionbudgetsAvailability rules that a change must respect
karpenter.shnodepoolsCapacity types, instance families, limits and consolidation settings
karpenter.k8s.awsec2nodeclassesThe node image family behind each NodePool
argoproj.ioapplicationsThe repository and path that deploy each workload
kustomize.toolkit.fluxcd.iokustomizationsThe path that deploys each workload
source.toolkit.fluxcd.iogitrepositoriesThe repository behind each Flux Kustomization

Resources from Karpenter, KEDA, the Vertical Pod Autoscaler, ArgoCD or Flux are read only when those tools are installed. The agent works without any of them.

What it sends

The agent sends a usage summary once an hour and a short status check every few minutes. It samples usage every 30 seconds and sends percentiles, never the raw samples.

  • Cluster: name, Kubernetes version, cloud provider and region. The cluster's identity is the UID of its kube-system namespace.
  • Namespaces: name, labels, creation time.
  • Nodes: name, instance ID, instance type, zone, architecture, capacity type (Spot or On-Demand), node pool or node group, labels, capacity and allocatable CPU, memory, ephemeral storage, GPU and pod slots, CPU and memory usage, the node and image filesystems at their fullest (capacity, used, available, inodes), the process limit and the most processes running at once, how long it was Ready, evictions on it, bytes received and sent on its physical network interfaces, and how long it was under memory, disk or PID pressure.
  • Workloads: kind, name, namespace, replica counts, pod template labels, how long its pods ran on each node, how long they waited as Pending, evictions, bytes received and sent by its pods (and sent per node), the bytes its pods hold in disk-backed emptyDir volumes, overall and the largest pod per node (secret, configMap, projected and downward API volumes are never counted), whether it runs on the host network, whether topology spread or pod anti-affinity is set, and four annotations: meta.helm.sh/release-name, meta.helm.sh/release-namespace, argocd.argoproj.io/tracking-id, and any key under levelfour.ai/.
  • Containers: name, image, requests and limits, CPU, memory and ephemeral storage usage percentiles, restarts, OOM kills, the share of time its CPU was throttled, and whether liveness, readiness and startup probes are set.
  • Volumes: name, namespace, phase, storage class, access modes, requested, provisioned and used size, the volume ID, and which workloads mount it.
  • Autoscaling: HPA and KEDA targets and replica bounds, the lowest, highest and average replicas over the hour and the time spent at the maximum, VPA update mode and its current CPU and memory recommendation per container (target, lower and upper bound, uncapped target), PodDisruptionBudget rules, Karpenter NodePool requirements, limits and consolidation settings.
  • GitOps sources: for ArgoCD Applications and Flux Kustomizations, the repository URL, path, revision and values files.

What it never reads or sends

The agent cannot read, because its role grants no access:

  • Secrets.
  • ConfigMaps.

The agent reads pod specs to find requests and limits, and drops these fields before sending:

  • Environment variables, command and arguments.
  • Every annotation outside the four listed above. Some annotations, such as kubectl.kubernetes.io/last-applied-configuration, hold a full manifest.
  • KEDA trigger settings other than CPU and memory targets. Other triggers can name hosts and queues.
  • Probe settings. Only whether each probe is set leaves the cluster, because an exec probe's command can hold a secret.

It never collects logs, packets, connection destinations or request contents. Network data is byte counts only.

Network

DirectionDestinationPurpose
Outboundapi.levelfour.ai, port 443 (HTTPS)Sends the usage summary and status check
In clusterThe Kubernetes APIReads the resources in the permissions table
In clusterEach node's kubelet, port 10250Reads usage through nodes/metrics and nodes/stats
In cluster, optionalYour PrometheusReads usage history, when you set prometheus.url

The image comes from public.ecr.aws/levelfour/k8s-agent, built for linux/amd64 and linux/arm64.

Footprint

One replica with requests of 100m CPU and 256 MiB of memory, and limits of 500m CPU and 512 MiB. It runs as a non-root user with a read-only root filesystem and every Linux capability dropped. It exposes its own Prometheus metrics on port 9090 at /metrics, inside the cluster only.

On this page

Ask the FinOps Agent about your cloud spend