首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Kubernetes中重新附加已发布的PersistentVolume

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

Stack Overflow用户
提问于 2019-05-29 21:01:15
回答 1查看 4.1K关注 0票数 4

以下是我的总体目标:

  • 运行MongoDB
  • 通过吊舱故障/更新等方式保存数据

我采取的方法是:

  • K8S提供商:数字海洋
  • 节点:3
  • 创建一个PVC
  • 创建无头服务
  • 创建一个StatefulSet

下面是配置的简化版本:

代码语言:javascript
复制
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

这些数据将持续存在。

但有一次,当我在上下缩放状态时,遇到了以下错误:

代码语言:javascript
复制
Volume is already exclusively attached to one node and can't be attached to another

作为k8s的新手,我删除了PVC并“重新创建”了相同的一个:

代码语言:javascript
复制
kubectl delete pvc some-pvc
kubectl apply -f persistent-volume-claims/

在默认情况下,statefulset与新PV分离,旧PV被删除,因为persistentVolumeReclaimPolicy被设置为Delete

我将这个新的PV persistentVolumeReclaimPolicy设置为Retain,以确保数据不会被自动删除。我意识到:我不知道该如何收回光伏。为了通过“卷附件”错误,我删除了PVC,这将创建另一个新的PV与我的设置,现在我剩下我的数据在Released PV。

我的主要问题是:

  • 这听起来对我的目标来说是正确的方法吗?
  • 我是否应该考虑将一个claimRef添加到动态创建的PV中,然后使用该claimRef重新创建一个新的PVC,如这里所提到的:PVC能否绑定到特定的PV上?
  • 我应该试着让新鲜的statefulset PVC真正使用旧的PV吗?
  • 尝试将旧的PV重新连接到正确的节点是否有意义,我将如何做到这一点?
EN

回答 1

Stack Overflow用户

发布于 2019-05-30 09:30:52

如果您想使用具有可伸缩性的StatefulSet,您的存储也应该支持这一点,有两种方法可以处理这个问题:

  • 如果do-block-storage存储类支持ReadWriteMany,那么将所有pod的数据放在单个卷中。
  • 每个豆荚使用不同的音量,将volumeClaimTemplate添加到您的StatefulSet.spec中,然后k8s将自动创建PVC类some-pvc-{statefulset_name}-{idx}
代码语言:javascript
复制
spec:
  volumeClaimTemplates:
  - metadata:
      name: some-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: do-block-storage

更新:

StatefulSet副本必须与mongodb复制一起部署,这样StatefulSet中的每个pod都将具有相同的数据存储。

因此,当容器运行mongod命令时,必须添加选项--replSet={name}。当所有文件都打开时,执行命令rs.initiate()告诉mongodb如何处理数据复制。当您向上或向下扩展StatefulSet时,执行命令rs.add()rs.remove()来告诉mongodb成员已经更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56368453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档