查看错误 pods,低于 5 天
view error pods below which is below 5 days
我需要在所有列中列出 5 天以下的错误 pods。我试过下面的命令,但没有运气。我得到一些随机 pods 和年龄。有人可以帮忙找出不到 5 天的错误 pods。
kubectl get pod --all-namespaces --sort-by=.metadata.creationTimestamp | awk 'match(,/[1-5]+d/) {print [=11=]}' | 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
运行ning 在你的 k8s 集群中。其次,你没有指定它应该从 1 到 5 之间的数字开始,它只是说它应该出现在匹配字符串的某个地方(例如最后),所以 [1-5]d
也会匹配 63d
因为它将能够在其中找到 3d
。此正则表达式的正确形式如下所示:
^[1-5]d
这里我们指定它应该只匹配以 1 到 5 范围内的一位数字开头后跟 d
个字符的字符串。
因此 awk
部分命令可能如下所示:
awk 'match(,/^[1-5]d/) {print [=12=]}'
第二个,注意当你运行:
kubectl get pod
带有 --all-namespaces
标志,输出包含 6 列,而不是 5 列,正如 Krishna Chaurasia 在评论中提到的那样。添加了带有 NAMESPACE
header 的附加列。比较以下 2 个结果:
$ 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
AGE
成为第 6 列,因此您的命令(或特别是它的 awk
部分)应该在 </code>:</p> 列上执行匹配
<pre><code>awk 'match(,/^[1-5]d/) {print [=15=]}'
第三,关于你命令的最后一部分,即:
grep "Error"
这样的过滤可以通过kubectl
基于--field-selector
完成,例如:
kubectl get pods --field-selector=status.phase=Pending --sort-by=.metadata.creationTimestamp | awk 'match(,/^[1-5]d/) {print [=17=]}'
第四,应该注意的是,在你的例子中,你过滤掉了所有Pods
,其中AGE
被计算在其他单位,如hours
、minutes
或 seconds
。如果是故意的,请忽略下一段。
但是,如果您不想过滤掉所有较新的 Pods
,其中 AGE
不能计入 days
,您可以修改您的命令,使其显示 Pods
1-5 days
或 any number of seconds/minutes/hours
前创建的:
kubectl get pods --sort-by=.metadata.creationTimestamp | awk 'match(,/^[1-5]d|[1-9]+h|[1-9]+m|[1-9]+s/) {print [=18=]}'
我需要在所有列中列出 5 天以下的错误 pods。我试过下面的命令,但没有运气。我得到一些随机 pods 和年龄。有人可以帮忙找出不到 5 天的错误 pods。
kubectl get pod --all-namespaces --sort-by=.metadata.creationTimestamp | awk 'match(,/[1-5]+d/) {print [=11=]}' | 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
运行ning 在你的 k8s 集群中。其次,你没有指定它应该从 1 到 5 之间的数字开始,它只是说它应该出现在匹配字符串的某个地方(例如最后),所以 [1-5]d
也会匹配 63d
因为它将能够在其中找到 3d
。此正则表达式的正确形式如下所示:
^[1-5]d
这里我们指定它应该只匹配以 1 到 5 范围内的一位数字开头后跟 d
个字符的字符串。
因此 awk
部分命令可能如下所示:
awk 'match(,/^[1-5]d/) {print [=12=]}'
第二个,注意当你运行:
kubectl get pod
带有 --all-namespaces
标志,输出包含 6 列,而不是 5 列,正如 Krishna Chaurasia 在评论中提到的那样。添加了带有 NAMESPACE
header 的附加列。比较以下 2 个结果:
$ 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
AGE
成为第 6 列,因此您的命令(或特别是它的 awk
部分)应该在 </code>:</p> 列上执行匹配
<pre><code>awk 'match(,/^[1-5]d/) {print [=15=]}'
第三,关于你命令的最后一部分,即:
grep "Error"
这样的过滤可以通过kubectl
基于--field-selector
完成,例如:
kubectl get pods --field-selector=status.phase=Pending --sort-by=.metadata.creationTimestamp | awk 'match(,/^[1-5]d/) {print [=17=]}'
第四,应该注意的是,在你的例子中,你过滤掉了所有Pods
,其中AGE
被计算在其他单位,如hours
、minutes
或 seconds
。如果是故意的,请忽略下一段。
但是,如果您不想过滤掉所有较新的 Pods
,其中 AGE
不能计入 days
,您可以修改您的命令,使其显示 Pods
1-5 days
或 any number of seconds/minutes/hours
前创建的:
kubectl get pods --sort-by=.metadata.creationTimestamp | awk 'match(,/^[1-5]d|[1-9]+h|[1-9]+m|[1-9]+s/) {print [=18=]}'