如何使用NFS部署具有持久卷的单实例mongodb
我的笔记本电脑上有一个微型服务。但是,我使用的是docker compose。我正在努力部署到我已经设置好的kubernetes集群。我一直坚持让数据持久化。这是我在docker compose中的mongodb如何使用NFS部署具有持久卷的单实例mongodb,mongodb,kubernetes,docker-compose,persistent-storage,Mongodb,Kubernetes,Docker Compose,Persistent Storage,我的笔记本电脑上有一个微型服务。但是,我使用的是docker compose。我正在努力部署到我已经设置好的kubernetes集群。我一直坚持让数据持久化。这是我在docker compose中的mongodb systemdb: container_name: system-db image: mongo:4.4.1 restart: always ports: - '9000:27017' volumes: - ./syste
systemdb:
container_name: system-db
image: mongo:4.4.1
restart: always
ports:
- '9000:27017'
volumes:
- ./system_db:/data/db
networks:
- backend
因为它是一个内部部署的解决方案,所以我使用了NFS服务器。我创建了一个持久卷和持久卷声明(pvc-nfs-pv1),在使用nginx进行测试时,它似乎工作得很好。但是,我不知道如何部署mongodb状态集来使用pvc。我没有实现复制集
这是我的yaml:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongod
spec:
serviceName: mongodb-service
replicas: 1
selector:
matchLabels:
role: mongo
template:
metadata:
labels:
role: mongo
environment: test
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongod-container
image: mongo
resources:
requests:
cpu: "0.2"
memory: 200Mi
ports:
- containerPort: 27017
volumeMounts:
- name: pvc-nfs-pv1
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: pvc-nfs-pv1
annotations:
volume.beta.kubernetes.io/storage-class: "standard"
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 500Mi
如何执行此操作?
volumeClaimTemplates
用于动态卷资源调配。因此,您定义了一个批量索赔模板,用于为每个pod创建一个PersistentVolumeClaim
volumeClaimTemplates
将使用
由PersistentVolume供应器供应
因此,对于您的用例,您需要使用nfs provisioner创建storageclass
。是一个自动资源调配器,它使用现有和已配置的NFS服务器通过持久卷声明支持Kubernetes持久卷的动态资源调配。持久卷设置为${namespace}-${pvcName}-${pvName}
下面是一个如何定义存储类的示例:
apiVersion:storage.k8s.io/v1
种类:StorageClass
元数据:
名称:受管nfs存储
provisioner:fuseim.pri/ifs#或选择其他名称,必须与部署的环境provisioner_名称匹配
参数:
pathPattern:“${.PVC.namespace}/${.PVC.annotations.nfs.io/storage path}”等待nfs.io/storage-path注释,如果未指定,将接受为空字符串。
删除:删除
您的问题是mongo StatefulSet将如何使用您创建的pvc?默认情况下,不会。它将通过volumeClaimTemplates自动创建新pvc的数量(取决于复制集的数量),其名称如下:pvc-nfs-pv1-mongod-0、pvc-nfs-pv1-mongod-1等。。 因此,如果您想使用您创建的pvc,请更改名称以匹配pvc-nfs-pv1-mongod-0 像这样的 apiVersion:v1 种类:PersistentVolumeClaim 元数据: 标签: 角色:mongo 名称:pvc-nfs-pv1-mongod-0 名称空间:默认值 规格: ... 卷名:nfs-pv1 访问模式: -读写 资源: 请求: 储存量:500毫升 ... 但是,我不建议使用此方法(问题:当您有许多其他复制集时..您是否必须手动创建所有pv和相应的pv)。。下面是在和中提出的类似问题,我建议使用动态NFS资源调配
希望我能提供帮助我不使用NFS,而是在hetzner.com上运行我的开发服务器的卷。但我有完全相同的问题:因为这是我的开发系统,所以我定期破坏和重建它。通过这样做,我希望卷上的数据能够在整个集群删除后继续存在。当我重建它时,所有的卷都将被安装到正确的pod上 对于我的博士后来说,这很好。但是使用mongodb-kubernetes操作符,我无法运行它。mongodb pod永远处于“挂起”状态,因为我创建并手动绑定到卷的PVC已经绑定到卷。至少在我看来是这样 我感谢你的帮助, 托拜厄斯 我能看到的确切信息是:
0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims
PVC和PV:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-volume-system-mongodb-0
labels:
app: moderetic
type: mongodb
spec:
storageClassName: hcloud-volumes
volumeName: mongodb-data-volume
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-data-volume
labels:
app: moderetic
type: mongodb
spec:
storageClassName: hcloud-volumes
claimRef:
name: data-volume-system-mongodb-0
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
csi:
volumeHandle: "11099996"
driver: csi.hetzner.cloud
fsType: ext4
以及mongodb状态集:
apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBCommunity
metadata:
name: system-mongodb
labels:
app: moderetic
type: mongodb
spec:
members: 1
type: ReplicaSet
version: "4.2.6"
security:
authentication:
modes: ["SCRAM"]
users:
- name: moderetic
db: moderetic
passwordSecretRef:
name: mongodb-secret
roles:
- name: clusterAdmin
db: moderetic
- name: userAdminAnyDatabase
db: moderetic
scramCredentialsSecretName: moderetic-scram-secret
additionalMongodConfig:
storage.wiredTiger.engineConfig.journalCompressor: zlib
persistent: true
statefulSet:
spec:
template:
spec:
containers:
- name: mongod
resources:
requests:
cpu: 1
memory: 1Gi
limits:
memory: 8Gi
- name: mongodb-agent
resources:
requests:
memory: 50Mi
limits:
cpu: 500m
memory: 256Mi
volumeClaimTemplates:
- metadata:
name: data-volume
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: hcloud-volumes
resources:
requests:
storage: 10Gi
- metadata:
name: logs-volume
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: hcloud-volumes
resources:
requests:
storage: 10Gi
好的,我有一个解决办法。它只需使用matchLabels选择器选择卷即可
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-data-volume
labels:
app: moderetic
type: mongodb
role: data
spec:
storageClassName: hcloud-volumes
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
csi:
volumeHandle: "11099996"
driver: csi.hetzner.cloud
fsType: ext4
---
---
apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBCommunity
metadata:
name: system-mongodb
labels:
app: moderetic
type: mongodb
spec:
members: 1
type: ReplicaSet
version: "4.2.6"
logLevel: INFO
security:
authentication:
modes: ["SCRAM"]
users:
- name: moderetic
db: moderetic
passwordSecretRef:
name: mongodb-secret
roles:
- name: clusterAdmin
db: moderetic
- name: userAdminAnyDatabase
db: moderetic
scramCredentialsSecretName: moderetic-scram-secret
additionalMongodConfig:
storage.wiredTiger.engineConfig.journalCompressor: zlib
persistent: true
statefulSet:
spec:
template:
spec:
containers:
- name: mongod
resources:
requests:
cpu: 1
memory: 1Gi
limits:
memory: 8Gi
- name: mongodb-agent
resources:
requests:
memory: 50Mi
limits:
cpu: 500m
memory: 256Mi
volumeClaimTemplates:
- metadata:
name: data-volume
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: hcloud-volumes
resources:
requests:
storage: 10Gi
selector:
matchLabels:
app: moderetic
type: mongodb
role: data
- metadata:
name: logs-volume
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: hcloud-volumes
resources:
requests:
storage: 10Gi
selector:
matchLabels:
app: moderetic
type: mongodb
role: logs