yaml 部署 mongodb
单副本创建(无状态)
需要先安装 nfs
镜像拉取地址:https://hub.docker.com/_/mongo/tags
# 创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv
namespace: default
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-mongodb
nfs:
path: /mnt/nfs/mongo
server: 10.137.114.48
---
# 创建pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mongodb-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: nfs-mongodb
---
# 创建Service
apiVersion: v1
kind: Service
metadata:
name: mongodb-svc
namespace: default
spec:
type: NodePort
ports:
- name: mongo
port: 27017
targetPort: 27017
nodePort: 30488
protocol: TCP
selector:
app: mongodb
---
# 创建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-deploy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo:5.0.24
imagePullPolicy: IfNotPresent
env: #不添加 env 模块,为不设置密码
- name: MONGO_INITDB_ROOT_USERNAME
value: root #设置用户名
- name: MONGO_INITDB_ROOT_PASSWORD
value: '123456' #设置密码
- name: MONGO_INITDB_DATABASE
value: admin
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-pvc
mountPath: /data/db
volumes:
- name: mongo-pvc
persistentVolumeClaim:
claimName: mongodb-pvc
注意如果之前已经使用没有鉴权的方式部署过 MongoDB,并且做了持久化,那么再改动 YMAL 文件重新部署是不会起作用的。这种情况我们可以进入执行如下命令进入容器:
kubectl exec -it mongo-deploy-8558c64994-pxcg5 /bin/bash
进入 mongodb 客户端
mongo admin
执行如下命令创建用户即可
use admin
db.createUser(
{
user: "root",
pwd: "12345",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
- 参考文档:https://www.hangge.com/blog/cache/detail_3158.html
多副本创建(有状态)
*创建3个副本集
先安装 nfs
在nfs 挂载目录下创建三个文件目录
mkdir -p /mnt/nfs/mongo-pv1
mkdir -p /mnt/nfs/mongo-pv2
mkdir -p /mnt/nfs/mongo-pv3
并赋 读写权限
chmod 777 /mnt/nfs/mongo-pv1 /mnt/nfs/mongo-pv2 /mnt/nfs/mongo-pv3
编辑nfs挂载文件 /etc/exports 文件
vi /etc/exports
#添加路径和权限
/mnt/nfs/mongo-pv1 *(rw,async,no_root_squash,no_all_squash)
/mnt/nfs/mongo-pv2 *(rw,async,no_root_squash,no_all_squash)
/mnt/nfs/mongo-pv3 *(rw,async,no_root_squash,no_all_squash)
#重新读取配置文件
exportfs -r
然后其他的 Node 节点上可执行如下命令(ip 为 nfs 的 service 节点 IP)查看 service 节点上共享的文件夹:
showmount -e 10.137.114.48
创建 PV 持久卷
我们创建一个名为 mongo-pv.yaml 的文件,文件中内容如下
#创建第1个PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv1
labels:
app: mongodb
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: mongodb-storage
nfs:
server: 10.137.114.48
path: /mnt/nfs/mongo-pv1
persistentVolumeReclaimPolicy: Retain
---
#创建第2个PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv2
labels:
app: mongodb
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: mongodb-storage
nfs:
server: 10.137.114.48
path: /mnt/nfs/mongo-pv2
persistentVolumeReclaimPolicy: Retain
---
#创建第3个PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv3
labels:
app: mongodb
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: mongodb-storage
nfs:
server: 10.137.114.48
path: /mnt/nfs/mongo-pv3
persistentVolumeReclaimPolicy: Retain
接着执行如下命令开始创建
kubectl apply -f mongo-pv.yaml
最后执行如下命令查看所有 pv,可以看到三个持久卷均已创建成功
kubectl get pv
部署 MongoDB 应用服务
首先创建一个名为 mongodb-cluster.yaml 的配置文件,文件里的内容如下
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
spec:
selector:
matchLabels:
app: mongodb
serviceName: "mongodb-hs"
replicas: 3
template:
metadata:
labels:
app: mongodb
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongodb
image: mongo:5.0.24
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: root
- name: MONGO_INITDB_ROOT_PASSWORD
value: '123456'
- name: MONGO_INITDB_DATABASE
value: admin
command:
- mongod
- "--replSet"
- rs0
- "--bind_ip"
- 0.0.0.0
ports:
- containerPort: 27017
volumeMounts:
- name: mongdb-persistent-storage
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: mongdb-persistent-storage
spec:
storageClassName: mongodb-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
# headless 无头服务(提供域名供StatefulSet内部pod访问使用)
apiVersion: v1
kind: Service
metadata:
name: mongodb-hs
labels:
name: mongodb
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
app: mongodb
---
# 标准服务(供外部访问)
apiVersion: v1
kind: Service
metadata:
name: mongodb-cs
labels:
name: mongodb
spec:
ports:
- port: 27017
targetPort: 27017
nodePort: 30488
selector:
app: mongodb
type: NodePort
接着执行如下命令对这个 YAML 文件进行部署
kubectl apply -f mongodb-cluster.yaml
稍等片刻,执行如下命令可以查看是否创建成功
kubectl get pods
kubectl get service
执行如下命令可以看到前面创建的 pv 和 pod 也进行了关联
kubectl get pv
配置主、副节点
虽然我们已经创建了三个 Pod 实例,但它们目前还是相互独立的,接下来我们要将它们组建成集群。首先进入任意一个 Pod
kubectl exec -it mongodb-0 /bin/bash
接着执行如下命令连接上任意一个 MongoDB 数据库
bin/mongo mongodb-0.mongodb-hs.default.svc.cluster.local:27017
连接成功后执行如下命令
use adminrs
接着执行如下命令开始配置副本集
各参数说明:
(1)cfg 是可以任意的名字,当然最好不要是 mongodb 的关键字,conf,config 都可以。
(2)最外层的 _id 表示 replica set 的名字(由于前面yaml文件中我们设置 replica set 的名字为 rs0,所以这里也要保持一致)
(3)members 里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的 mongodb-0.mongodb-hs.default.svc.cluster.local:27017。
cfg = {_id: "rs0",members:[{_id: 0,host: 'mongodb-0.mongodb-hs.default.svc.cluster.local:27017',priority: 3},{_id: 1,host: 'mongodb-1.mongodb-hs.default.svc.cluster.local:27017',priority: 2},{_id: 2,host: 'mongodb-2.mongodb-hs.default.svc.cluster.local:27017',priority: 1}]};
最后执行如下命令使配置生效
rs.initiate(cfg)
稍等一会执行如下命令查看副本集状态
rs.status()
可以看到 myset 副本集中已经有一个 Primary 节点和两个 Secondary 节点,说明副本集的启动配置已完成
(截图是部署了2个节点的)
用命令 db.isMaster() 可以查看是否为 主节点
- 参考文档:https://www.hangge.com/blog/cache/detail_3159.html