如何使用jsonpath在Windows Powershell的每一行上获取k8s群集节点名称一个名称?

如何使用jsonpath在Windows Powershell的每一行上获取k8s群集节点名称一个名称?,windows,powershell,kubectl,Windows,Powershell,Kubectl,因此,使用Json中的ConvertFrom是一件很容易的事: 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

因此,使用Json中的
ConvertFrom
是一件很容易的事:

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:\>
还有
名称
输出格式,但它在节点名称前面加上
节点

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:\>
我每行需要一个。当然,我可以按空间划分:

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 -l agentpool=nodepool2 -o "jsonpath={range $.items[*].metadata.name}{}{'\n'}{end}"
我的例子没有标签

$ 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: 正如在评论中所讨论的,发布了另一个答案,这次使用的是
jsonpath

kubectl.exe get nodes -l agentpool=nodepool2 -o custom-columns=NAME:.metadata.name --no-headers
kubectl get nodes -l agentpool=nodepool2 -o "jsonpath={range $.items[*].metadata.name}{}{'\n'}{end}"

谢谢你的主意。但是我对jsonpath特别好奇——如果可以用它来实现同样的目标的话。试试看
kubectl get nodes-l agentpool=nodepool2-o'jsonpath={range$.items[*]}{.metadata.name}{\n}{end}{/code>。它对我有用。我会在你确认答案对你有效后更新它在linux上有效。为了在linux和windows上工作,我必须切换双引号和单引号。但它确实有效。请更新您的答案。如果你也能解释一下它是如何工作的,那就太棒了。我想我理解它是如何工作的。一个轻微的变体是
kubectl get nodes-l agentpool=nodepool2-o“jsonpath={range$.items[*].metadata.name}{}{}{{{n'}{end}{code>,很高兴听到它适合您。用你的版本更新了答案