【问题标题】:Kubernetes reattach to same persistent volume after delete删除后 Kubernetes 重新附加到相同的持久卷
【发布时间】:2021-04-15 16:06:06
【问题描述】:

我有一个应用程序,其中两个 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. 如果我保持文件原样,卷将被删除,因此数据将丢失。
  2. 我可以从文件中删除 pvc 声明。然后它工作。我的问题是,在我使用 kustomize 的真实应用程序上,我在执行 kustomize build app | kubectl delete -f - 时看不到排除资源的方法
  3. 尝试在 pvc 中使用保留。它会在删除时保留卷,但在应用时会创建一个新卷。
  4. Statefulset,但是我看不到不同的 statefulset 可以共享相同卷的方法。

有没有办法做到这一点? 还是我应该只做定期备份,并在重建集群时从备份中恢复卷数据?

【问题讨论】:

  • 是的,如果你想在重新创建集群后保留卷,那么数据必须位于集群之外。

标签: kubernetes


【解决方案1】:

有没有办法做到这一点?或者我应该只做定期备份,并在重建集群时从备份中恢复卷数据?

集群删除将删除所有本地卷。您可以通过将数据存储在集群外部来实现这一点。 Kubernetes 拥有各种各样的存储提供商,可帮助您在各种存储类型上部署数据。

您可能还想使用hostPath 将数据本地保存在节点上,但这也不是一个好的解决方案,因为它需要您将 pod 固定到特定节点以避免数据丢失。如果你删除你的集群,所有VM都消失了,那么这个也会消失。

拥有一些网络附加存储将是正确的选择。其中一个很好的例子是Persistence disks,您的实例可以访问哪些持久网络存储设备。它们的位置独立于您的虚拟机,并且在您删除集群时它们 are not being deleted

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多