我們有 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;博士;
我正在尋找可以獲取所有容器都準備好的pod 的最終查詢,謝謝
uj5u.com熱心網友回復:
這樣的事情呢?
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
這里發生了什么事:
- 我們正在獲取所有現有的 pod 名稱,由換行符分隔
- 附加所有包含至少一個未就緒容器的 pod 名稱,由換行符分隔
- 按字母順序對輸出進行排序
- 獲取唯一行,同時排除重復行。
訣竅是-ukey 排除了所有重復的條目,所以剩下的就是運行 pod。
{{ $pod := .}}用于保存外部范圍以在內部回圈內列印 pod 名稱。“Get all pods” 出現在“get not ready pods”之后,以降低可能出現競爭條件的風險,當我們執行“get all pods”查詢時,一些 pod 可能已經準備就緒。
我確實相信這樣的事情也可以通過 jsonpath 輕松實作,但我認為你不能只使用 kubectl 來完成它,而無需使用sortand uniq。
uj5u.com熱心網友回復:
如果你沒問題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:~$
uj5u.com熱心網友回復:
準備好所有的 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}}'
實施細節:
- 我們用初始值true定義變數$readyFlag
- 我們回圈遍歷所有容器狀態,如果它的欄位“.ready”不是真的- 將我們的標志值更新為假
- 最后,我們只檢查$readyFlag的值是否為false - 然后至少有一個已檢查容器的狀態未準備好。如果值為true - 那么所有容器都準備好了
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425763.html
