我有一个应用程序,其中两个pod需要访问相同的卷。我希望能够删除群集,然后在应用后能够访问卷上的数据。
例如:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: retaining
provisioner: csi.hetzner.cloud
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: media
spec:
#storageClassName: retaining
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-php
labels:
app: myapp-php
k8s-app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp-php
template:
metadata:
labels:
app: myapp-php
k8s-app: myapp
spec:
containers:
- image: nginx:1.17
imagePullPolicy: IfNotPresent
name: myapp-php
ports:
- containerPort: 9000
protocol: TCP
resources:
limits:
cpu: 750m
memory: 3Gi
requests:
cpu: 750m
memory: 3Gi
volumeMounts:
- name: media
mountPath: /var/www/html/media
volumes:
- name: media
persistentVolumeClaim:
claimName: media
nodeSelector:
mytype: main
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-web
labels:
app: myapp-web
k8s-app: myapp
spec:
selector:
matchLabels:
app: myapp-web
template:
metadata:
labels:
app: myapp-web
k8s-app: myapp
spec:
containers:
- image: nginx:1.17
imagePullPolicy: IfNotPresent
name: myapp-web
ports:
- containerPort: 9000
protocol: TCP
resources:
limits:
cpu: 10m
memory: 128Mi
requests:
cpu: 10m
memory: 128Mi
volumeMounts:
- name: media
mountPath: /var/www/html/media
volumes:
- name: media
persistentVolumeClaim:
claimName: media
nodeSelector:
mytype: main
如果我这样做:
k apply -f pv-issue.yaml
k delete -f pv-issue.yaml
k apply-f pv-issue.yaml
我想连接相同的卷。
我所尝试的:
1.如果我保持文件原样,卷将被删除,因此数据将丢失。
1.我可以从文件中删除pvc声明。那就成功了我的问题是,在真实的应用程序上,我使用kustomize,并且在执行kustomize build app | kubectl delete -f -
时看不到排除资源的方法
1.尝试在PVC中使用保留。它在删除时保留卷,但在应用时创建新卷。
- Statefulset,但是我没有看到一种方法,不同的statefulset可以共享同一卷。
有没有办法做到这一点?或者我应该只进行常规备份,然后在重新创建群集时从备份中恢复卷数据?
2条答案
按热度按时间kxkpmulp1#
有没有办法做到这一点?或者我应该只进行常规备份,然后在重新创建群集时从备份中恢复卷数据?
群集删除将删除所有本地卷。您可以通过将数据存储在集群之外来实现这一点。
Kubernetes
有各种各样的存储提供商,可帮助您在各种存储类型上部署数据。您可能还想考虑使用
hostPath
将数据保存在本地节点上,但这也不是一个好的解决方案,因为它需要将pod固定到特定节点以避免数据丢失。如果你删除集群的方式是所有的VM
都消失了,那么这个也会消失。拥有一些网络附加存储将是正确的方式去这里。其中一个很好的例子是持久性磁盘,它是您的示例可以访问的持久性网络存储设备。它们独立于你的虚拟机,当你删除集群时,它们会被删除。
8yoxcaq72#
我知道这没有多大帮助,但请注意,你有所有在一个yaml文件。将PVC分离到它自己的yaml文件中,您将看到您将重新附加到同一个PV。我知道这听起来有点傻,但你试试看就知道了。
问题是你正在删除PVC,然后释放它对PV的控制,PV现在处于释放状态,基本上处于不确定状态。下次运行文件时,PVC将创建一个新的PV。现在你有两个PV:(悲伤)。你需要做这样的事
或者就像我前面提到的,你可以把PVC放在它自己的yaml文件中,但是如果你对PVC yaml文件运行删除操作,你仍然会遇到同样的问题。
我正在处理5.7 MySQL的单个部署。我的Longhorn存储类设置为保留。