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

3
当我使用helm delete <deploymentname>删除一个部署时,它的PV和PVC也会被删除。如何避免实际存储在PV中的数据被删除,并能够在再次使用helm install <deploymentname>时重新获取这些PV呢?
我经常使用helm upgrade,但如果只需要执行helm delete(即使没有--purge选项它也会删除所有PV),这让我感到非常不舒服。

1
我猜你不想使用 helm upgrade - Ryan Dawson
我经常使用它,但如果只需要运行 helm delete(即使没有 --purge 选项),它就会让我感到非常不舒服,因为这将删除所有数据,包括 PVs。 - Hedge
2个回答

6
假设您正在使用“默认”存储类,避免Helm图表删除PV/PVC的唯一方法是预先创建PVC,以便它们不受Helm发布的管理。
唯一的例外是StatefulSets,即使它们由Helm发布创建,也永远不会删除它们的PVC。
另一个选择是,如果您的Helm图表允许,则使用具有reclaimPolicy: Retain存储类,这将在解除挂载和删除部署、守护程序集Pod PVC时避免删除PV。

我创建了一个带有reclaimPolicy retain的存储类。当删除并重新安装Helm图表时,由于大多数我的Helm图表使用服务而不是有状态集,因此会创建不同的PV。可悲的是,在那个部分之前,我能够像往常一样使用大多数helm图表,但是必须切换到DaemonSets意味着我需要创建自己的forks。你对此有什么想法吗? - Hedge

5
如果您需要在删除和重新创建之间保持持久性,那么您不应该使用Deployment而应该使用StatefulSet。StatefulSet是专为部署“类似于数据库”的应用程序而设计的。
StatefulSet使用持久Pod命名,并支持为每个Pod生成pvc,还具有持久名称。当Pods/StatefulSets被删除时,这些PVC不会被删除,因此它们可以被重新创建的StatefulSets重用,或者通过删除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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接