k8s下部署mongodb单机(deployment 单副本)
环境:
OS:Centos 7
k8s:三节点环境(1master 2node)
#################################部署nfs服务器#############################################
我们这里采用nfs做为pv,使用master节点做nfs服务器,当然nfs服务器也可以使用k8s外部的集群部署也可以.
1.安装nfs
[root@master ~]#yum -y install nfs-utils
[root@master ~]#yum -y install rpcbind
2.接着要创建共享文件夹,我们执行如下命令创建 1 个文件夹:
[root@master opt]# mkdir -p /opt/k8s/mongodb/pv
3.编辑 /etc/exports 文件:
vi /etc/exports
/opt/k8s/mongodb/pv *(rw,sync,no_root_squash)
4.保存退出后执行如下命令重启服务:
systemctl restart rpcbind
systemctl restart nfs.service
systemctl enable nfs.service
[root@master opt]# systemctl status nfs.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Fri 2025-02-21 09:56:38 CST; 9s ago
Main PID: 683 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
Feb 21 09:56:38 master systemd[1]: Starting NFS server and services...
Feb 21 09:56:38 master systemd[1]: Started NFS server and services.
5.执行 exportfs -v 命令可以显示出所有的共享目录
[root@master opt]# exportfs -v
/opt/k8s/mongodb/pv
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
6.其他的 Node 节点上需要执行如下命令安装 nfs-utils 客户端
yum -y install nfs-utils
7.其他的 Node 节点上可执行如下命令查看 Master 节点上共享的文件夹
[root@node2 ~]# showmount -e 192.168.1.102
Export list for 192.168.1.102:
/opt/k8s/mongodb/pv *
###################################部署 MongoDB 应用服务###########################
1.准备yaml存放目录
我这里放在master节点上
mkdir -p /root/my_yaml/mongo_yaml/
2.创建名称空间
[root@master mongo_yaml]# kubectl create namespace ns-mongo
namespace/ns-mongo created
[root@master mongo_yaml]# kubectl get ns -A
NAME STATUS AGE
cert-manager Active 51d
default Active 84d
kube-node-lease Active 84d
kube-public Active 84d
kube-system Active 84d
local-path-storage Active 83d
middleware Active 51d
milvus-operator Active 51d
ns-mongo Active 3s
2.准备yaml文件
创建如下yaml文件 mongodb.yaml 的配置文件,文件里的内容如下:
vi mongo_pv.yaml
# 创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv
namespace: ns-mongo
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-mongodb
nfs:
path: /opt/k8s/mongodb/pv
server: 192.168.1.102
vi mongo_pvc.yaml
# 创建pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc
namespace: ns-mongo
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-mongodb
vi mongo_svc.yaml
# 创建Service
apiVersion: v1
kind: Service
metadata:
name: mongodb-svc
namespace: ns-mongo
spec:
type: NodePort
ports:
- name: mongo
port: 27017
targetPort: 27017
nodePort: 30017
protocol: TCP
selector:
app: mongodb
vi mongo_deploy.yaml
# 创建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-deploy
namespace: ns-mongo
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: registry.cn-shenzhen.aliyuncs.com/hxlk8s/mongo:4.0.28
imagePullPolicy: IfNotPresent
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-pvc
mountPath: /data/db
volumes:
- name: mongo-pvc
persistentVolumeClaim:
claimName: mongodb-pvc
3.创建各种资源
创建pv
cd /root/my_yaml/mongo_yaml
kubectl apply -f mongo_pv.yaml
查看
[root@master mongo_yaml]# kubectl get pv -n ns-mongo
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mongodb-pv 1Gi RWX Retain Available nfs-mongodb 18s
pvc-53a15b55-a756-4167-9715-7193b219c160 128Mi RWO Delete Bound default/local-path-pvc local-path 83d
创建pvc
kubectl apply -f mongo_pvc.yaml
查看
[root@master mongo_yaml]# kubectl get pvc -n ns-mongo
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mongodb-pvc Bound mongodb-pv 1Gi RWX nfs-mongodb 10s
创建svc
kubectl apply -f mongo_svc.yaml
查看
[root@master mongo_yaml]# kubectl get service -n ns-mongo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mongodb-svc NodePort 10.99.118.67 <none> 27017:30017/TCP 13s
创建deployment
kubectl apply -f mongo_deploy.yaml
查看
[root@master mongo_yaml]# kubectl get pods -n ns-mongo
NAME READY STATUS RESTARTS AGE
mongo-deploy-646bf778b9-sqmlj 1/1 Running 0 50s
[root@master mongo_yaml]# kubectl get deploy -n ns-mongo
NAME READY UP-TO-DATE AVAILABLE AGE
mongo-deploy 1/1 1 1 64s
4.查看nfs目录情况
可以看到nfs目录生成了很多文件
[root@master pv]# pwd
/opt/k8s/mongodb/pv
[root@master mongodb]# cd pv
[root@master pv]# ls
collection-0--1153202264214205006.wt index-1--1153202264214205006.wt journal storage.bson WiredTiger.turtle
collection-2--1153202264214205006.wt index-3--1153202264214205006.wt _mdb_catalog.wt WiredTiger WiredTiger.wt
collection-4--1153202264214205006.wt index-5--1153202264214205006.wt mongod.lock WiredTigerLAS.wt
diagnostic.data index-6--1153202264214205006.wt sizeStorer.wt WiredTiger.lock
登录到容器查看容器内的目录:/data/db
kubectl exec -it mongo-deploy-646bf778b9-sqmlj -n ns-mongo -- /bin/sh
# cd data
# ls
configdb db
# cd db
# ls
WiredTiger _mdb_catalog.wt index-1--1153202264214205006.wt mongod.lock
WiredTiger.lock collection-0--1153202264214205006.wt index-3--1153202264214205006.wt sizeStorer.wt
WiredTiger.turtle collection-2--1153202264214205006.wt index-5--1153202264214205006.wt storage.bson
WiredTiger.wt collection-4--1153202264214205006.wt index-6--1153202264214205006.wt
WiredTigerLAS.wt diagnostic.data journal
# pwd
/data/db
说明容器内的/data/db目录会外挂到nfs的目录
docker pull registry.cn-shenzhen.aliyuncs.com/hxlk8s/mongo:4.0.28
docker inspect fb1435e8841c
可以获取到镜像的磁盘挂载情况
"Volumes": {
"/data/configdb": {},
"/data/db": {}
},
5.测试访问
登录(这个时候是没有密码的)
[root@master bin]# /opt/mongodb/bin/mongo 192.168.1.102:30017
其他的node也可以登录使用
[root@master bin]# /opt/mongodb/bin/mongo 192.168.1.105:30017
[root@master bin]# /opt/mongodb/bin/mongo 192.168.1.106:30017
5.设置密码访问
修改 mongo_deploy.yaml 文件添加如下环境变量
[root@master mongo_yaml]# more mongo_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-deploy
namespace: ns-mongo
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: registry.cn-shenzhen.aliyuncs.com/hxlk8s/mongo:4.0.28
imagePullPolicy: IfNotPresent
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: hxl
- name: MONGO_INITDB_ROOT_PASSWORD
value: 'hxl123'
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-pvc
mountPath: /data/db
volumes:
- name: mongo-pvc
persistentVolumeClaim:
claimName: mongodb-pvc
6.重新部署deployment
kubectl delete -f mongo_deploy.yaml
kubectl apply -f mongo_deploy.yaml
再次登录
/opt/mongodb/bin/mongo 192.168.1.102:30017
这个时候就需要密码了
> use admin
switched to db admin
> db.auth("hxl","hxl123");
1
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
7.创建数据库并写入数据
use db_hxl;
db.tb_test.insert({x:1});
> db.tb_test.find();
{ "_id" : ObjectId("67b816ff84a12ba5fe56a955"), "x" : 1 }
8.重新部署
kubectl delete -f mongo_deploy.yaml
kubectl apply -f mongo_deploy.yaml
/opt/mongodb/bin/mongo 192.168.1.102:30017
> use admin
switched to db admin
> db.auth("hxl","hxl123");
1
> show dbs
admin 0.000GB
config 0.000GB
db_hxl 0.000GB
local 0.000GB
> use db_hxl
switched to db db_hxl
> db.tb_test.find();
{ "_id" : ObjectId("67b816ff84a12ba5fe56a955"), "x" : 1 }
数据还是存在的.
9.pod节点切换
[root@master mongo_yaml]# kubectl get pods -o wide -n ns-mongo
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mongo-deploy-6c446cbcc9-xvblx 1/1 Running 0 5m48s 10.244.104.51 node2 <none> <none>
当前的pod执行在node2,下面修改yaml文件,让其运行在node1
nodeName: node1
先删除deployment
kubectl delete -f mongo_deploy.yaml
修改yaml文件
kind: Deployment
metadata:
name: mongo-deploy
namespace: ns-mongo
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
nodeName: node1
containers:
- name: mongodb
image: registry.cn-shenzhen.aliyuncs.com/hxlk8s/mongo:4.0.28
imagePullPolicy: IfNotPresent
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: hxl
- name: MONGO_INITDB_ROOT_PASSWORD
value: 'hxl123'
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-pvc
mountPath: /data/db
volumes:
- name: mongo-pvc
persistentVolumeClaim:
claimName: mongodb-pvc
重新创建deployment
kubectl apply -f mongo_deploy.yaml
查看pod运行所在的节点
[root@master mongo_yaml]# kubectl get pods -o wide -n ns-mongo
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mongo-deploy-7cf88bb4dd-vsdtw 0/1 ContainerCreating 0 33s <none> node1 <none> <none>
[root@master mongo_yaml]#
这里要等一会,在新的节点上运行需要在新节点上下载镜像
查看数据
/opt/mongodb/bin/mongo 192.168.1.102:30017
> use admin
switched to db admin
> db.auth("hxl","hxl123");
> use db_hxl;
switched to db db_hxl
> show tables;
tb_test
> db.tb_test.find();
{ "_id" : ObjectId("67b816ff84a12ba5fe56a955"), "x" : 1 }
>
10.开启多个副本
删除掉当前的deployment
kubectl delete -f mongo_deploy.yaml
修改yaml文件,添加如下副本
replicas: 2
[root@master mongo_yaml]# more mongo_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-deploy
namespace: ns-mongo
spec:
replicas: 2
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: registry.cn-shenzhen.aliyuncs.com/hxlk8s/mongo:4.0.28
imagePullPolicy: IfNotPresent
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: hxl
- name: MONGO_INITDB_ROOT_PASSWORD
value: 'hxl123'
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-pvc
mountPath: /data/db
volumes:
- name: mongo-pvc
persistentVolumeClaim:
claimName: mongodb-pvc
重新创建deployment
kubectl apply -f mongo_deploy.yaml
查看
[root@master mongo_yaml]# kubectl get pods -n ns-mongo
NAME READY STATUS RESTARTS AGE
mongo-deploy-6c446cbcc9-5m4qs 1/1 Running 0 11s
mongo-deploy-6c446cbcc9-crc67 0/1 CrashLoopBackOff 1 (9s ago) 11s
kubectl describe pods mongo-deploy-6c446cbcc9-crc67 -n ns-mongo
[root@master mongo_yaml]# kubectl logs mongo-deploy-6c446cbcc9-crc67 -n ns-mongo
查看日志:
2025-02-21T07:24:24.949+0000 I STORAGE [initandlisten] exception in initAndListen: DBPathInUse: Unable to lock the lock file: /data/db/mongod.lock (Resource temporarily unavailable). Another mongod instance is already running on the /data/db directory, terminating
好像需要使用StatefulSet,后续进行验证.
11.mongodb修改密码
我们尝试登录容器里面进行修改
kubectl exec -it mongo-deploy-6c446cbcc9-ld2t5 -n ns-mongo -- /bin/sh
mongo
> use admin
switched to db admin
> db.auth("hxl","hxl123");
>db.changeUserPassword("hxl", "hxl123456");
重启pod
kubectl scale --replicas=0 deployment mongo-deploy -n ns-mongo
[root@master mongo_yaml]# kubectl get pods -n ns-mongo
No resources found in ns-mongo namespace.
kubectl scale --replicas=1 deployment mongo-deploy -n ns-mongo
这个时候就需要使用新密码登录
/opt/mongodb/bin/mongo 192.168.1.102:30017
> use admin
switched to db admin
> db.auth("hxl","hxl123456");
> use db_hxl;
switched to db db_hxl
> show tables;
tb_test
> db.tb_test.find();
{ "_id" : ObjectId("67b816ff84a12ba5fe56a955"), "x" : 1 }
>
尝试使用删除deployment的方式进行验证密码是否需要修改
yaml配置文件中的密码还是保留原有的不改变:
spec:
containers:
- name: mongodb
image: registry.cn-shenzhen.aliyuncs.com/hxlk8s/mongo:4.0.28
imagePullPolicy: IfNotPresent
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: hxl
- name: MONGO_INITDB_ROOT_PASSWORD
value: 'hxl123'
kubectl delete -f mongo_deploy.yaml
kubectl apply -f mongo_deploy.yaml
这个时候也是需要使用新的密码登录,因为已经做了持久化
/opt/mongodb/bin/mongo 192.168.1.102:30017
> use admin
switched to db admin
> db.auth("hxl","hxl123456");
> use db_hxl;
switched to db db_hxl
> show tables;
tb_test
> db.tb_test.find();
{ "_id" : ObjectId("67b816ff84a12ba5fe56a955"), "x" : 1 }
>
12.删除部署
kubectl delete -f mongo_deploy.yaml
kubectl delete -f mongo_svc.yaml
kubectl delete -f mongo_pvc.yaml
kubectl delete -f mongo_pv.yaml
kubectl delete namespace ns-mongo
systemctl stop nfs.service
systemctl disable nfs.service
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2024-02-21 系统表不存在执行升级(mysql_upgrade)操作报错误的解决办法(5.6升级到5.7)
2023-02-21 centos添加磁盘挂载
2023-02-21 查看麒麟操作系统信息
2019-02-21 修改mongodb(带仲裁节点的副本集)各机器端口