Configuration

JSON configuration file specification for the unbounded-agent.

The agent reads a JSON config file whose path is set through the UNBOUNDED_AGENT_CONFIG_FILE environment variable. This config can be generated from the cluster using the kubectl unbounded machine manual-bootstrap command, or authored by hand.

The same config is used by unbounded-agent start and unbounded-agent preflight. Before bootstrap, run preflight on the target host to validate the loaded config, host prerequisites, API server reachability, artifact sources, nspawn provisioning paths, and GPU driver readiness when applicable. See Agent Preflight for command usage, exit behavior, and the current check list.

Example

{
  "MachineName": "mysite-worker-01",
  "Cluster": {
    "CaCertBase64": "<base64-encoded CA certificate>",
    "ClusterDNS": "10.0.0.10",
    "Version": "1.33.1"
  },
  "Kubelet": {
    "ApiServer": "https://api.example.com:6443",
    "Auth": {
      "BootstrapToken": "abc123.0123456789abcdef"
    },
    "Labels": {
      "unbounded-cloud.io/site": "mysite"
    },
    "RegisterWithTaints": [],
    "Configuration": {
      "maxPods": 250,
      "imageGCHighThresholdPercent": 85,
      "imageGCLowThresholdPercent": 80
    },
    "ImageCredentialProvider": {
      "ConfigPath": "/etc/kubernetes/credential-provider.yaml",
      "BinDir": "/usr/local/lib/kubelet-credential-providers"
    }
  }
}

Fields

FieldDescription
MachineName(optional) Name of the Kubernetes Machine and node. When omitted, the agent resolves it at startup from the AGENT_MACHINE_NAME environment variable, falling back to the host hostname.
Cluster.CaCertBase64Base64-encoded cluster CA certificate.
Cluster.ClusterDNSClusterIP of the kube-dns Service.
Cluster.VersionKubernetes version to install (e.g. 1.33.1).
Kubelet.ApiServerAddress of the Kubernetes API server.
Kubelet.Auth.BootstrapTokenToken used for TLS bootstrapping (omit when using TPM attestation).
Kubelet.LabelsKey-value labels applied to the Node on registration.
Kubelet.RegisterWithTaintsTaints applied to the Node on registration (key=value:effect).
Kubelet.Configuration(optional) JSON object merged over the generated kubelet.config.k8s.io/v1beta1 KubeletConfiguration. Use kubelet configuration field names such as maxPods, podPidsLimit, and imageGCHighThresholdPercent. Setting apiVersion, kind, authentication, authorization.mode, clusterDNS, containerRuntimeEndpoint, registerWithTaints, or rotateCertificates here is not supported because the agent configures those fields.
Kubelet.ImageCredentialProvider.ConfigPath(optional) Absolute path inside the nspawn machine to a kubelet exec image credential provider configuration file or supported configuration directory. Must be set together with BinDir.
Kubelet.ImageCredentialProvider.BinDir(optional) Absolute path inside the nspawn machine containing exec image credential provider binaries. The files must be included in the OCI rootfs or exposed through an additional host mount.
OCIImage(optional) OCI registry reference, oci-layout:// directory, or HTTPS URL to a tarred OCI image layout. Uses the built-in default image when empty. The agent automatically selects the archive’s single tagged image reference. HTTPS URLs may include signed query strings such as Azure Blob SAS parameters.
OfflineArtifacts.Source(optional) Complete bootstrap artifact source. Accepts an absolute directory, file:// directory, oci:// artifact reference, or HTTPS tar/tar.gz archive. HTTPS archives are downloaded and extracted into the host artifact cache, and their URLs may include signed query strings such as Azure Blob SAS parameters.
LocalDNS.Enabled(optional) Runs a CoreDNS cache inside the nspawn machine and configures machine and ClusterFirst DNS through separate link-local listeners.
LocalDNS.NodeListenerIP(optional) Listener used by machine services and Default-policy pods. Defaults to 169.254.10.10.
LocalDNS.ClusterListenerIP(optional) Listener supplied to kubelet for ClusterFirst pods. Defaults to 169.254.10.11.
LocalDNS.MetricsAddress(optional) Native CoreDNS Prometheus bind address. Defaults to port 9253 on the IPv4 node address selected by following kubelet’s non-cloud behavior: Kubelet.NodeIP, an IP-valued node name, a host-local node-name DNS result, then the host’s default-route interface.
LocalDNS.CPULimitInMilliCores(optional) CoreDNS slice CPU quota. Defaults to 2000.
LocalDNS.MemoryLimitInMB(optional) CoreDNS slice memory limit. Defaults to 128.
LocalDNS.RequiredPlugins(optional) Additional plugins that the selected binary must report through coredns -plugins.
LocalDNS.CorefileTemplate(optional) Full replacement Go template for the Corefile. Empty uses the built-in two-listener template.
Downloads.CoreDNS(optional) CoreDNS URL, BaseURL, and version override. The offline manifest versions.coredns takes precedence when offline artifacts are configured.
Attest.URL(optional) Base URL of a metalman serve-pxe instance for TPM attestation.

LocalDNS requires direct IPv4 nameservers in /etc/resolv.conf, or a systemd-resolved stub backed by direct nameservers in /run/systemd/resolve/resolv.conf. Other local caching stubs and split-DNS routing policies are not supported when LocalDNS is enabled.