我使用kubernetes集群为自己和其他开发人员运行开发环境。我写了一些shell函数来帮助每个人处理他们的pod,而无需手动键入长kubectl命令。例如,为了在其中一个pod上获得提示,我的函数使用以下
kubectl exec -it $(kubectl get pods --selector=run=${service} --field-selector=status.phase=Running -o jsonpath="{.items[*].metadata.name}") -- bash;
其中$service被设置为我想要访问的服务标签,比如postgres、redis或uwsgi。
由于这些都是开发环境,所以每种类型的pod总是有一种。我遇到的问题是,如果我删除一个pod以使其获得新的映像(所有pod都由部署管理,所以如果我删除了一个pod,它将创建一个新的pod(,在一段时间内,有两个pod,一个显示为正在终止,另一个在kubectl get pods
输出中运行。我想确保上面的命令选择了正在运行的pod,而不是正在终止的pod。我以为--field-selector=status.phase=Running
标志可以做到,但事实并非如此。显然,即使pod正在终止,它仍然会在status.phase字段中报告运行状态。我可以使用什么来筛选出终止pod?
使用这个
$ kubectl exec -it $(kubectl get pods --selector=run=${service} | grep "running" | awk '{print $1}') -- bash;
或
$ kubectl exec -it $(kubectl get pods --selector=run=${service} -o=jsonpath='{.items[?(@.status.phase==“Running”)].metadata.name}') -- bash;
参考编号:https://kubernetes.io/docs/reference/kubectl/jsonpath/