问题描述
我有一个在我的笔记本电脑上运行的微服务。但是,我正在使用 docker compose。我正在努力部署到我已经设置的 kubernetes 集群。我坚持使数据持久化。例如,这是我在 docker-compose 中的 mongodb
systemdb:
container_name: system-db
image: mongo:4.4.1
restart: always
ports:
- '9000:27017'
volumes:
- ./system_db:/data/db
networks:
- backend
由于它是内部部署解决方案,所以我使用了 NFS 服务器。我创建了一个 Persistent Volume 和 Persistent Volume Claim (pvc-nfs-pv1),它在使用 Nginx 测试时似乎运行良好。但是,我不知道如何部署 mongodb statefulset 以使用 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
将提供稳定的存储使用
PersistentVolumes
由 PersistentVolume Provisioner 提供
因此,对于您的用例,您需要使用 nfs 配置程序创建 storageclass
。 NFS Subdir external provisioner 是一个自动配置器,它使用您现有和已经配置的 NFS 服务器来支持通过 Persistent Volume Claims 动态配置 Kubernetes Persistent Volume。永久性卷被配置为 ${namespace}-${pvcName}-${pvName}
。
这是一个如何定义存储类的示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name,must match deployment's env PROVISIONER_NAME'
parameters:
pathPattern: "${.PVC.namespace}/${.PVC.annotations.nfs.io/storage-path}" # waits for nfs.io/storage-path annotation,if not specified will accept as empty string.
onDelete: delete
,
您的问题是 mongo StatefulSet 将如何使用您创建的 pvc?默认情况下它不会。它将通过 volumeClaimTemplates 自动创建新的 pvc 数量(取决于副本集的数量),它的命名方式如下: pvc-nfs-pv1-mongod-0 、 pvc-nfs-pv1-mongod-1 等.. 因此,如果您想使用您创建的 pvc,请更改名称以匹配 pvc-nfs-pv1-mongod-0 像这样
socket.on('message',(content) => {
$('#messages').append(`<li>${content.bold} ${content.std}</li>`);
$('#messages').scrollTop = $('#messages').height();
console.log('scroll')
});
但是我不建议使用这种方法(问题:当您有许多其他副本集时..您是否必须手动创建所有 pvcs 和相应的 pv .. here 中提出了类似的问题和同样在 here 中,我建议使用动态 NFS 配置。
希望对我有帮助
,我不使用 NFS,而是使用运行我的开发服务器的 hetzner.com 上的卷。但我有完全相同的问题:因为它是我的开发系统,所以我会定期销毁和重建它。通过这样做,我希望我的卷上的数据在整个集群被删除后仍然存在。当我重建它时,所有卷都将安装到正确的 pod 中。
对于我的 postgres,这很好用。但是使用 mongodb kubernetes 运算符我无法运行它。一个 mongodb pod 永远处于“Pending”状态,因为我创建并手动绑定到卷的 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 StatefulSet:
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 选择器选择音量。
fig.add_annotation