更新部署时清除“副本集”?

每次更新部署时,都会向长列表添加一个新的副本集。老房子要打扫吗?

58130 次浏览

删除旧的副本集是 Deployment 对象的一部分,但它是可选的。您可以设置 .spec.revisionHistoryLimit来告诉 Deployment 要保留多少个旧的复制集。

以下是 YAML 的一个例子:

apiVersion: apps/v1
kind: Deployment
# ...
spec:
# ...
revisionHistoryLimit: 0 # Default to 10 if not specified
# ...

如果你想手动清理它,你可以只是粘贴到你的控制台

kubectl delete $(kubectl get all | grep replicaset.apps | grep "0         0         0" | cut -d' ' -f 1)

这只是由于 kubectl get all显示资源的方式而起作用。这是一个廉价的解决方案,但也不是什么大问题。

剪辑

看看 乔 · 伊夫斯的解决方案,它与 乔 · 伊夫斯的解决方案类似,但对语法的依赖性较小(至少忽略了空格)

以上是对 Kevin 文章的修改,因为我还不能发表评论

AWK 让我们忽略了间距!

kubectl delete $(kubectl get all | grep replicaset.apps | awk '{if ($2 + $3 + $4 == 0) print $1}')

在 k8s v1.19.6中,我不得不修改 Joe Eaves 的命令如下:

kubectl -n <namespace> delete rs $(kubectl -n <namespace> get rs | awk '{if ($2 + $3 + $4 == 0) print $1}' | grep -v 'NAME')

这里有一种不使用 AWK 的方法,只使用 kubectl 和内置的 jsonpath 功能:

kubectl delete replicaset $(kubectl get replicaset -o jsonpath='{ .items[?(@.spec.replicas==0)].metadata.name }')

这应该更加稳定,因为它直接处理副本计数,而不是尝试解析可能发生变化的 kubectl的输出。

一条捷径:

kubectl delete rs $(kubectl get rs | grep "0         0         0" | cut -d' ' -f 1)

我这样做:

kubectl get replicasets.apps -n namespace | awk '{if ($2 + $3 + $4 == 0) print $1}' | xargs kubectl delete replicasets.apps -n namespace

首先获取所有的复制集,然后用条件解析它,然后删除它。

使用 awk 和 xargs 删除 来自所有命名空间的所有副本集的一行程序:

kubectl get replicaset --all-namespaces -o=jsonpath='{range .items[?(@.spec.replicas==0)]}{.metadata.name}{"\t"}{.metadata.namespace}{"\n"}{end}' | awk '{print $1 " --namespace=" $2}' | xargs -n 2 -d '\n' bash -c 'kubectl delete replicaset $0 $1'