关于ArgoCD应用孤立对象预防及旧ReplicaSet残留问题的咨询
嗨,我来帮你捋捋这个问题~首先得说,旧ReplicaSet残留其实是Kubernetes和ArgoCD的默认行为导致的:Kubernetes的Deployment默认会保留所有历史版本的ReplicaSet,方便你随时回滚;而ArgoCD默认不会主动清理这些属于Deployment子资源的对象。不过要解决这个问题,有几个实用的办法:
通过Deployment配置自动清理旧ReplicaSet
这是最推荐的方案,直接在你的deployment.yaml里添加revisionHistoryLimit字段,指定要保留的历史版本数量。比如设置为2,意思就是只保留最近2个ReplicaSet,超过的旧版本会被Kubernetes自动删掉。示例配置如下:spec: revisionHistoryLimit: 2 # 按需调整保留的版本数,比如1或3都可以 strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate这个字段的好处是,既保留了必要的回滚能力,又不会让集群里堆积大量无用的ReplicaSet。
开启ArgoCD的自动清理(Prune)功能
你需要确保你的ArgoCD应用开启了Prune特性。可以在ArgoCD的应用定义里设置spec.prune: true,或者直接在ArgoCD仪表盘里编辑应用,找到“Prune”选项勾选上。不过要注意:Prune主要是清理那些不在当前部署清单里的资源,对于Deployment生成的ReplicaSet,它不会主动处理(因为这些是Deployment的子资源),所以最好和上面的revisionHistoryLimit配合使用,效果更佳。临时手动清理(应急方案)
如果现在就想清理掉堆积的旧ReplicaSet,可以用kubectl命令快速处理:# 删除指定应用下非当前活跃版本的ReplicaSet kubectl delete replicasets.apps --selector app=<你的应用名称> --field-selector metadata.generation!=<当前Deployment的生成号>或者更简单的方式,先筛选出非活跃的ReplicaSet再删除:
kubectl get replicasets.apps --selector app=<你的应用名称> | grep -v <当前活跃ReplicaSet的名称> | awk '{print $1}' | xargs kubectl delete replicasets.apps不过这只是临时办法,还是建议用前面的配置来实现自动清理,一劳永逸。
简单总结下:旧ReplicaSet保留是为了回滚方便,如果你不需要太多历史版本,设置revisionHistoryLimit是最优解;配合ArgoCD的Prune功能,可以确保集群里的资源始终和你的部署清单保持一致,不会出现冗余对象。
备注:内容来源于stack exchange,提问作者1endell

