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

52

当我使用以下命令时,它会在命令行匹配模式后删除正在运行的 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
~ $

我是否漏掉了使用模式匹配或通配符删除POD的步骤?

谢谢。

5个回答

80
我能使用模式匹配或通配符删除POD吗?在使用Kubernetes时,更常见的做法是使用标签和选择器。例如,如果您部署了一个应用程序,通常会在Pod上设置一个标签,例如app=my-app,然后您可以使用kubectl get pods -l app=my-app获取Pods。使用这种方法,您可以更轻松地删除您感兴趣的Pods,例如:
kubectl delete pods -l app=my-app

或者使用命名空间

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

更多内容请参考Kubernetes标签和选择器

基于集合的选择器

我有一些名为"superset-react"和"superset-graphql"的pod正在运行,我想搜索我的通配符superset并通过一个命令删除它们两个

我建议这些Pod具有标签app=something-reactapp=something-graphql。如果您想对这些应用进行分类,例如如果您的"superset"不同,您可以将标签app-type=reactapp-type=graphql添加到所有这些类型的应用程序中。

然后,您可以使用此命令删除两种应用程序类型的Pod:

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

5
然而,那并没有回答我的问题...我有一些以“superset-react”和“superset-graphql”的名称运行的Pod,我想搜索通配符superset并在一个命令中删除它们,然后将该命令放入.bash_profile中,这样我就不需要每次输入。我该如何实现?你的回答没有解决这个问题。 您的问题是如何使用通配符搜索并在一个命令中删除名为"superset-react"和"superset-graphql"的所有Pod,并将此命令添加到.bash_profile中以避免每次键入。您的先前答案没有涵盖这一点。 - pauldx
1
是的,我回答了在使用Kubernetes时通常如何完成这个任务。我已经更新了我的答案,告诉你如何用一个命令删除两个应用程序。 - Jonas
1
谢谢,它起作用了...我意识到我必须做这样的事情:kubectl delete pods -l app.kubernetes.io/name=middleware,因为我没有指定名称。所以如果有人遇到同样的问题,请参考这里。 - pauldx
2
这是k8s风格的答案。 - knt5784

57

就像问题所问,这是关于使用通配符的问题。让我举几个例子,说明如何使用通配符来删除 Pod。

删除包含单词“application”的 Pods

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

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

删除包含“application”或“service”的Pod

<namespace>替换为您要从中删除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

1
kubectl get pods -n <namespace> --no-headers=true | awk '/application/{print $1}'| xargs kubectl delete -n <namespace> pod 是一个绝对的救星 :))) - Ashkan Pourghasem
1
这些答案对我很有效。 - d-man
1
惊人,这就是正确的答案。 - Marko Rochevski
太棒了!喜欢它 <3 - s_bei

5
您只需在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文件中使用"as"函数:

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

在命令行或通过.bash_profile运行此别名时,我遇到了错误:kdpgroup 错误:提供了资源,但未指定名称、标签选择器或--all标志。同时将其设置为.bash_profile,结果出现以下错误:. ./.bash_profile -bash: ./.bash_profile: 第33行附近有意外的符号 -bash: ./.bash_profile: 第33行:`kdpgroup() {' - pauldx
1
@pauldx,对不起,我忘了在别名命令中包含 xargs。我已经更新了命令,请再试一次,看看这是否解决了你的问题。 - Mr.KoopaKiller
1
抱歉延迟回复。是的,这完美地运作了。谢谢。 - pauldx

3
基于@keetSugathadasa的答案,使用变量的可靠方法:
ns="optional-namespace"
regex="pattern"

kubectl get pods ${ns:+ -n $ns} --no-headers | awk /${regex}/'{print $1}' \ 
| xargs kubectl delete ${ns:+ -n $ns} pod

2

使用grep命令可以过滤关键字并像这样删除匹配的Pod名称

kubectl get pods   --no-headers=true | awk '{print $1}' | grep keyword |  xargs kubectl delete pod


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接