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 group | Resources | Why the agent reads them |
|---|---|---|
| core | pods, nodes, namespaces, persistentvolumeclaims, persistentvolumes | Requests, limits, restarts, placement, node capacity, namespace labels, volume size and owner |
| core | nodes/metrics | CPU, memory and throttling per container, network bytes per pod and node, and used bytes per volume, from the kubelet |
| core | nodes/stats | Ephemeral storage per container and pod, node filesystem use and process counts, from the kubelet Summary API (read-only) |
apps | deployments, statefulsets, daemonsets, replicasets | Which workload owns each pod, and its replica count |
batch | jobs, cronjobs | Which workload owns each pod |
autoscaling | horizontalpodautoscalers | Scaling targets and current replicas, so a recommendation never fights the autoscaler |
autoscaling.k8s.io | verticalpodautoscalers | A workload a VPA already sizes gets no recommendation; its own recommendation is shown next to ours |
keda.sh | scaledobjects, scaledjobs | Scaling targets of KEDA-scaled workloads |
policy | poddisruptionbudgets | Availability rules that a change must respect |
karpenter.sh | nodepools | Capacity types, instance families, limits and consolidation settings |
karpenter.k8s.aws | ec2nodeclasses | The node image family behind each NodePool |
argoproj.io | applications | The repository and path that deploy each workload |
kustomize.toolkit.fluxcd.io | kustomizations | The path that deploys each workload |
source.toolkit.fluxcd.io | gitrepositories | The 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-systemnamespace. - 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 underlevelfour.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
| Direction | Destination | Purpose |
|---|---|---|
| Outbound | api.levelfour.ai, port 443 (HTTPS) | Sends the usage summary and status check |
| In cluster | The Kubernetes API | Reads the resources in the permissions table |
| In cluster | Each node's kubelet, port 10250 | Reads usage through nodes/metrics and nodes/stats |
| In cluster, optional | Your Prometheus | Reads 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.