首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Kubernetes集群中以绑定到本地持久化的StatefulSet模式,在MongoDB模式下安装3个副本ReplicaSet

在Kubernetes集群中以绑定到本地持久化的StatefulSet模式,在MongoDB模式下安装3个副本ReplicaSet
EN

Stack Overflow用户
提问于 2022-07-25 21:19:52
回答 1查看 188关注 0票数 0

我是从K8s开始的,我不太喜欢使用PV+PVC+SCvolumeClaimTemplates + HostPath场景部署一个带有多个副本绑定到本地磁盘的StatefulSet。我的目标是部署一个带有3个副本的MongoDB StatefulSet (mongo的副本集) ReplicaSet模式,并将每个副本绑定到本地ssd。我做了几个测试,并得到了一些概念,使之直截了当。

( a)使用PV+PVC+SC:If在我的StatefulSet容器中(与副本一起设置:1)我可以声明一个volumeMounts和一个Volume,它可以指向一个PVC,该PVC使用的是一个指向物理本地ssd文件夹的SC。这个概念是直的,所有的映射都很漂亮。如果我将副本增加到更多,然后从第二个容器开始,他们将找不到一卷来绑定to..and,我就会得到1 node(s) didn't find available persistent volumes to bind错误。

这使我意识到,从PVC上保留的存储容量不会复制为StatefulSet中的POD,并映射到每个创建的PVC上。

场景b) volumeClaimTemplates + HostPath

我注释掉了卷,而是使用了volumeClaimTemplates,它确实如我在场景a中所期望的那样工作,对于每个创建的Pod,都会创建一个相关的声明,并为该pod保留一些存储容量。这里的概念也很简单,但只有在我在storageClassName: hostpath中使用volumeClaimTemplates时,它才能起作用。我尝试使用我的SC,结果是相同的1 node(s) didn't find available persistent volumes to bind错误。

此外,当使用volumeClaimTemplates创建PV名称时,与PVC开头一样是无用和混乱的。

代码语言:javascript
运行
复制
vincenzocalia@vincenzos-MacBook-Air server-node % kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                        STORAGECLASS   REASON   AGE
mg-pv                                      3Gi        RWO            Delete           Available                                mg-sc                   64s
pvc-32589cce-f472-40c9-b6e4-dc5e26c2177a   50Mi       RWO            Delete           Bound       default/mg-pv-cont-mongo-3   hostpath                36m
pvc-3e2f4e50-30f8-4ce8-8a62-0b923fd6aa79   50Mi       RWO            Delete           Bound       default/mg-pv-cont-mongo-1   hostpath                37m
pvc-8f4ff966-c30a-469f-a68d-ed579ef2a96f   50Mi       RWO            Delete           Bound       default/mg-pv-cont-mongo-4   hostpath                36m
pvc-9f8c933b-85d6-4024-8bd0-6668feee8757   50Mi       RWO            Delete           Bound       default/mg-pv-cont-mongo-2   hostpath                37m
pvc-d6c212f3-2391-4137-97c3-07836c90b8f3   50Mi       RWO            Delete           Bound       default/mg-pv-cont-mongo-0   hostpath                37m
vincenzocalia@vincenzos-MacBook-Air server-node % kubectl get pvc
NAME                 STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mg-pv-cont-mongo-0   Bound     pvc-d6c212f3-2391-4137-97c3-07836c90b8f3   50Mi       RWO            hostpath       37m
mg-pv-cont-mongo-1   Bound     pvc-3e2f4e50-30f8-4ce8-8a62-0b923fd6aa79   50Mi       RWO            hostpath       37m
mg-pv-cont-mongo-2   Bound     pvc-9f8c933b-85d6-4024-8bd0-6668feee8757   50Mi       RWO            hostpath       37m
mg-pv-cont-mongo-3   Bound     pvc-32589cce-f472-40c9-b6e4-dc5e26c2177a   50Mi       RWO            hostpath       37m
mg-pv-cont-mongo-4   Bound     pvc-8f4ff966-c30a-469f-a68d-ed579ef2a96f   50Mi       RWO            hostpath       37m
mg-pvc               Pending                                                                        mg-sc          74s

有没有办法将volumeClaimTemplates的PV名称设置为在声明PV时更有用的名称?

如何将volumeClaimTemplates的PV指向ssd,就像我正在为我的方案a所做的那样?

非常感谢

光伏

代码语言:javascript
运行
复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mg-pv
  labels:
    type: local
spec:
  capacity:
    storage: 3Gi
  persistentVolumeReclaimPolicy: Delete
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem 
  storageClassName: mg-sc
  local:
    path: /Volumes/ProjectsSSD/k8s_local_volumes/mongo/mnt/data/unt
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - docker-desktop

SC

代码语言:javascript
运行
复制
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 name: mg-sc
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete

聚氯乙烯

代码语言:javascript
运行
复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mg-pvc
spec:
  storageClassName: mg-sc
  # volumeName: mg-pv 
  resources:
    requests:
      # storage: 1Gi
      storage: 50Mi
  accessModes:
    - ReadWriteOnce

StatefulSet

代码语言:javascript
运行
复制
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
spec:
  selector:
    matchLabels:
      role: mongo
      environment: test
  serviceName: 'mongo'
  replicas: 5
  template:
    metadata:
      labels:
        role: mongo
        environment: test
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: mongo
          image: mongo
          command:
            - mongod
            - '--bind_ip'
            - all
            - '--replSet'
            - rs0
            # - "--smallfiles"
            # - "--noprealloc"
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mg-pv-cont
              mountPath: /data/db
        - name: mongo-sidecar
          image: cvallance/mongo-k8s-sidecar
          env:
            - name: MONGO_SIDECAR_POD_LABELS
              value: 'role=mongo,environment=test'
            - name: KUBERNETES_MONGO_SERVICE_NAME
              value: 'mongo'

      ### using volumes you have to have one persistent volume for each created pod..useful only for static set of pods
      # volumes:
      #   - name: mg-pv-cont
      #     persistentVolumeClaim:
      #       claimName: mg-pvc
  ## volume claim templates create a claim for each created pos, so if scaling up or down the number of pod they¡ll clame their own space in the persistent volume.
  volumeClaimTemplates:
    - metadata:
        name: mg-pv-cont # this binds
        # name: mg-pv-pvc-template     # same name as volumeMounts or it won't bind.
        ### Waiting for deployments to stabilize...
        ### - statefulset/mongo: Waiting for statefulset spec update to be observed...
      spec:
        # storageClassName: mg-sc
        storageClassName: hostpath
        accessModes: ['ReadWriteOnce']
        resources:
          requests:
            storage: 50Mi
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-28 10:09:59

好的,在更多地修改了它并测试了几个配置之后,我发现PVCPV绑定是以1:1的方式进行的,所以一旦PV绑定到一个声明( PVCvolumeClaimTemplates)之后,就没有其他声明可以绑定到它了。因此,解决方案就是创建许多PV,就像您期望创建的那样多。和一些额外的,以扩大和下降的副本,你的StatefulSet。现在,在volumeClaimTemplates: spec: storageClassName:中,您可以使用您定义的SC,以便使用这些PV。如果使用PVC,就没有用了。它只会制造一个没有人使用的声明。

希望这将有助于其他在库伯奈特世界起步的人。干杯。

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

https://stackoverflow.com/questions/73115468

复制
相关文章

相似问题

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