Skip to content

Latest commit

 

History

History
94 lines (83 loc) · 43.3 KB

File metadata and controls

94 lines (83 loc) · 43.3 KB

Pod Metrics

Note: For pod resource requests and limits, kube-scheduler exposes kube_pod_resource_request and kube_pod_resource_limit on its /metrics/resources endpoint. These are computed from the pod's effective resource requirements and already account for pod-level resources (pod.spec.resources, beta and enabled by default since Kubernetes 1.34), so they are recommended over the container-level metrics below. kube-state-metrics does not expose a separate metric for pod-level resources. These metrics are defined in KEP-1748.

Metric name Metric type Description Unit (where applicable) Labels/tags Status Opt-in
kube_pod_annotations Gauge Kubernetes annotations converted to Prometheus labels controlled via --metric-annotations-allowlist pod=<pod-name>
namespace=<pod-namespace>
annotation_POD_ANNOTATION=<POD_ANNOTATION>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_info Gauge Information about pod pod=<pod-name>
namespace=<pod-namespace>
host_ip=<host-ip>
pod_ip=<pod-ip>
node=<node-name>
created_by_kind=<created_by_kind>
created_by_name=<created_by_name>
uid=<pod-uid>
priority_class=<priority_class>
host_network=<host_network>
STABLE -
kube_pod_ips Gauge Pod IP addresses pod=<pod-name>
namespace=<pod-namespace>
ip=<pod-ip-address>
ip_family=<4 OR 6>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_start_time Gauge Start time in unix timestamp for a pod seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_completion_time Gauge Completion time in unix timestamp for a pod seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_owner Gauge Information about the Pod's owner pod=<pod-name>
namespace=<pod-namespace>
owner_kind=<owner kind>
owner_name=<owner name>
owner_is_controller=<whether owner is controller>
uid=<pod-uid>
STABLE -
kube_pod_labels Gauge Kubernetes labels converted to Prometheus labels controlled via --metric-labels-allowlist pod=<pod-name>
namespace=<pod-namespace>
label_POD_LABEL=<POD_LABEL>
uid=<pod-uid>
STABLE -
kube_pod_nodeselectors Gauge Describes the Pod nodeSelectors pod=<pod-name>
namespace=<pod-namespace>
nodeselector_NODE_SELECTOR=<NODE_SELECTOR>
uid=<pod-uid>
EXPERIMENTAL Opt-in
kube_pod_status_phase Gauge The pods current phase pod=<pod-name>
namespace=<pod-namespace>
phase=<Pending|Running|Succeeded|Failed|Unknown>
uid=<pod-uid>
STABLE -
kube_pod_status_qos_class Gauge The pods current qosClass pod=<pod-name>
namespace=<pod-namespace>
qos_class=<BestEffort|Burstable|Guaranteed>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_status_ready Gauge Describes whether the pod is ready to serve requests pod=<pod-name>
namespace=<pod-namespace>
condition=<true|false|unknown>
uid=<pod-uid>
STABLE -
kube_pod_status_scheduled Gauge Describes the status of the scheduling process for the pod pod=<pod-name>
namespace=<pod-namespace>
condition=<true|false|unknown>
uid=<pod-uid>
STABLE -
kube_pod_container_info Gauge Information about a container in a pod container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
image=<image-name>
image_id=<image-id>
image_spec=<image-spec>
container_id=<containerid>
uid=<pod-uid>
STABLE -
kube_pod_container_status_waiting Gauge Describes whether the container is currently in waiting state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_container_status_waiting_reason Gauge Describes the reason the container is currently in waiting state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
reason=<container-waiting-reason>
uid=<pod-uid>
STABLE -
kube_pod_container_status_running Gauge Describes whether the container is currently in running state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_container_state_started Gauge Start time in unix timestamp for a pod container seconds container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_container_status_terminated Gauge Describes whether the container is currently in terminated state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_container_status_terminated_reason Gauge Describes the reason the container is currently in terminated state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
reason=<container-terminated-reason>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_container_status_last_terminated_reason Gauge Describes the last reason the container was in terminated state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
reason=<last-terminated-reason>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_container_status_last_terminated_exitcode Gauge Describes the exit code for the last container in terminated state. container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_container_status_last_terminated_timestamp Gauge Last terminated time for a pod container in unix timestamp. container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_container_status_ready Gauge Describes whether the containers readiness check succeeded container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_status_initialized_time Gauge Time when the pod is initialized. seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_status_ready_time Gauge Time when pod passed readiness probes. seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_status_container_ready_time Gauge Time when the container of the pod entered Ready state. seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_container_status_restarts_total Counter The number of container restarts per container container=<container-name>
namespace=<pod-namespace>
pod=<pod-name>
uid=<pod-uid>
STABLE -
kube_pod_container_resource_requests Gauge The number of requested request resource by a container. It is recommended to use the kube_pod_resource_request metric exposed by kube-scheduler instead, as it is more precise. cpu=<core>
memory=<bytes>
resource=<resource-name>
unit=<resource-unit>
container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
node=< node-name>
uid=<pod-uid>
STABLE -
kube_pod_container_resource_limits Gauge The number of requested limit resource by a container. It is recommended to use the kube_pod_resource_limit metric exposed by kube-scheduler instead, as it is more precise. cpu=<core>
memory=<bytes>
resource=<resource-name>
unit=<resource-unit>
container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
node=< node-name>
uid=<pod-uid>
STABLE -
kube_pod_overhead_cpu_cores Gauge The pod overhead in regards to cpu cores associated with running a pod core pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_overhead_memory_bytes Gauge The pod overhead in regards to memory associated with running a pod bytes pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_runtimeclass_name_info Gauge The runtimeclass associated with the pod pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_created Gauge Unix creation timestamp seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_deletion_timestamp Gauge Unix deletion timestamp seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_restart_policy Gauge Describes the restart policy in use by this pod pod=<pod-name>
namespace=<pod-namespace>
type=<Always|Never|OnFailure>
uid=<pod-uid>
STABLE -
kube_pod_init_container_info Gauge Information about an init container in a pod container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
image=<image-name>
image_id=<image-id>
image_spec=<image-spec>
container_id=<containerid>
uid=<pod-uid>
restart_policy=<restart-policy>
STABLE -
kube_pod_init_container_state_started Gauge Start time in unix timestamp for a pod init container seconds container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_init_container_status_waiting Gauge Describes whether the init container is currently in waiting state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_init_container_status_waiting_reason Gauge Describes the reason the init container is currently in waiting state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
reason=<container-waiting-reason>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_init_container_status_running Gauge Describes whether the init container is currently in running state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_init_container_status_terminated Gauge Describes whether the init container is currently in terminated state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_init_container_status_terminated_reason Gauge Describes the reason the init container is currently in terminated state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
reason=<container-terminated-reason>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_init_container_status_last_terminated_reason Gauge Describes the last reason the init container was in terminated state container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
reason=<last-terminated-reason>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_init_container_status_last_terminated_exitcode Gauge Describes the exit code for the last init container in terminated state. container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_init_container_status_last_terminated_timestamp Gauge Last terminated time for a pod init container in unix timestamp seconds container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_init_container_status_ready Gauge Describes whether the init containers readiness check succeeded container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_init_container_status_restarts_total Counter The number of restarts for the init container integer container=<container-name>
namespace=<pod-namespace>
pod=<pod-name>
uid=<pod-uid>
STABLE -
kube_pod_init_container_resource_limits Gauge The number of CPU cores requested limit by an init container cpu=<core>
memory=<bytes>
resource=<resource-name>
unit=<resource-unit>
container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
node=< node-name>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_init_container_resource_requests Gauge The number of CPU cores requested by an init container cpu=<core>
memory=<bytes>
resource=<resource-name>
unit=<resource-unit>
container=<container-name>
pod=<pod-name>
namespace=<pod-namespace>
node=< node-name>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_spec_volumes_persistentvolumeclaims_info Gauge Information about persistentvolumeclaim and ephemeral volumes in a pod. For ephemeral="true", the persistentvolumeclaim label is the generated claim name <pod-name>-<volume-name>; non-ephemeral volumes retain their declared claim name. pod=<pod-name>
namespace=<pod-namespace>
volume=<volume-name>
persistentvolumeclaim=<persistentvolumeclaim-claimname>
ephemeral=<true|false>
uid=<pod-uid>
STABLE -
kube_pod_spec_volumes_persistentvolumeclaims_readonly Gauge Describes whether a persistentvolumeclaim is mounted read only. Ephemeral volumes always report 0 since the ephemeral volume source does not support a read-only flag. For ephemeral="true", the persistentvolumeclaim label is the generated claim name <pod-name>-<volume-name>; non-ephemeral volumes retain their declared claim name. bool pod=<pod-name>
namespace=<pod-namespace>
volume=<volume-name>
persistentvolumeclaim=<persistentvolumeclaim-claimname>
ephemeral=<true|false>
uid=<pod-uid>
STABLE -
kube_pod_status_reason Gauge The pod status reasons pod=<pod-name>
namespace=<pod-namespace>
reason=<Evicted|NodeAffinity|NodeLost|PreemptionByScheduler|SchedulingGated|Shutdown|TerminationByKubelet|UnexpectedAdmissionError>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_status_scheduled_time Gauge Unix timestamp when pod moved into scheduled status seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_status_unschedulable Gauge Describes the unschedulable status for the pod pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
STABLE -
kube_pod_status_unscheduled_time Gauge Unix timestamp when pod moved into unscheduled status seconds pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
EXPERIMENTAL -
kube_pod_tolerations Gauge Information about the pod tolerations pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
key=<toleration-key>
operator=<toleration-operator>
value=<toleration-value>
effect=<toleration-effect> toleration_seconds=<toleration-seconds>
EXPERIMENTAL -
kube_pod_service_account Gauge The service account for a pod pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
service_account=<service_account>
EXPERIMENTAL -
kube_pod_scheduler Gauge The scheduler for a pod pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
name=<scheduler-name>
EXPERIMENTAL -
kube_pod_resourceclaim_info Gauge Information about a DRA ResourceClaim referenced by a pod, one series per pod.spec.resourceClaims entry pod=<pod-name>
namespace=<pod-namespace>
uid=<pod-uid>
claim_name=<pod-local-claim-name>
resourceclaim_name=<resolved-resourceclaim-name>
resourceclaim_template_name=<resourceclaimtemplate-name>
EXPERIMENTAL -

Useful metrics queries

How to retrieve non-standard Pod state

It is not straightforward to get the Pod states for certain cases like "Terminating" and "Unknown" since it is not stored behind a field in the Pod.Status.

So to mimic the logic used by the kubectl command line, you will need to compose multiple metrics.

For example:

  • To get the list of pods that are in the Unknown state, you can run the following PromQL query: sum(kube_pod_status_phase{phase="Unknown"}) by (namespace, pod) or (count(kube_pod_deletion_timestamp) by (namespace, pod) * sum(kube_pod_status_reason{reason="NodeLost"}) by(namespace, pod))

  • For Pods in Terminating state: count(kube_pod_deletion_timestamp) by (namespace, pod) * count(kube_pod_status_reason{reason="NodeLost"} == 0) by (namespace, pod)

Here is an example of a Prometheus rule that can be used to alert on a Pod that has been in the Terminating state for more than 5m.

groups:
- name: Pod state
  rules:
  - alert: PodsBlockedInTerminatingState
    expr: count(kube_pod_deletion_timestamp) by (namespace, pod) * count(kube_pod_status_reason{reason="NodeLost"} == 0) by (namespace, pod) > 0
    for: 5m
    labels:
      severity: page
    annotations:
      summary: Pod {{$labels.namespace}}/{{$labels.pod}} blocked in Terminating state.