yaml 部署 mongodb

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
  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值