我正在运行一个 kubernetes 作业,将其删除,然后快速重新启动它。
我正在使用以下命令来获取与我的工作相关的 pod,以便我可以运行kubectl logs $POD
。
kubectl get pods -l job-name=myjob --output=jsonpath='{.items[*].metadata.name}'
但是在删除作业之后,上述命令会返回两个 pod,一个尚未被删除的 pod,另一个是新的 pod。
kubectl describe jobs/myjob
显示正确的 pod 名称,我可以从那里的文本中解析它,这样我就可以获得最近启动的作业的唯一 pod 名称,但这似乎很不礼貌。
有没有更好的方法从特定作业中获取 pod 名称?
答案1
注意事项
工作名称:它们是为我们准备的!人类,kubernetes 反而根据标签或注释来跟踪子对象。在本例中,controller-uid
提取唯一 ID:快速实现此目的的方法,来自 kubectl 的 jsonpath。语法与 jq 相同,只需用 {} 包裹即可。jsonpath={.metadata.labels.controller-uid}
您始终可以尝试使用针对作业的 jsonpath 输出来获取 controller-uid。这应该与单个 pod 唯一匹配,因为它是在创建作业时生成的,即使作业具有相同的名称。示例:
例子
kubectl get po -l controller-uid=`kubectl get job $JOBNAME -o "jsonpath={.metadata.labels.controller-uid}"`
### Or for an unembedded way
JOBUUID=$(kubectl get job $JOBNAME -o "jsonpath={.metadata.labels.controller-uid}")
PODNAME=$(kubectl get po -l controller-uid=$JOBUUID -o name)
kubectl logs $PODNAME
希望这会有所帮助,祝你好运!