此版本的NFS为单点,仅为练习使用,生产环境建议使用cephfs的卷类型,避免单点。或者通过keepalived加Sersync的方案对NFS作容灾处理即可用于生产环境。当然,对于开发或测试环境,方便起见,直接使用单点的NFS加mongodb statefulSet方案是最为清晰简便的。
mongodb集群部署分两种情况,一是只部署副本机制,不使用分片,另一种情况是使用分片集群。使用分片的情况下会略复杂,但基本部署方法和只部署副本的方法是差不多的,只不过是多了一些角色。这里只介绍部署副本集群到k8s集群。
部署前提:一个高可用k8s集群和NFS storage class。
部署服务器规划
主机名 | 业务概述 |
---|---|
k8s-register-node | harbor私服 |
lb-node-1 | nginx负载、helm |
lb-node-2 | nginx负载 |
k8s-master-1 | k8s master(controlplane,worker,etcd) |
k8s-master-2 | k8s master(controlplane,worker,etcd) |
k8s-master-3 | k8s master(controlplane,worker,etcd) |
k8s-storage-3 | NFS-Server |
部署一主一从一仲裁的集群,可以看出,因为NFS服务只有一个,因此这里是存在单点故障的,除此单点外,mongodb本身的服务具有高可用,副本机制如下图:
如上图,共部署三个副本,其中有一个仲裁节点,此节点并不保存数据。主节点负责读写,从节点通过Raft协议同步数据, 可作读节点。
准备keyFile
mongodb副本集必须有3个以上成员,且成员个数必须为奇数。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。 仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。
每个服务器都必须有keyFile文件,且该keyFile文件必须相同,各服务器才能正常交互。
openssl rand -base64 756 > /home/kmning/mongodb/mongodb.key
statefulSet定义
PV我们直接使用NFS storage class的动态制备,因此我们定义好statefulset和Service就可以把mongodb集群安装好,最后手动初始化集群即可。
下面的kefile内容即是上面生成的mongodb.key对应的内容。
mongodb-statefulset.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-rs-cm
data:
keyfile: |
上面生成的keyfile内容
mongod_rs.conf: |+
systemLog:
destination: file
logAppend: true
path: /data/mongod.log
storage:
dbPath: /data
journal:
enabled: true
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 4
directoryForIndexes: true
processManagement:
fork: true
timeZoneInfo: /usr/share/zoneinfo
pidFilePath: /data/mongod.pid
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 5000
security:
keyFile: /data/configdb/keyfile
authorization: enabled
replication:
oplogSizeMB: 5120
replSetName: xxxReplSet
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb-rs
spec:
serviceName: mongodb-rs
replicas: 3
selector:
matchLabels:
app: mongodb-rs
template:
metadata:
labels:
app: mongodb-rs
spec:
containers:
- name: mongo
image: xxx.com:443/mongo:4.4.10
ports:
- containerPort: 27017
name: mongo-pod-port
command: ["sh"]
args:
- "-c"
- |
set -ex
mongod --config /data/configdb/mongod_rs.conf
sleep infinity
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- name: conf
mountPath: /data/configdb
readOnly: false
- name: data
mountPath: /data
readOnly: false
volumes:
- name: conf
configMap:
name: mong