问题描述
我需要在所有列中列出 5 天以下的错误 pod。我试过下面的命令,但没有运气。我得到了一些随机的豆荚和年龄。有人可以帮助只获取 5 天以下的错误 pod。
kubectl get pod --all-namespaces --sort-by=.Metadata.creationTimestamp | awk 'match($5,/[1-5]+d/) {print $0}' | grep "Error"
NAME READY STATUS RESTARTS AGE
pod1 0/1 Error 0 63d
pod2 0/1 Error 0 24d
pod3 0/1 Error 0 11d
pod4 0/1 Error 0 4d16h
pod5 0/1 Error 0 15h
解决方法
在回答您的问题时,我想指出4 件不同的事情。
首先,你的例子中正则表达式的使用是不正确的。以下正则表达式:
[1-5]+d
不仅会匹配 1d
、2d
、3d
、4d
和 5d
,而且还会匹配 63d
或24d
。为什么 ?首先,因为您使用了 +
quantifier,它重复上一项或多次。所以如果您有这样的 345d
,它甚至会匹配 Pods
在您的 k8s 集群中运行。其次,您没有指定它应该从 1 到 5 之间的数字开始,它只是说它应该出现在匹配字符串中的某个地方(例如最后),因此 [1-5]d
也将匹配 {{1 }} 因为它将能够在其中找到 63d
。这个正则表达式的正确形式如下:
3d
这里我们指定它应该只匹配以 1 到 5 范围内的一位数字开头,后跟 ^[1-5]d
字符的字符串。
因此您的命令的 d
部分可能如下所示:
awk
第二,注意跑的时候:
awk 'match($5,/^[1-5]d/) {print $0}'
带有 kubectl get pod
标志,输出包含 6 列,而不是 5 列,正如 Krishna Chaurasia 在评论中已经提到的那样。添加了带有 --all-namespaces
标题的附加列。比较以下 2 个结果:
NAMESPACE
和
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-release-mysql-0 1/1 Running 0 12d
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default my-release-mysql-0 1/1 Running 0 12d
成为第 6 列,因此您的命令(或特别是它的 AGE
部分)应该在列 awk
上执行匹配:
$6
第三,对于你的命令的最后一部分,即:
awk 'match($6,/^[1-5]d/) {print $0}'
这样的过滤可以通过基于 grep "Error"
的 kubectl
完成,例如:
--field-selector
第四,应该注意的是,在您的示例中,您过滤掉了所有 kubectl get pods --field-selector=status.phase=Pending --sort-by=.metadata.creationTimestamp | awk 'match($5,/^[1-5]d/) {print $0}'
,其中 Pods
以其他单位(如 AGE
)计算, hours
或 minutes
。如果是有意的,请忽略下一段。
但是,如果您不想过滤掉所有较新的 seconds
,其中 Pods
不能计入 AGE
,您可以修改您的命令,使其显示 days
Pods
或 1-5 days
前创建的:
any number of seconds/minutes/hours