Search code examples
windowspowershellkubectl

How to get the k8s cluster node names one name on each line on Windows Powershell using jsonpath?


So using ConvertFrom-Json is a no brainer:

C:\> (kubectl.exe get nodes -o json | ConvertFrom-Json).items.metadata.name
aks-nodepool1-30294001-vmss000000
aks-nodepool1-30294001-vmss000001
aks-nodepool1-30294001-vmss000003
aks-nodepool2-30294001-vmss000000
aks-nodepool2-30294001-vmss000001
aks-nodepool2-30294001-vmss000002
C:\>

There is also the name output format, but it prepends the node names with node/:

C:\> kubectl.exe get nodes -o name
node/aks-nodepool1-30294001-vmss000000
node/aks-nodepool1-30294001-vmss000001
node/aks-nodepool1-30294001-vmss000003
node/aks-nodepool2-30294001-vmss000000
node/aks-nodepool2-30294001-vmss000001
node/aks-nodepool2-30294001-vmss000002
C:\>

That is close, but still not it. Maybe there is a way to instruct kubectl not to prefix the names with the resource type? Still one can remove the prefix easily:

C:\> (kubectl.exe get nodes -o name) -replace '^node/',''
aks-nodepool1-30294001-vmss000000
aks-nodepool1-30294001-vmss000001
aks-nodepool1-30294001-vmss000003
aks-nodepool2-30294001-vmss000000
aks-nodepool2-30294001-vmss000001
aks-nodepool2-30294001-vmss000002
C:\>

However, this question is about jsonpath. Right now this is what I get:

C:\> kubectl.exe get nodes -l agentpool=nodepool2 -o jsonpath='{.items[*].metadata.name}'
aks-nodepool2-30294001-vmss000000 aks-nodepool2-30294001-vmss000001 aks-nodepool2-30294001-vmss000002
C:\>

I need them one on each line. Surely, I can split by space:

C:\> (kubectl.exe get nodes -l agentpool=nodepool2 -o jsonpath='{.items[*].metadata.name}') -split '\s+'
aks-nodepool2-30294001-vmss000000
aks-nodepool2-30294001-vmss000001
aks-nodepool2-30294001-vmss000002
C:\>

But I wonder if this can be achieved without any external tools using some flags of kubectl or features of jsonpath.


Solution

  • This should work for you even without jsonpath

    kubectl.exe get nodes -l agentpool=nodepool2 -o custom-columns=NAME:.metadata.name --no-headers
    

    My examples without label

    $ kubectl get nodes -o custom-columns=NAME:.metadata.name --no-headers
    gke-cluster-1-default-pool-82008fd9-8x81
    gke-cluster-1-default-pool-82008fd9-qkp7
    gke-cluster-1-default-pool-82008fd9-tlc7
    
    
    $ kubectl get nodes -o jsonpath='{.items[*].metadata.name}'
    gke-cluster-1-default-pool-82008fd9-8x81 gke-cluster-1-default-pool-82008fd9-qkp7 gke-cluster-1-default-pool-82008fd9-tlc7
    

    EDIT1: As was discussed in comments, posting one more answer, this time using jsonpath

    kubectl get nodes -l agentpool=nodepool2 -o "jsonpath={range $.items[*].metadata.name}{}{'\n'}{end}"