2

问题是在部署新部署之后

kubectl apply -f deployment.yml

(假设使用一个副本进行部署)

Kubernetes 将创建第二个 pod 并关闭前一个 - 到目前为止还可以。

但是在 kubectl apply 之后,我想立即在 CI/CD 中检测部署是否成功,并且无论如何(无论推出成功还是失败)从新部署的 pod 之一获取日志,以便在 CI 中提供尽可能多的信息/CD 日志以确定哪里出了问题。

所以我正在使用

kubectl rollout status deployment deployment-name

这是等待部署推出。紧接着你会得到两个 pod,一个处于“正在运行”状态,另一个处于“终止”状态。

现在有问题的部分:通常我会使用类似的方法

kubectl get pods --selector=app=deployment-name --output=jsonpath='{.items[*].metadata.name}' --field-selector=status.phase=Running

但不幸的是,它将返回两个 pod 的名称(“运行”和“终止”),用空格分隔。

现在我也试过了

kubectl get pods --selector=app=deployment-name --output=jsonpath='{.items[*].metadata.name}' --field-selector=status.phase=Running,status.phase!=Terminating

根据文档:

但由于某种原因,这将返回完全相同的结果,两个 pod 都在运行和终止。

问题是:

如何从结果中正确排除 TERMINATING pod?

4

2 回答 2

1

自 2018 年以来的已知问题。尚未解决。

请参考Kubectl 仅通过 --field-selector 或 -o jsonpath 选择处于运行状态的 Pod 时返回各种状态的 Pod以获取更多详细信息。

简而言之:没有正常的、简短的、足够的单行命令可以满足您的需求。

背后的原因

这看起来不是一个错误。kubectl get pods output STATUS 列不显示 status.phase。kubectl get pods 显示 PodList 对象的表格格式,并使用 status.containerStatuses 状态显示 STATUS 列数据。

Pod 阶段有效状态为挂起、运行、成功、失败和未知。从此文档中,“运行”状态取决于“重新启动策略”。

Jsonpath 适用于“PodList”对象,而不是 kubectl 输出。status.containerStatuses 给出 pod 容器是否运行。字段选择器因 Kubernetes 资源类型而异。pod 字段选择器不支持 status.containerStatuses。

解决方法:

1. kubectl get pods | grep Running

2. kubectl get pods -o jsonpath='{.items[*].status.containerStatuses[*].state.running},{.items[*].metadata.name}' --field-selector=status.phase==Running | sed 's/ /\n/' | grep startedAt | awk -F',' '{print $2}'

3.来源kubectl get pods --field-selector=status.phase=Running --template {{range .items}}{{ if not .metadata.deletionTimestamp }}{{.metadata.name}}{{"\n"}}{{end}}{{end}}

于 2021-03-19T17:31:15.947 回答
0

从命令行你可以使用类似的命令

grep

抓住你喜欢的东西,或者你可以做我做的事情,然后看看所有的豆荚

watch 

命令以查看更改并从单独的终端查看错误。

我在这些情况下使用什么:

watch -n0.5 " kubectl get pods | grep -v 'Running' "

然后从单独的终端捕获具有运行状态(已完成、OOMKilled、待处理等)的 pod

kubectl logs podName && kubectl describe pods podName

我希望我能帮上一点忙。

即使是为了获取我使用的最新版本号

kubectl rollout history deployment.v1.apps/deploymentName | tail -2 | head -1 | awk '{print $1}'

但也许你可以使用

kubectl get pods  --sort-by=.metadata.creationTimestamp 

然后拿最后一个,所以最后也许,你可以使用

kubectl logs -c [containerName] $(kubectl get pods  --sort-by=.metadata.creationTimestamp | tail -1 | awk '{print$1}') 

这可以给我最新创建的 pod 及其日志

于 2021-03-18T21:02:48.847 回答