Home > Software engineering >  How to find Taint info for Nodes through kubectl
How to find Taint info for Nodes through kubectl

Time:11-03

I have multiple questions for getting taint information.I know Taint info can be taken from here: (View existing taints on which Taints exist on current nodes.) kubectl get nodes -o='custom columns=NodeName:.metadata.name,TaintKey:.spec.taints[].key,TaintValue:.spec.taints[].value,TaintEffect:.spec.taints[*].effect'

  • Above is as per documentation given in this link, but where is this being referenced from ? Where is this listed?https://kubernetes.io/docs/reference/kubectl/cheatsheet/

  • but how do I find that taint is under Spec. As per kubectl commands, "Taint" value only comes under "kubectl describe node" and not "kubectl get node -o yaml".

  • I can only find this documentation : (nothing here.) https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#nodespec-v1-core

  • how do I find out(proof) that spec contains "taints", either some documentation , or some "--help" style documentation , or output for "-o yaml ", or output for "-o json"?

I have tried using kubectl "get" and "describe".I have also tried understanding YAML structure, but it is not listed there, or I might be missing something.

CodePudding user response:

A good way to understand the structure of Kubernetes' Resources is through the one-page Kubernetes API Reference

  • Find the Node Resource
  • Then per your example, look under spec which is type NodeSpec
  • See that taints is an array of Taint

Then, knowing that you can kubectl get {resource} --output various flavors (I prefer jsonpath), you can use e.g. the JSONPath implementation used by Kubernetes (not the same as JSONPath elsewhere) to filter the output.

If the JSONPath filtering is insufficient, you can pipe the results into other tools e.g. jq.

If you'd prefer to use YAML, you'll want to --output=yaml but kubectl includes no built-in processing of YAML output and so you'll want to use a tool like yq.

You can also add --v (log level verbosity) to any kubectl command. --v=6 (or above) should include the underlying Kubernetes API calls being made to effect the command.

CodePudding user response:

I will start by answering your second bullet point,

  1. The values of taints are visible in both the described output and get YAML output.

FYI, in the describe output, it will show the field as Taints and in the yamls, it shows as taints

. To see that, run the following commands :

# This is the YAML of node
kubectl get node <node-name> -oyaml > node-get-output.yaml 

# This is the describe output of node
kubectl describe node <node-name> > node-describe-output.yaml

Now, In the output of get, you will notice: (pasting a demo YAML)

spec:
  podCIDR: ....
  podCIDRs:
  - ...
  providerID: gce://.../us-central1-f/...
  taints:
  - effect: NoSchedule
    key: demo
    value: StackOverflow

And the describe output will look something like this:

Name:               ...
Roles:              ...
Labels:             beta.kubernetes.io/arch=amd64
              
Annotations:        container.googleapis.com/instance_id: ...
                 
CreationTimestamp:  ...
Taints:             demo=StackOverflow:NoSchedule
Unschedulable:      false
  1. It is a concept of the kubernetes that for every Kubernetes object all the configuration stuff will go under spec section of the YAML, you can refer the documentation as well, taints also comes under it. You can also see it using the kubectl utility, its output contains all the attributes which comes under spec:
kubectl explain node.spec
  • Related