【问题标题】:view error pods below which is below 5 days查看低于 5 天的错误 pod
【发布时间】:2021-02-02 12:10:52
【问题描述】:

我需要在所有列中列出 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

【问题讨论】:

  • 你能检查一下kubectl get pods --all-namespaces的输出吗?我看到我的集群的 6 标头:NAMESPACE NAME READY STATUS RESTARTS AGE。这会是个问题吗?

标签: kubernetes devops


【解决方案1】:

回答您的问题,我想指出 4 个不同的事情

首先,您的示例中使用的正则表达式不正确。以下正则表达式:

[1-5]+d

不仅会匹配 1d,2d,3d,4d5d,而且还会匹配 63d24d。为什么 ?首先,因为你使用了+quantifier,它重复上一个项目一次或多次。所以如果你有这样的Pods在你的k8s集群中运行,它甚至会匹配345d。其次,您没有指定它应该从 1 到 5 之间的数字开始,它只是说它应该出现在匹配字符串中的某处(例如最后),所以 [1-5]d 也将匹配 63d 因为它将能够在其中找到3d。这个正则表达式的正确形式如下:

^[1-5]d

这里我们指定它应该只匹配以 1 到 5 范围内的一位数字开头的字符串,后跟 d 字符。

所以awk 部分命令可能如下所示:

awk 'match($5,/^[1-5]d/) {print $0}'

第二,注意运行时:

kubectl get pod 带有 --all-namespaces 标志,输出包含 6 列,而不是 5 列,正如 Krishna Chaurasia 在 cmets 中已经提到的。添加了带有NAMESPACE 标题的附加列。比较以下 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 部分)应该在 $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}'

第四,应该注意的是,在您的示例中,您将过滤掉所有AGE 以其他单位计算的Pods,例如hoursminutes 或@987654358 @。如果是有意的,请忽略下一段。

但是,如果您不想过滤掉所有较新的Pods,其中AGE 不能计入days,您可以修改您的命令,使其显示由Pods 创建的1-5 days 或@ 987654364@前:

kubectl get pods --sort-by=.metadata.creationTimestamp | awk 'match($5,/^[1-5]d|[1-9]+h|[1-9]+m|[1-9]+s/) {print $0}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2020-04-24
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多