Caution
Grafana Alloy is the new name for our distribution of the OTel collector. Grafana Agent has been deprecated and is in Long-Term Support (LTS) through October 31, 2025. Grafana Agent will reach an End-of-Life (EOL) on November 1, 2025. Read more about why we recommend migrating to Grafana Alloy.
Important: This documentation is about an older version. It's relevant only to the release noted, many of the features and functions have been updated or replaced. Please view the current version.
discovery.kubelet
discovery.kubelet discovers Kubernetes pods running on the specified Kubelet
and exposes them as scrape targets.
Usage
discovery.kubelet "LABEL" {
}Requirements
- The Kubelet must be reachable from the
grafana-agentpod network. - Follow the Kubelet authorization documentation to configure authentication to the Kubelet API.
Arguments
The following arguments are supported:
| Name | Type | Description | Default | Required |
|---|---|---|---|---|
url | string | URL of the Kubelet server. | no | |
bearer_token | secret | Bearer token to authenticate with. | no | |
bearer_token_file | string | File containing a bearer token to authenticate with. | no | |
refresh_interval | duration | How often the Kubelet should be polled for scrape targets | 5s | no |
namespaces | list(string) | A list of namespaces to extract target pods from | no |
One of the following authentication methods must be provided if kubelet authentication is enabled
The namespaces list limits the namespaces to discover resources in. If
omitted, all namespaces are searched.
Blocks
The following blocks are supported inside the definition of
discovery.kubelet:
| Hierarchy | Block | Description | Required |
|---|---|---|---|
| authorization | authorization | Configure generic authorization to the endpoint. | no |
| tls_config | tls_config | Configure TLS settings for connecting to the endpoint. | no |
authorization block
| Name | Type | Description | Default | Required |
|---|---|---|---|---|
credentials_file | string | File containing the secret value. | no | |
credentials | secret | Secret value. | no | |
type | string | Authorization type, for example, “Bearer”. | no |
credential and credentials_file are mutually exclusive, and only one can be provided inside an authorization block.
tls_config block
| Name | Type | Description | Default | Required |
|---|---|---|---|---|
ca_pem | string | CA PEM-encoded text to validate the server with. | no | |
ca_file | string | CA certificate to validate the server with. | no | |
cert_pem | string | Certificate PEM-encoded text for client authentication. | no | |
cert_file | string | Certificate file for client authentication. | no | |
insecure_skip_verify | bool | Disables validation of the server certificate. | no | |
key_file | string | Key file for client authentication. | no | |
key_pem | secret | Key PEM-encoded text for client authentication. | no | |
min_version | string | Minimum acceptable TLS version. | no | |
server_name | string | ServerName extension to indicate the name of the server. | no |
The following pairs of arguments are mutually exclusive and can’t both be set simultaneously:
ca_pemandca_filecert_pemandcert_filekey_pemandkey_file
When configuring client authentication, both the client certificate (using
cert_pem or cert_file) and the client key (using key_pem or key_file)
must be provided.
When min_version is not provided, the minimum acceptable TLS version is
inherited from Go’s default minimum version, TLS 1.2. If min_version is
provided, it must be set to one of the following strings:
"TLS10"(TLS 1.0)"TLS11"(TLS 1.1)"TLS12"(TLS 1.2)"TLS13"(TLS 1.3)
Exported fields
The following fields are exported and can be referenced by other components:
| Name | Type | Description |
|---|---|---|
targets | list(map(string)) | The set of targets discovered from the Kubelet API. |
Each target includes the following labels:
__address__: The target address to scrape derived from the pod IP and container port.__meta_kubernetes_namespace: The namespace of the pod object.__meta_kubernetes_pod_name: The name of the pod object.__meta_kubernetes_pod_ip: The pod IP of the pod object.__meta_kubernetes_pod_label_<labelname>: Each label from the pod object.__meta_kubernetes_pod_labelpresent_<labelname>:truefor each label from the pod object.__meta_kubernetes_pod_annotation_<annotationname>: Each annotation from the pod object.__meta_kubernetes_pod_annotationpresent_<annotationname>:truefor each annotation from the pod object.__meta_kubernetes_pod_container_init:trueif the container is anInitContainer.__meta_kubernetes_pod_container_name: Name of the container the target address points to.__meta_kubernetes_pod_container_id: ID of the container the target address points to. The ID is in the form<type>://<container_id>.__meta_kubernetes_pod_container_image: The image the container is using.__meta_kubernetes_pod_container_port_name: Name of the container port.__meta_kubernetes_pod_container_port_number: Number of the container port.__meta_kubernetes_pod_container_port_protocol: Protocol of the container port.__meta_kubernetes_pod_ready: Set totrueorfalsefor the pod’s ready state.__meta_kubernetes_pod_phase: Set toPending,Running,Succeeded,FailedorUnknownin the lifecycle.__meta_kubernetes_pod_node_name: The name of the node the pod is scheduled onto.__meta_kubernetes_pod_host_ip: The current host IP of the pod object.__meta_kubernetes_pod_uid: The UID of the pod object.__meta_kubernetes_pod_controller_kind: Object kind of the pod controller.__meta_kubernetes_pod_controller_name: Name of the pod controller.
Note: The Kubelet API used by this component is an internal API and therefore the data in the response returned from the API cannot be guaranteed between different versions of the Kubelet.
Component health
discovery.kubelet is reported as unhealthy when given an invalid
configuration. In those cases, exported fields retain their last healthy
values.
Debug information
discovery.kubelet does not expose any component-specific debug information.
Debug metrics
discovery.kubelet does not expose any component-specific debug metrics.
Examples
Bearer token file authentication
This example uses a bearer token file to authenticate to the Kubelet API:
discovery.kubelet "k8s_pods" {
bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token"
}
prometheus.scrape "demo" {
targets = discovery.kubelet.k8s_pods.targets
forward_to = [prometheus.remote_write.demo.receiver]
}
prometheus.remote_write "demo" {
endpoint {
url = PROMETHEUS_REMOTE_WRITE_URL
basic_auth {
username = USERNAME
password = PASSWORD
}
}
}Replace the following:
PROMETHEUS_REMOTE_WRITE_URL: The URL of the Prometheus remote_write-compatible server to send metrics to.USERNAME: The username to use for authentication to the remote_write API.PASSWORD: The password to use for authentication to the remote_write API.
Limit searched namespaces
This example limits the namespaces where pods are discovered using the namespaces argument:
discovery.kubelet "k8s_pods" {
bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token"
namespaces = ["default", "kube-system"]
}
prometheus.scrape "demo" {
targets = discovery.kubelet.k8s_pods.targets
forward_to = [prometheus.remote_write.demo.receiver]
}
prometheus.remote_write "demo" {
endpoint {
url = PROMETHEUS_REMOTE_WRITE_URL
basic_auth {
username = USERNAME
password = PASSWORD
}
}
}Replace the following:
PROMETHEUS_REMOTE_WRITE_URL: The URL of the Prometheus remote_write-compatible server to send metrics to.USERNAME: The username to use for authentication to the remote_write API.PASSWORD: The password to use for authentication to the remote_write API.



