GitOps环境下如何通过Git+Kustomize+Argo CD删除Kubernetes PVC
纯GitOps模式下PVC启停管控实现方案
你现有Deployment的停服逻辑可以直接扩展到PVC资源,全程只需要修改Git仓库内的Kustomize配置,不需要手动执行kubectl命令、不需要额外脚本,完全适配Argo CD的GitOps同步逻辑。
核心实现逻辑
Argo CD默认支持资源修剪能力(syncPolicy.automated.prune: true为GitOps场景常规配置):只要Git仓库中声明的资源清单移除了对应资源,Argo CD同步时会自动删除集群中对应的存量资源。配合Kustomize的patch能力,你可以直接在现有stopApp.yaml中扩展PVC删除逻辑,和当前Deployment缩容的操作逻辑完全对齐——停服时引用stopApp.yaml,恢复时注释掉引用即可。
具体操作步骤
- 扩展现有stopApp.yaml,增加PVC删除逻辑
针对你示例中名为dummy-data的PVC,直接在stopApp.yaml中追加以下内容,使用Kustomize原生支持的strategic merge delete标记声明要删除的资源:
如果你有多个PVC需要批量删除,不需要逐个列名,可以给所有应用管理的PVC打上统一标签(比如# 停服时删除指定PVC $patch: delete apiVersion: v1 kind: PersistentVolumeClaim metadata: name: dummy-data annotations: # 配置同步波浪,晚于Deployment缩容执行删除 argocd.argoproj.io/sync-wave: "0"app: gitops-managed),再用通用target匹配批量删除:apiVersion: kustomize.config.k8s.io/v1 kind: Patch metadata: name: batch-delete-pvcs patch: | $patch: delete apiVersion: v1 kind: PersistentVolumeClaim target: kind: PersistentVolumeClaim labelSelector: "app=gitops-managed" - 给原有Deployment缩容patch加同步波浪配置,避免PVC删除卡住
Kubernetes不允许删除仍被Pod挂载的PVC,因此需要通过Argo CD同步波浪控制执行顺序:先缩Deployment到0,等所有关联Pod完全删除后,再执行PVC删除动作。
你原来的Deployment缩0patch里,给Deployment的metadata追加注解即可:apiVersion: apps/v1 kind: Deployment metadata: name: # 匹配你要停服的Deployment annotations: # 缩容动作优先执行 argocd.argoproj.io/sync-wave: "-1" spec: replicas: 0 - 验证逻辑
- 停服:在开发环境overlay的
kustomization.yaml中引用stopApp.yaml提交Git,Argo CD会自动触发同步:先把所有Deployment副本数置0,等待Pod全部销毁后,自动删除所有指定PVC,完成全资源清空。 - 恢复:注释掉
kustomization.yaml中引用stopApp.yaml的配置行提交Git,Argo CD会自动把Deployment副本数恢复为base中定义的数值,同时重新创建所有PVC,完成服务重启。
- 停服:在开发环境overlay的
注意事项
- 提前确认集群使用的StorageClass回收策略:如果回收策略为
Delete,删除PVC会同时删除底层存储卷数据,操作前务必确认停服场景允许数据清空;如果回收策略为Retain,PVC删除后PV和底层数据会保留,重建PVC时需要提前配置静态绑定规则才能关联原有PV。 - 不要给需要删除的PVC加
argocd.argoproj.io/sync-options: Prune=false注解,否则Argo CD会跳过该资源的修剪动作,PVC不会被自动删除。 - 如果你当前Argo CD没有开启自动修剪,同步时Argo CD会展示待删除的PVC资源列表,手动确认同步即可完成删除,逻辑完全一致。
- 如果你使用的Kustomize版本低于4.0,不支持顶层
$patch: delete语法,可以把删除标记移到PVC注解里,写法如下:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: dummy-data annotations: kustomize.config.k8s.io/patch-strategic-merge: delete argocd.argoproj.io/sync-wave: "0"
内容的提问来源于stack exchange,提问作者ismi
相关产品推荐
相关产品推荐

