gpt4 book ai didi

kubernetes - 使用 kubectl 在一行中获取 Kubernetes 中所有容器均为 "ready"的 pod

转载 作者:行者123 更新时间:2023-12-05 01:24:48 24 4
gpt4 key购买 nike

我们有 Istio 和 Jenkins 的集群来获得“稳定”的 pod,它使用这个 kubectl 查询:

kubectl get po -o=jsonpath="{range .items[?(@.status.containerStatuses[-1].ready==true)]}{.spec.containers[0].image}{'\\n'}{end}"
registry/my-proj/admin:2.0.0.000123
registry/my-proj/foo:2.0.0.000123
registry/my-proj/bar:2.0.0.000123

此查询在最后一个容器(应用程序)准备就绪的位置获取 pod,因为我们还有 Istio sidecar 容器。但这里有一个棘手的事情,它看起来像数组是使用字母表构建的,所以如果 Istio 容器将是最后一个 - 它会把它作为就绪的 pod 获取,因为最后一个容器已经准备好了。

我也尝试过使用 go-template,但这是我设法做到的最好的事情

kubectl get po -o go-template='{{range .items}}{{range .status.containerStatuses}}{{if eq .ready true }}{{end}}{{end}}{{.metadata.name}}{{println}}{{end}}
registry/my-proj/admin:2.0.0.000123
registry/my-proj/admin:2.0.0.000123
registry/my-proj/foo:2.0.0.000123
registry/my-proj/foo:2.0.0.000123
registry/my-proj/bar:2.0.0.000123

它获取 2 次 pod,其中 2 个容器就绪,如果 1 容器就绪,则只获取 1

TL;DR;

我正在寻找最终查询,它可以在所有容器都准备好的情况下获取 pod,谢谢

最佳答案

像这样的东西怎么样?

kubectl get po -o go-template='{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}{{range .items}}{{$pod := .}}{{range .status.containerStatuses}}{{if eq .ready false}}{{$pod.metadata.name}}{{"\n"}}{{end}}{{end}}{{end}}' | sort | uniq -u

这里发生了什么:

  1. 我们正在获取所有现有的 pod 名称,以换行符分隔
  2. 附加所有 pod 名称,其中至少有一个未就绪的容器,由换行符分隔
  3. 按字母顺序排序输出
  4. 获取唯一行,同时排除重复行。

诀窍是 -u 键排除了所有重复的条目,所以剩下的就是运行的 pod。{{ $pod := .}} 用于保存外部范围以在内部循环中打印 pod 名称。 “Get all pod”在“get not ready pod”之后出现,以降低可能出现竞争条件的风险,当我们执行“get all pod”查询时某些 pod 可能已经准备就绪。

我相信类似这样的事情也可以通过 jsonpath 轻松实现,但我不认为你可以只使用 kubectl 来完成它,而不使用 sortuniq.

关于kubernetes - 使用 kubectl 在一行中获取 Kubernetes 中所有容器均为 "ready"的 pod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71144976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com