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-agent
pod 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 |
---|---|---|---|---|
type | string | Authorization type, for example, “Bearer”. | no | |
credentials | secret | Secret value. | no | |
credentials_file | string | File containing the secret value. | no |
credential
and credentials_file
are mutually exclusive and only one can be
provided inside of 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 | |
key_pem | secret | Key PEM-encoded text for client authentication. | no | |
key_file | string | Key file for client authentication. | no | |
server_name | string | ServerName extension to indicate the name of the server. | no | |
insecure_skip_verify | bool | Disables validation of the server certificate. | no | |
min_version | string | Minimum acceptable TLS version. | no |
The following pairs of arguments are mutually exclusive and cannot both be set simultaneously:
ca_pem
andca_file
cert_pem
andcert_file
key_pem
andkey_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>
:true
for each label from the pod object.__meta_kubernetes_pod_annotation_<annotationname>
: Each annotation from the pod object.__meta_kubernetes_pod_annotationpresent_<annotationname>
:true
for each annotation from the pod object.__meta_kubernetes_pod_container_init
:true
if 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 totrue
orfalse
for the pod’s ready state.__meta_kubernetes_pod_phase
: Set toPending
,Running
,Succeeded
,Failed
orUnknown
in 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.