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
复制代码

 

posted @   slnngk  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 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(带仲裁节点的副本集)各机器端口
点击右上角即可分享
微信分享提示