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

Hed*_*dge 3 kubernetes persistent-volumes persistent-volume-claims kubernetes-helm

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

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

小智 7

假设您使用的是default存储类,避免 Helm 图表删除其上使用的 PV/PVC 的唯一方法是预先创建 PVC,这样它们就不会由 Helm 版本管理。

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

如果您的 Helm 图表允许,另一个选项是使用带有 的存储类reclaimPolicy: Retain,这将避免在部署、守护进程集 pod PVC 分离和删除时删除您的 PV


小智 5

如果您正在寻找删除和重新创建之间的持久性,则不应使用Deploymentbut StatefulSet。有状态集旨在用于部署“类似数据库”的应用程序。

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

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

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
Run Code Online (Sandbox Code Playgroud)