{# Server tab "kubernetes": this node's role, conditions and its own pods. Context: s, smp, k8s_pods, k8s_manifest, fmt_bytes, fmt_uptime #} {% set k = smp.get('kubernetes') or {} %} {% if not k.get('detected') %}

Kubernetes

The agent on this server did not detect Kubernetes (no service-account token at /var/run/secrets/kubernetes.io/serviceaccount). To monitor a cluster, run the agent as a DaemonSet so every node reports its pods and conditions:

kubectl apply -f "{{ k8s_manifest }}"

Nodes appear as servers named <cluster>/<node> and on the Kubernetes page. Needs agent 1.2+.

{% else %} {% set cond = k.get('node_conditions') or {} %}{% set t = k.get('totals') or {} %}
Cluster
{{ k.get('cluster') or 'default' }}
node {{ k.get('node') or s.hostname }} · {{ k.get('role') or 'worker' }}
Node
{% if cond.get('Ready') is sameas false %}NotReady{% else %}Ready{% endif %}
{% for c in ('MemoryPressure','DiskPressure','PIDPressure') %}{% if cond.get(c) %}{{ c }} {% endif %}{% endfor %}{% if not cond.get('MemoryPressure') and not cond.get('DiskPressure') and not cond.get('PIDPressure') %}no pressure{% endif %}
Pods
{{ k8s_pods|length }}
{{ k8s_pods|selectattr('phase','equalto','Running')|list|length }} running{% if t.get('pending') %} · {{ t.pending }} pending{% endif %}{% if t.get('failed') %} · {{ t.failed }} failed{% endif %}
Restarts (1h)
{{ t.get('restarts_1h') or 0 }}
{{ k8s_pods|selectattr('problems')|list|length }} pods with problems
{% for p in k8s_pods %} {% else %}{% endfor %}
NamespacePodPhaseReadyRestartsContainersCPUMemoryAge
{{ p.namespace }}{{ p.name }}{% if p.owner %}
{{ p.owner }}
{% endif %}
{{ p.phase or '?' }}{% for pr in p.problems %}
{{ pr }}
{% endfor %}
{{ p.ready }}/{{ p.total }}{{ p.restarts or 0 }} {% for c in p.containers or [] %}
{{ c.name }} {{ c.image or '' }}{% if c.reason %} {{ c.reason }}{% endif %}
{% endfor %}
{% if p.cpu_millicores is not none %}{{ p.cpu_millicores|int }}m{% else %}—{% endif %}{% if p.mem_bytes is not none %}{{ fmt_bytes(p.mem_bytes) }}{% else %}—{% endif %}{{ fmt_uptime(p.age_s) }}
No pods scheduled on this node.

Whole cluster: /app/kubernetes. Incidents open automatically for CrashLoopBackOff / OOMKilled / Failed pods and NotReady, MemoryPressure, DiskPressure nodes.

{% endif %}