使用模式匹配或通配符删除 Kubernetes POD

Posted

技术标签:

【中文标题】使用模式匹配或通配符删除 Kubernetes POD【英文标题】:Kubenetes POD delete with Pattern Match or Wildcard 【发布时间】:2020-04-15 19:51:54 【问题描述】:

当我在下面使用它时,它会在从命令行匹配模式后删除正在运行的 POD:

kubectl get pods -n bi-dev --no-headers=true | awk '/group-react/print $1' | xargs kubectl delete -n bi-dev pod

但是,当我在 .bash_profile 中将此命令用作别名时,它不会执行。 这就是我定义它的方式:

 alias kdpgroup="kubectl get pods -n bi-dev --no-headers=true | awk '/group-react/print $1'|  kubectl delete -n bi-dev pod"

当如下执行时,我在命令行中得到以下错误:

~ $ kdpgroup
error: resource(s) were provided, but no name, label selector, or --all flag specified

当我在 .bash_profile 中定义这个时,我得到了这个:

~ $ . ./.bash_profile
-bash: alias: | xargs  kubectl delete -n bi-dev pod: not found
~ $

我是否缺少使用 Pattern Match 或 Wilcard 删除 POD 的内容?

谢谢

【问题讨论】:

【参考方案1】:

我是否缺少使用模式匹配或 Wilcard 删除 POD 的内容?

在使用 Kubernetes 时,更常见的是使用 labelsselectors。例如。如果您部署了一个应用程序,您通常会在 pod 上设置一个标签,例如app=my-app 然后您可以使用例如kubectl get pods -l app=my-app.

使用这种方法,可以更轻松地删除您感兴趣的 pod,例如

kubectl delete pods -l app=my-app

或使用命名空间

kubectl delete pods -l app=my-app -n default

在Kubernetes Labels and Selectors上查看更多信息

基于集合的选择器

我有一些以“superset-react”和“superset-graphql”的名义运行的 pod,我想搜索我的通配符超集并在一个命令中删除它们

我建议这些 pod 带有标签 app=something-reactapp=something-graphql。如果您想对这些应用程序进行分类,例如如果您的“超集”不同,您可以为所有这些类型的应用添加标签 app-type=reactapp-type=graphql

然后,您可以使用以下命令删除这两种应用类型的 pod:

kubectl delete pods -l 'app-type in (react, graphql)'

【讨论】:

这并没有回答我的问题......我有一些 pod 以“superset-react”和“superset-graphql”的名义运行,我想搜索我的通配符超集并删除两者将它们放在一个命令中并将该命令放入 .bash_profile 中,这样我就不需要每次都键入。我怎样才能做到这一点?你的回答没有解决这个问题。 是的,我回答了在使用 Kubernetes 时通常是如何完成的。我已经更新了我的答案,你如何使用一个命令删除这两个应用程序。 谢谢,它有效......我意识到我必须做这样的事情:kubectl delete pods -l app.kubernetes.io/name=middleware 因为我没有指定名称。所以如果有人有同样的问题,请参考这里【参考方案2】:

正如问题所问,这是关于使用通配符。让我举例说明如何使用通配符删除 pod。

删除包含“应用程序”一词的 Pod

<namespace> 替换为您要从中删除 pod 的命名空间。

kubectl get pods -n <namespace> --no-headers=true | awk '/application/print $1'| xargs  kubectl delete -n <namespace> pod

这将给出如下响应。它将打印出已删除的 pod。

pod "sre-application-7fb4f5bff9-8crgx" deleted
pod "sre-application-7fb4f5bff9-ftzfd" deleted
pod "sre-application-7fb4f5bff9-rrkt2" deleted

删除包含“应用”或“服务”的 Pod

&lt;namespace&gt; 替换为您要从中删除 pod 的命名空间。

kubectl get pods -n <namespace> --no-headers=true | awk '/application|service/print $1'| xargs  kubectl delete -n <namespace> pod

这将给出如下响应。它将打印出已删除的 pod。

pod "sre-application-7fb4f5bff9-8crgx" deleted
pod "sre-application-7fb4f5bff9-ftzfd" deleted
pod "sre-service-7fb4f5bff9-rrkt2" deleted

【讨论】:

kubectl get pods -n &lt;namespace&gt; --no-headers=true | awk '/application/print $1'| xargs kubectl delete -n &lt;namespace&gt; pod 是绝对的救星 :)))【参考方案3】:

你只需要在 awk 命令中转义 '$1' 变量:

alias kdpgroup="kubectl get pods -n bi-dev --no-headers=true | awk '/group-react/print \$1'| xargs kubectl delete -n bi-dev pod"

我知道逃逸很无聊,如果你想避免它,你可以在你的 .bash_profile 中作为一个函数使用:

kdpgroup() 
    kubectl get pods -n default --no-headers=true | awk 'print $1' | xargs kubectl delete pod -n default

【讨论】:

我在命令行或通过 .bash_profile 运行此别名时出错:kdpgroup error: resource(s) were provided, but no name, label selector, or --all flag specified。同时设置为 .bash_profile 并最终出现以下错误:。 ./.bash_profile -bash: ./.bash_profile: 第 33 行:意外标记附近的语法错误 (' -bash: ./.bash_profile: line 33: kdpgroup() ' @pauldx,对不起,我忘记在别名命令中包含 xargs。我已经更新了命令,可以再试一次,看看是否能解决您的问题。 道歉延迟回复。是的,这非常有效。谢谢

以上是关于使用模式匹配或通配符删除 Kubernetes POD的主要内容,如果未能解决你的问题,请参考以下文章

在 unix/linux shell 中进行模式匹配时,如何使用反向或负通配符?

LeetCode 44 通配符匹配

字符串通配符匹配问题

字符串通配符匹配问题

44. LeetCode 通配符匹配

44. 通配符匹配。 DP