kubernetes - 如何在 Kubernetes 中重新附加已发布的 PersistentVolume

标签 kubernetes statefulset

这是我的总体目标:

  • 运行 MongoDB
  • 通过 pod 故障/更新等保留数据

  • 我采取的方法:
  • K8S提供商: digital ocean
  • 节点数:3
  • 创建PVC
  • 创建 headless 服务
  • 创建一个 StatefulSet

  • 这是配置的简化版本:
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: some-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: do-block-storage
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: some-headless-service
      labels:
        app: my-app
    spec:
      ports:
      - port: 27017
        name: my-app-database
      clusterIP: None
      selector:
        app: my-app
        tier: database
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: my-app-database
      labels:
        app: my-app
        tier: database
    spec:
      serviceName: some-headless-service
      replicas: 1
      selector:
        matchLabels:
          app: my-app
          tier: database
      template:
        metadata:
          labels:
            app: my-app
            tier: database
        spec:
          containers:
          - name: my-app-database
            image: mongo:latest
            volumeMounts:
            - name: some-volume
              mountPath: /data
            ports:
            - containerPort: 27017
              name: my-app-database
          volumes:
          - name: some-volume
            persistentVolumeClaim:
              claimName: some-pvc
    

    这是按预期工作的。我可以将副本降速到 0:
    kubectl scale —replicas=0 statefulset/my-app-database
    旋转它回来:
    kubectl scale —replicas=1 statefulset/my-app-database
    并且数据会一直存在。。

    但是有一次,当我上下调整 statefulset 时,我遇到了这个错误:
    Volume is already exclusively attached to one node and can't be attached to another
    

    作为 k8s 的新手,我删除了 PVC 并“重新创建”了相同的 PVC:
    kubectl delete pvc some-pvc
    kubectl apply -f persistent-volume-claims/
    
    statefulset用新 PV 旋转备份,旧 PV 被删除为 persistentVolumeReclaimPolicy被设置为 Delete默认情况下。

    我设置了这个新PV persistentVolumeReclaimPolicyRetain以确保数据不会被自动删除……我意识到:我不确定如何回收该 PV。早些时候为了解决“卷附件”错误,我删除了 PVC,这将使用我拥有的设置创建另一个新 PV,现在我的数据留在了 Released光伏。

    我的主要问题是:
  • 这总体上听起来像我的目标的正确方法吗?
  • 我应该考虑添加一个 claimRef到动态创建的 PV,然后使用该 claimRef 重新创建一个新的 PVC,如下所述:Can a PVC be bound to a specific PV?
  • 我应该尝试获得新鲜的statefulset PVC 居然用那个旧的 PV?
  • 尝试将旧 PV 重新附加到正确的节点是否有意义,我该怎么做?
  • 最佳答案

    如果您想使用 StatefulSet有了可扩展性,您的存储也应该支持这一点,有两种方法可以解决这个问题:

  • do-block-storage存储类支持 ReadWriteMany ,然后将所有 pod 的数据放在一个卷中。
  • 每个 pod 使用不同的卷,添加 volumeClaimTemplate给您的 StatefulSet.spec ,
    然后 k8s 将创建 PVC,如 some-pvc-{statefulset_name}-{idx}自动:
  • spec:
      volumeClaimTemplates:
      - metadata:
          name: some-pvc
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 5Gi
          storageClassName: do-block-storage
    

    更新:
    StatefulSet复制品必须使用 mongodb replication 部署,然后是 StatefulSet 中的每个 pod将具有相同的数据存储。

    所以当容器运行时 mongod命令,您必须添加选项 --replSet={name} .当所有 Pod 都启动后,执行命令 rs.initiate()告诉mongodb如何处理数据复制。放大或缩小时 StatefulSet , 执行命令 rs.add()rs.remove()告诉mongodb成员已经改变。

    关于kubernetes - 如何在 Kubernetes 中重新附加已发布的 PersistentVolume,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56368453/

    相关文章:

    kubernetes - 塞尔登IO | sklearn_iris 和 sklearn_spacy_text |不能在 k8s 中工作

    kubernetes - 如何在现有NFS共享上指定mountOptions

    kubernetes - 立即将Kubernetes Statefulset/Deployment扩展到最大容量

    postgresql - Kubernetes Helm Chart - 调试

    kubernetes - 仅从一个状态集的一个Pod中选择服务

    kubernetes - 由于证书 mTLS 上的路径无效,Istio Sidecar 代理无法启动

    networking - Openshift/Kubernetes kube dns 最佳实践 (ndots = 5)

    kubernetes - Resize PV 和 PVC 不适用于 Pod

    kubernetes - 是否可以将 Kubernetes 工作节点提升为主节点?

    kubernetes - K8s : StatefulSet how to increase time between resatrt of pod in case fails