当我helm delete <deploymentname>
部署时,其PV和PVC也被删除。如何避免再次删除PV中的实际数据并在再次helm install <deploymentname>
时能够回收这些PV?
我经常使用helm upgrade
,但是如果删除所有数据所需的全部操作都是头盔删除(即使没有--purge选项,它也会删除所有PV),这让我感到非常不舒服
答案 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。