重新安装 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
当我 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