Skip to content

AgentFleet

apiVersion
agents.nanohype.dev/v1alpha1
kind
AgentFleet
scope
Namespaced
reconciled by
eks-agent-platform
short names
fleet

AgentFleet is a Platform-scoped declaration of one or more agents, each reconciled into a Deployment running under the tenant's identity. The scale subresource is deliberately omitted: `kubectl scale` would be ambiguous (min? max? per-agent?) for a fleet, so per-agent replica overrides live on AgentSpec.Replicas and fleet-wide behavior is driven by .spec.scaling (KEDA) instead.

AgentFleetSpec declares one or more agents and the platform scaffolding around them (KEDA scaling, NetworkPolicy, the tenant identity binding). Each agent runs as a Deployment in the tenant's namespace, under the tenant ServiceAccount, executing the tenant's own image. The agent loop and its tools live in that image and run in that process — so an action the agent takes is taken *as the tenant*, and the Kubernetes audit log records the tenant's identity against it. That is the property the platform exists to provide: an agent's claim about what it did can be checked against the record of what happened, because both name the same principal.

What kubectl get shows

ColumnTypeMeaning
Platformstring
Phasestring
Readyinteger

Spec

  • agents[]objectrequired

    Agents is the list of agents to provision in this fleet.

    • imagestringrequired

      Image is the container the agent runs — the tenant's own build, carrying its agent loop and its tools. There is no platform-supplied agent runtime and no separate tool server. A tool server would execute the agent's actions under its own identity, which is exactly what makes an action untraceable to the agent that requested it: the audit log names the tool server, and the agent's claim to have done something cannot be confirmed or refuted. Tools run in the agent's process, as the tenant, so the two records line up.

    • modelRoutestringrequired

      ModelRoute is the named route on the Platform's ModelGateway.

    • namestringrequired

    • systemPromptstringrequired

      SystemPrompt is the agent's instruction text.

    • replicasinteger (int32)

      Replicas overrides the fleet-wide scaling minimum for this agent.

    • resourcesobject

      Resources overrides the default container resources. The tenant's ResourceQuota applies either way; this is for an agent that needs a different shape than the default.

      3 fields under resources
      • claims[]object

        Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers.

        2 fields under claims
        • namestringrequired

          Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.

        • requeststring

          Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.

      • limitsobject

        Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

      • requestsobject

        Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

  • platformRefobjectrequired

    LocalRef references a CR by name in the same namespace.

    • namestringrequired

  • scalingobject

    Scaling controls KEDA's ScaledObject for the runtime Deployments.

    • enabledbooleanrequireddefault true

      Enabled — when false, the operator scales the Deployment to 0 and removes the ScaledObject. Toggled false by the kill-switch on budget breach.

    • maxinteger (int32)default 10

      Max replicas.

    • mininteger (int32)default 1

      Min replicas. Use a pointer so 0 (kill-switch state) is distinguishable from "field absent" — with int32 + omitempty, the zero value gets dropped and re-defaulted, making min=0 unrepresentable.

    • queueDepthTriggerinteger (int32)default 10

      QueueDepthTrigger: scale up when SQS depth exceeds this value.

    • queueUrlstring

      QueueUrl is the SQS queue the fleet's work originates from. When set the operator emits a KEDA aws-sqs-queue trigger; otherwise a CPU-utilization placeholder. The tenant role must have sqs:GetQueueAttributes on this queue (granted via the agent-iam baseline policy + an in-policy resource ARN derived from the URL).