重新安装头盔部署后,请重新使用PersistentVolume

时间:2018-11-07 09:25:39

标签: kubernetes kubernetes-helm persistent-volumes persistent-volume-claims

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

我经常使用helm upgrade,但是如果删除所有数据所需的全部操作都是头盔删除(即使没有--purge选项,它也会删除所有PV),这让我感到非常不舒服

2 个答案:

答案 0 :(得分:2)

如果要在删除和重新创建之间保持持久性,则不应使用Deployment,而应使用StatefulSet。状态集是用于部署“类似数据库”的应用程序的一种设计。

有状态集使用持久性Pod命名,并支持为每个pod生成pvc,也使用持久性名称。删除pod /有状态集时,不会删除这些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

答案 1 :(得分:1)

假设您使用的是default存储类,这是避免Helm图表删除其上使用的PV / PVC的唯一方法,它是预先创建PVC,因此它们不受Helm发行版的管理。 / p>

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

如果您的Helm图表允许,另一个选项使用的是Storage-class with reclaimPolicy: Retain,这将避免在您的部署,后台驻留程序Pod PVC分离和删除时删除PV。