使用kubectl在Kubernetes中获取pod,其中所有容器都在一行中“就绪”

qnzebej0  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(4)|浏览(143)

我们使用Istio和Jenkins作业进行集群,以获得“稳定”的Pod,它使用了这个kubectl查询:

kubectl get po -o=jsonpath="{range .items[?(@.status.containerStatuses[-1].ready==true)]}{.spec.containers[0].image}{'\\n'}{end}"

个字符
这个查询获取最后一个容器(应用程序)就绪的pod,因为我们也有Istio sidecar容器。但这里有一个棘手的事情,看起来数组是使用字母表构建的,所以如果Istio容器将是最后一个-它会将其作为ready 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个容器准备就绪时,它会获取2次pod,如果有1个容器准备就绪,则只获取1次pod。

TL;DR;

我正在寻找最终的查询,可以获取豆荚所有容器都准备好,谢谢

ldxq2e6h

ldxq2e6h1#

像这样的东西呢?

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名称,用换行符分隔
1.追加所有pod名称,这些pod名称至少有一个未就绪的容器,用换行符分隔
1.按字母顺序排序输出
1.获取唯一行,同时排除重复行。
诀窍在于-u键排除了所有重复的条目,所以剩下的就是运行pod了。{{ $pod := .}}用于保存外部作用域,以便在内部循环中打印pod名称。“Get all pod”在“get not ready pod”之后出现,以降低可能的竞争条件的风险,当我们执行“get all pod”查询时,某些pod可能已经就绪。
我相信类似的事情也可以通过jsonpath轻松实现,但我不认为你可以通过kubectl来实现,而不使用sortuniq

hm2xizp9

hm2xizp92#

准备好所有Pod:

kubectl get po -o go-template='{{ $readyFlag := true}}{{range .items}}{{range .status.containerStatuses}}{{ if not .ready}}{{ $readyFlag = false}}{{end}}{{end}}{{if $readyFlag }}{{.metadata.name}}{{"\n"}}{{end}}{{end}}'

字符串

获取所有未就绪的Pod:

kubectl get po -o go-template='{{ $readyFlag := true}}{{range .items}}{{range .status.containerStatuses}}{{ if not .ready}}{{ $readyFlag = false}}{{end}}{{end}}{{if not $readyFlag }}{{.metadata.name}}{{"\n"}}{{end}}{{end}}'

实施详情:

1.我们定义变量 $readyFlag,初始值 true
1.我们循环查看所有容器状态,如果它的字段“.ready”不是 true,则更新我们的标志值为 false
1.最后,我们只需检查 $readyFlag 是否具有值 false -那么至少有一个被检查的容器状态为not ready。如果value true -那么所有容器都准备好了

xhv8bpkk

xhv8bpkk3#

如果您对grep没有问题,可以使用以下命令:

kubectl get pod |grep -Po '^([^ ]+)(?=\s+((\d+)\/\3))'

字符串
示例如下:

kubectl get pod
NAME    READY   STATUS     RESTARTS        AGE
bar     2/2     Running    0               5m12s
foo     1/3     NotReady   6               6m9s
mypod   1/1     Running    2 (9m58s ago)   21h

kubectl get pod |grep -Po '^([^ ]+)(?=\s+((\d+)\/\3))'
bar
mypod
ps@controller:~$

vdzxcuhz

vdzxcuhz4#

这个简单的方法对我很有效。
这将仅列出完全就绪的pod。

kubectl get pods <options> | grep -P "(\d+)\/\1\s+Running"

字符串
这将检查这两个条件。
1.状态=正在运行

  1. Pod中的所有容器也准备就绪
    reg-ex的解释:
    (\d+)一次或多次出现的数字,括号表示第1组
    \/后跟斜杠字符
    \1与第一组的相同值再次匹配
    \s+一个或多个空格
    Running文字“Running”。
    这将确保READY列两侧具有相同的数字,如1/1或2/2等
    下一个状态列应等于Running

相关问题