Kubernetes在删除后重新附加到相同的持久卷

mu0hgdu0  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(123)

我有一个应用程序,其中两个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中使用保留。它在删除时保留卷,但在应用时创建新卷。

  1. Statefulset,但是我没有看到一种方法,不同的statefulset可以共享同一卷。
    有没有办法做到这一点?或者我应该只进行常规备份,然后在重新创建群集时从备份中恢复卷数据?
kxkpmulp

kxkpmulp1#

有没有办法做到这一点?或者我应该只进行常规备份,然后在重新创建群集时从备份中恢复卷数据?

群集删除将删除所有本地卷。您可以通过将数据存储在集群之外来实现这一点。Kubernetes有各种各样的存储提供商,可帮助您在各种存储类型上部署数据。
您可能还想考虑使用hostPath将数据保存在本地节点上,但这也不是一个好的解决方案,因为它需要将pod固定到特定节点以避免数据丢失。如果你删除集群的方式是所有的VM都消失了,那么这个也会消失。
拥有一些网络附加存储将是正确的方式去这里。其中一个很好的例子是持久性磁盘,它是您的示例可以访问的持久性网络存储设备。它们独立于你的虚拟机,当你删除集群时,它们会被删除。

8yoxcaq7

8yoxcaq72#

我知道这没有多大帮助,但请注意,你有所有在一个yaml文件。将PVC分离到它自己的yaml文件中,您将看到您将重新附加到同一个PV。我知道这听起来有点傻,但你试试看就知道了。
问题是你正在删除PVC,然后释放它对PV的控制,PV现在处于释放状态,基本上处于不确定状态。下次运行文件时,PVC将创建一个新的PV。现在你有两个PV:(悲伤)。你需要做这样的事

https://medium.com/building-the-open-data-stack/reclaiming-persistent-volumes-in-kubernetes-5e035ba8c770

或者就像我前面提到的,你可以把PVC放在它自己的yaml文件中,但是如果你对PVC yaml文件运行删除操作,你仍然会遇到同样的问题。
我正在处理5.7 MySQL的单个部署。我的Longhorn存储类设置为保留。

相关问题