重新安装 helm 部署后重新使用 PersistentVolume

Re-use PersistentVolume after re-installing a helm deployment

当我 helm delete <deploymentname> 部署时,它的 PV 和 PVC 也会被删除。如何避免删除 PV 中的实际数据并在我再次 helm install <deploymentname> 时能够回收这些 PV?

我经常使用 helm upgrade,但如果删除所有数据只需要 helm delete(即使没有 --purge 选项,它也会删除所有 PV),这让我很不舒服

如果您正在寻找删除和重新创建之间的持久性,则不应使用 Deployment,而应使用 StatefulSet。有状态集旨在用于部署 "database-like" 应用程序。

有状态集使用持久性 pod 命名并支持为每个 pod 生成 pvc,也具有持久性名称。当 pods/stateful 集被删除时,这些 pvc 不会被删除,因此它们将保留以供重新创建的有状态集重用或通过删除 pvc 手动释放。

取自 https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/ 的示例 StatefulSet 附在下面。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

假设您正在使用 default 存储-class,避免 Helm chart 删除其上使用的 PV/PVCs 的唯一方法是预先创建 PVC,因此它们是不受 Helm 版本管理。

唯一的例外是 StatefulSets,根据定义,它永远不会删除它们的 PVC,即使它们是由 Helm 版本创建的

如果您的 Helm 图表允许,另一个选项是使用 Storage-class with reclaimPolicy: Retain,这将避免在您的部署、守护程序集 pods PVC 被分离和删除时删除您的 PV