【问题标题】:Kubernetes (kubectl) get running podsKubernetes (kubectl) 让 pod 运行起来
【发布时间】:2017-09-28 17:21:04
【问题描述】:

我正在尝试从具有状态 running 的部署(按标签过滤)中获取 first pod - 目前我只能实现以下目标,这只会给出我是部署中的第一个 pod(按标签过滤) - 不确定正在运行的 pod,例如它也可能是一个终止:

kubectl get pod -l "app=myapp" -l "tier=webserver" -l "namespace=test" 
                -o jsonpath="{.items[0].metadata.name}"

怎么可能

a) 仅获取“正在运行”的 pod 的 pod 列表,并且(在此处或在 google 上找不到任何内容)

b) 从该列表中选择第一个。 (这就是我目前正在做的)

问候

更新:我已经尝试过之前在 cmets 中发布的链接,内容如下:

kubectl get pod -l "app=ms-bp" -l "tier=webserver" -l "namespace=test"  
-o json | jq -r '.items[] | select(.status.phase = "Running") | .items[0].metadata.name'

结果是 4x "null" - 有 4 个正在运行的 pod。

Edit2:已解决 - 请参阅 cmets

【问题讨论】:

  • @kichik:感谢您的回复,我已经知道这个问题 - 无法集成“当前的解决方法”。你知道怎么做吗?
  • 当前的解决方案如何/为什么对您来说失败了?
  • 要获得第一个,只需附加 | head -n 1
  • 更新:好的,通过将jq结果包装在一个数组中,它也可以根据链接工作,然后您可以访问[0]。 〜关闭

标签: json go kubernetes kubectl


【解决方案1】:

从 kubectl 1.9 开始,您可以选择传递 --field-selector 参数(请参阅 https://github.com/kubernetes/kubernetes/pull/50140)。例如

kubectl get pod -l app=yourapp --field-selector=status.phase==Running -o jsonpath="{.items[0].metadata.name}"

【讨论】:

  • kubectl 1.5 怎么样
  • @GauraangKhurana 您可以回退到-o json 并通过jq 进行过滤。根据问题改编的工作示例应该是kubectl get pod -l "app=ms-bp" -l "tier=webserver" -l "namespace=test" -o json | jq -r '.items[] | select(.status.phase == "Running") | .metadata.name, halt'。请注意,对于select 条件,我们需要使用== 而不是=,并且在我们已经通过.items[] 过滤之后,通过.items[0] 进行过滤将产生null,这就是为什么问题中的第二个示例失败。
  • 谢谢大卫!我使用 grep 和 'awk' 来获取我的结果。因为我使用的是 bash,所以更容易
  • 好的,但是如果您已经在调用awk,那么很少有理由同时使用grep
  • 命令 .status.phase == "Running" 也返回 CrashbackLoopOff pods,我认为这是一个 kubectl 错误。因此,我必须选择kubectl get pods -l "app=xyz" | grep Running,因为这会返回多个 pod,其中包含许多字段,而我只需要任何一个的名称,因此我使用 awk 获取列表的第一个。我怎么能更好地运行这个命令,有什么建议吗? kubectl get pods -l app=xyz | grep "Running" | awk 'NR==1{print \$1}'
猜你喜欢
  • 2018-08-08
  • 1970-01-01
  • 2020-10-23
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2021-12-07
相关资源
最近更新 更多