更新部署时清理"副本集"?

yuv*_*val 24 kubernetes

每次更新部署时,都会将新副本集添加到长列表中.应该清理旧的吗?

rwe*_*ner 53

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

  • 引用 K8s 文档: «.spec.revisionHistoryLimit 是一个可选字段,指定要保留以允许回滚的旧 ReplicaSet 数量。这些旧的 ReplicaSet 会消耗 etcd 中的资源并挤占 kubectl get rs 的输出。每个 Deployment 修订版的配置都存储在其 ReplicaSets 中;因此,一旦旧的 ReplicaSet 被删除,您就无法回滚到该 Deployment 版本。默认情况下,将保留 10 个旧的 ReplicaSet,但其理想值取决于新 Deployment 的频率和稳定性。» (3认同)

Kév*_*oix 21

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

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

这仅适用于kubectl get all显示资源的方式。这是一个便宜的解决方案,但也不是什么大问题。

编辑

看看下面@Joe Eaves 的解决方案,它很相似,但不太依赖于语法(至少忽略空格)


小智 17

对上面 Kévin 帖子的修订,因为我还不能发表评论 :D

AWK 让我们忽略间距!

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


小智 5

这是一种无需 AWK 的方法,仅使用 kubectl 和内置的 jsonpath 功能:

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

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

  • 使用 jsonpath 是最好的方法!由于未来的证明,应该是最高支持的答案! (2认同)