我们使用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;
我正在寻找最终的查询,可以获取豆荚所有容器都准备好,谢谢
4条答案
按热度按时间ldxq2e6h1#
像这样的东西呢?
字符串
这里发生了什么
1.我们正在获取所有现有的pod名称,用换行符分隔
1.追加所有pod名称,这些pod名称至少有一个未就绪的容器,用换行符分隔
1.按字母顺序排序输出
1.获取唯一行,同时排除重复行。
诀窍在于
-u
键排除了所有重复的条目,所以剩下的就是运行pod了。{{ $pod := .}}
用于保存外部作用域,以便在内部循环中打印pod名称。“Get all pod”在“get not ready pod”之后出现,以降低可能的竞争条件的风险,当我们执行“get all pod”查询时,某些pod可能已经就绪。我相信类似的事情也可以通过jsonpath轻松实现,但我不认为你可以通过kubectl来实现,而不使用
sort
和uniq
。hm2xizp92#
准备好所有Pod:
字符串
获取所有未就绪的Pod:
型
实施详情:
1.我们定义变量 $readyFlag,初始值 true
1.我们循环查看所有容器状态,如果它的字段“.ready”不是 true,则更新我们的标志值为 false
1.最后,我们只需检查 $readyFlag 是否具有值 false -那么至少有一个被检查的容器状态为not ready。如果value true -那么所有容器都准备好了
xhv8bpkk3#
如果您对
grep
没有问题,可以使用以下命令:字符串
示例如下:
型
vdzxcuhz4#
这个简单的方法对我很有效。
这将仅列出完全就绪的pod。
字符串
这将检查这两个条件。
1.状态=正在运行
reg-ex的解释:
(\d+)
一次或多次出现的数字,括号表示第1组\/
后跟斜杠字符\1
与第一组的相同值再次匹配\s+
一个或多个空格Running
文字“Running”。这将确保READY列两侧具有相同的数字,如1/1或2/2等
下一个状态列应等于Running