How to read nodes in Kubernetes

This quick Kubernetes tip will help you get detailed information about the Kubernetes production node and how to read and understand its output.

What is a Kubernetes Node?

A node is a working machine (virtual / physical) in Kubernetes that runs the pods that host your applications. Services that run on a node include Docker, kubelet, and kube-proxy.

List of available nodes in your Kubernetes cluster

The easiest way to see the nodes available is to use the kubectl command like this:

kubectl get nodes

It should show you all the nodes in your cluster at a glance. You can see the status, role, age and version of each node.

[email protected]:~# kubectl get nodes
andreyex    Ready    master   25d   v1.18.8
kworker-rj1   Ready    <none>   25d   v1.18.8
kworker-rj2   Ready    <none>   25d   v1.18.8
[email protected]:~#

As you can see, both worker nodes are in a ready state.

To see more verbose output, run the following command, you can add the -o wide option:

kubectl get nodes -o wide

You will now see additional details such as internal and external IP address, container image, kernel version, and runtime for the container.

[email protected]:~# kubectl get nodes -o wide
andreyex    Ready    master   25d   v1.18.8   <none>        Ubuntu 18.04.5 LTS   4.15.0-101-generic   docker://19.3.6
kworker-rj1   Ready    <none>   25d   v1.18.8   <none>        Ubuntu 18.04.4 LTS   4.15.0-101-generic   docker://19.3.6
kworker-rj2   Ready    <none>   25d   v1.18.8   <none>        Ubuntu 18.04.5 LTS   4.15.0-101-generic   docker://19.3.6

Let’s dive in and find out more about a specific node.

See node description for more details

If you need detailed information about a specific node, you can use the kubectl describe command with the node name:

kubectl describe nodes worker-node-name

Here’s an example of the output:

[email protected]:~# kubectl describe nodes kworker-rj1
Name:               kworker-rj1
Roles:              <none>
Labels:             app=front-end
Annotations: /var/run/dockershim.sock
CreationTimestamp:  Sun, 02 Aug 2020 15:42:32 +0000
Taints:             app=front-end:NoExecute
Unschedulable:      false
  HolderIdentity:  kworker-rj1
  AcquireTime:     <unset>
  RenewTime:       Fri, 11 Sep 2020 07:09:51 +0000
  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----                 ------  -----------------                 ------------------                ------                       -------
  NetworkUnavailable   False   Fri, 11 Sep 2020 02:57:12 +0000   Fri, 11 Sep 2020 02:57:12 +0000   CalicoIsUp                   Calico is running on this node
  MemoryPressure       False   Fri, 11 Sep 2020 07:06:56 +0000   Fri, 28 Aug 2020 06:33:29 +0000   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure         False   Fri, 11 Sep 2020 07:06:56 +0000   Fri, 28 Aug 2020 06:33:29 +0000   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure          False   Fri, 11 Sep 2020 07:06:56 +0000   Fri, 28 Aug 2020 06:33:29 +0000   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready                True    Fri, 11 Sep 2020 07:06:56 +0000   Fri, 11 Sep 2020 02:56:03 +0000   KubeletReady                 kubelet is posting ready status. AppArmor enabled
  Hostname:    kworker-rj1
  cpu:                2
  ephemeral-storage:  64800356Ki
  hugepages-2Mi:      0
  memory:             2040812Ki
  pods:               110
  cpu:                2
  ephemeral-storage:  59720007991
  hugepages-2Mi:      0
  memory:             1938412Ki
  pods:               110
System Info:
  Machine ID:                 c7dbeba40d7b45a387082c96df6cc554
  System UUID:                595C28CA-DBBF-304D-8C5A-7862AA0A60E5
  Boot ID:                    306f36e0-ded3-4b45-946a-89509f845c21
  Kernel Version:             4.15.0-101-generic
  OS Image:                   Ubuntu 18.04.4 LTS
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://19.3.6
  Kubelet Version:            v1.18.8
  Kube-Proxy Version:         v1.18.8
Non-terminated Pods:          (5 in total)
  Namespace                   Name                                    CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                                    ------------  ----------  ---------------  -------------  ---
  default                     toleration-demo-dep-54f9ff64b9-7zcrn    0 (0%)        0 (0%)      0 (0%)           0 (0%)         4h9m
  default                     toleration-demo-dep-54f9ff64b9-9sldm    0 (0%)        0 (0%)      0 (0%)           0 (0%)         4h9m
  default                     toleration-demo-dep-54f9ff64b9-rgh7z    0 (0%)        0 (0%)      0 (0%)           0 (0%)         4h9m
  kube-system                 calico-node-2jlhm                       250m (12%)    0 (0%)      0 (0%)           0 (0%)         39d
  kube-system                 kube-proxy-54894                        0 (0%)        0 (0%)      0 (0%)           0 (0%)         22d
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests    Limits
  --------           --------    ------
  cpu                250m (12%)  0 (0%)
  memory             0 (0%)      0 (0%)
  ephemeral-storage  0 (0%)      0 (0%)
  hugepages-2Mi      0 (0%)      0 (0%)
Events:              <none>

That’s a lot of information. What is important to you?

  • Most of the information is informational, regarding the system’s IP address, hostname, resources (CPU, GPUs, memory), and version information (OS, Docker, Kubernetes).
  • kubelet service status.
  • Unrealizable parameter.
  • In the “Conditions” section, you can indicate if there are problems with system resources that may affect the operation of the application. For example, if any of the OutOfDisk, MemoryPressure, or DiskPressure conditions exist, there are insufficient system resources to serve further workloads.
  • The Events section will finally also display messages that can indicate if there is a problem in the environment.

I hope you enjoy this quick tip on Kubernetes. Stay tuned for updates and don’t forget to subscribe for more.