如何使用 jsonpath 在 Windows Powershell 的每一行上获取 k8s 集群节点名称一个名称?
How to get the k8s cluster node names one name on each line on Windows Powershell using jsonpath?
所以使用 ConvertFrom-Json
很简单:
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:\>
还有 name
输出格式,但它在节点名称前加上 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:\>
这很接近,但仍然不是。也许有一种方法可以指示 kubectl 不要在名称前加上资源类型前缀?还有一个可以轻松删除前缀:
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:\>
不过,这个问题是关于jsonpath
的。现在这就是我得到的:
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:\>
我需要每行一个。当然,我可以按 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:\>
但我想知道这是否可以在没有任何外部工具的情况下使用 kubectl 的一些标志或 jsonpath 的特性来实现。
即使没有 jsonpath
,这也应该对您有用
kubectl.exe get nodes -l agentpool=nodepool2 -o custom-columns=NAME:.metadata.name --no-headers
我没有标签的例子
$ 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
编辑 1:
正如评论中所讨论的,再发布一个答案,这次使用 jsonpath
kubectl get nodes -l agentpool=nodepool2 -o "jsonpath={range $.items[*].metadata.name}{}{'\n'}{end}"
所以使用 ConvertFrom-Json
很简单:
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:\>
还有 name
输出格式,但它在节点名称前加上 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:\>
这很接近,但仍然不是。也许有一种方法可以指示 kubectl 不要在名称前加上资源类型前缀?还有一个可以轻松删除前缀:
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:\>
不过,这个问题是关于jsonpath
的。现在这就是我得到的:
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:\>
我需要每行一个。当然,我可以按 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:\>
但我想知道这是否可以在没有任何外部工具的情况下使用 kubectl 的一些标志或 jsonpath 的特性来实现。
即使没有 jsonpath
kubectl.exe get nodes -l agentpool=nodepool2 -o custom-columns=NAME:.metadata.name --no-headers
我没有标签的例子
$ 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
编辑 1:
正如评论中所讨论的,再发布一个答案,这次使用 jsonpath
kubectl get nodes -l agentpool=nodepool2 -o "jsonpath={range $.items[*].metadata.name}{}{'\n'}{end}"