【发布时间】:2021-01-30 19:04:47
【问题描述】:
我有一个kubernetes 集群,并且我有一个简单的mongodb 部署和NFS 持久卷集。它工作得很好,但是由于数据库之类的资源是stateful,所以我想用Statefulset 代替mongodb,但现在的问题是,当我浏览文档时,statefulset 有volumeClaimTemplates 而不是volumes(在部署中)。
但现在问题来了。
在deployment 中这样做:
PersistentVolume -> PersistentVolumeClaim -> Deployment
但是我们如何在Statefulset 中做到这一点呢?
是这样的吗:
volumeClaimTemplates -> StatefulSet
如何为volumeClaimTemplates 设置PersistentVolume。如果我们不将PersistentVolume 用于StatefulSet,它是如何创建卷的,它在哪里创建卷?是否在 host 机器中(即 kubernetes 工作节点)?
因为我有一个单独的 NFS 预配器用于 mongodb 部署(replicasset=1),我如何使用与 StatefulSet 相同的设置?
这是我的mongo-deployment.yaml -> 我将把它转换成一个有状态集,如第二个代码 sn-p (mongo-stateful.yaml) 所示
mongo-deployment.yaml
<omitted>
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
name: mynfs # name can be anything
spec:
storageClassName: manual # same storage class as pvc
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: <nfs-server-ip>
path: "/srv/nfs/mydata"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteMany # must be the same as PersistentVolume
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
labels:
name: mongodb
spec:
selector:
matchLabels:
app: mongodb
replicas: 1
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo
ports:
- containerPort: 27017
... # omitted some parts for easy reading
volumeMounts:
- name: data
mountPath: /data/db
volumes:
- name: data
persistentVolumeClaim:
claimName: task-pv-claim
mongo-stateful.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
name: mynfs # name can be anything
spec:
storageClassName: manual # same storage class as pvc
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
server: <nfs-server-ip>
path: "/srv/nfs/mydata"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb-statefulset
spec:
selector:
matchLabels:
name: mongodb-statefulset
serviceName: mongodb-statefulset
replicas: 2
template:
metadata:
labels:
name: mongodb-statefulset
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongodb
image: mongo:3.6.4
ports:
- containerPort: 27017
volumeMounts:
- name: db-data
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: db-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "manual"
resources:
requests:
storage: 2Gi
但这不起作用 (mongo-stateful.yaml) pod 处于 pending 状态,正如我所描述的那样:
default-scheduler 0/3 个节点可用:1 个节点具有污染 {node-role.kubernetes.io/master: },该 pod 无法容忍,2 个 pod 具有未绑定的即时 PersistentVolumeClaims
PS:部署工作正常,没有任何错误,问题出在 Statefulset
有人可以帮我吗,如何用卷编写有状态集?
【问题讨论】:
标签: mongodb kubernetes kubernetes-statefulset