Notes to Self

Alex Sokolsky's Notes on Computers and Programming

k8s Nodes

Count cluster nodes:

kubectl get nodes --no-headers | wc -l

or

kubectl get nodes -o json | jq '.items | length'

List taints for all the nodes

kubectl get nodes -o json|jq '.items[].spec.taints'

Example output:

[
  {
    "effect": "NoSchedule",
    "key": "eks.amazonaws.com/compute-type",
    "value": "fargate"
  }
]
[
  {
    "effect": "NoSchedule",
    "key": "clari.io/nodegroup",
    "value": "eks-core-services"
  }
]
null

Alternatively:

kubectl get nodes -o="custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect"

Output:

NodeName                               TaintKey                         TaintValue          TaintEffect
fargate-ip-10-14-81-126.ec2.internal   eks.amazonaws.com/compute-type   fargate             NoSchedule
ip-10-14-102-143.ec2.internal          clari.io/nodegroup               eks-core-services   NoSchedule
ip-10-14-103-86.ec2.internal           <none>                           <none>              <none>
ip-10-14-83-79.ec2.internal            clari.io/nodegroup               eks-core-services   NoSchedule
ip-10-14-86-20.ec2.internal            clari.io/nodegroup               eks-core-services   NoSchedule
ip-10-14-86-93.ec2.internal            <none>                           <none>              <none>
ip-10-14-91-35.ec2.internal            clari.io/nodegroup               eks-core-services   NoSchedule
ip-10-14-94-20.ec2.internal            clari.io/nodegroup               eks-core-services   NoSchedule
ip-10-14-94-45.ec2.internal            <none>                           <none>              <none>
ip-10-14-99-93.ec2.internal            <none>                           <none>              <none>

List info for all the nodes:

kubectl get nodes -o json|jq '.items[].status.nodeInfo'

Example output:

{
  "architecture": "amd64",
  "bootID": "**************",
  "containerRuntimeVersion": "containerd://1.6.6",
  "kernelVersion": "5.10.210-201.855.amzn2.x86_64",
  "kubeProxyVersion": "v1.27.9-eks-680e576",
  "kubeletVersion": "v1.27.9-eks-680e576",
  "machineID": "",
  "operatingSystem": "linux",
  "osImage": "Amazon Linux 2",
  "systemUUID": "******************"
}
{
  "architecture": "amd64",
  "bootID": "****************************",
  "containerRuntimeVersion": "containerd://1.6.31+bottlerocket",
  "kernelVersion": "5.15.152",
  "kubeProxyVersion": "v1.27.11-eks-9572756",
  "kubeletVersion": "v1.27.11-eks-9572756",
  "machineID": "*******************",
  "operatingSystem": "linux",
  "osImage": "Bottlerocket OS 1.19.4 (aws-k8s-1.27)",
  "systemUUID": "***********************"
}

Taint/UnTaint a node

To taint the node1 with key1=value1:

kubectl taint nodes node1 key1=value1:NoSchedule

No pod will be able to schedule onto node1 unless it has a matching toleration.

To remove the taint added by the command above, you can run:

kubectl taint nodes node1 key1=value1:NoSchedule-

Label a node

kubectl label node node01 color=blue

Node affinity

Drain the node

kubectl drain --ignore-daemonsets node01

Bring the node back online

kubectl uncordon node01