返回 导航

Docker / K8s

hangge.com

K8s - 安装部署MongoDB数据库教程1(单实例)

作者:hangge | 2022-01-25 08:10
    MongoDB 是一个基于分布式文件存储的数据库。我之前文件中介绍如何使用官方提供的安装包进行 MongoDB 数据库的安装(点击查看),以及如何通过 Docker 来快速搭建 MongoDB 数据库环境(点击查看)。本文接着演示如何在 Kubernetes 集群上部署 MongoDB 数据库服务。

一、单节点部署

1,创建 NFS 存储
    NFS 存储主要是为了给 MongoDB 提供稳定的后端存储,当 MongoDB 的 Pod 发生故障重启或迁移后,依然能获得原先的数据。

(1)这里我选择在 master 节点创建 NFS 存储,首先执行如下命令安装 NFS
yum -y install nfs-utils
yum -y install rpcbind

(2)接着要创建共享文件夹,我们执行如下命令创建 1 个文件夹:
mkdir -p /usr/local/k8s/mongodb/pv

(3)编辑 /etc/exports 文件:
vi /etc/exports

(4)在里面添加如下内容:
/usr/local/k8s/mongodb/pv *(rw,sync,no_root_squash)

(5)保存退出后执行如下命令重启服务:
如果执行 systemctl restart nfs 报“Failed to restart nfs.service: Unit nfs.service not found.”错误,可以尝试改用如下命令:
  • sudo service nfs-server start
systemctl restart rpcbind
systemctl restart nfs
systemctl enable nfs

(6)执行 exportfs -v 命令可以显示出所有的共享目录:

(7)而其他的 Node 节点上需要执行如下命令安装 nfs-utils 客户端:
yum -y install nfs-util

(8)然后其他的 Node 节点上可执行如下命令(ipMaster 节点 IP)查看 Master 节点上共享的文件夹:
showmount -e 10.0.16.8

2、部署 MongoDB 应用服务

(1)首先创建一个名为 mongodb.yaml 的配置文件,文件里的内容如下:
# 创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv
namespace: default
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-mongodb
nfs:
path: /usr/local/k8s/mongodb/pv
server: 10.0.16.8

---
# 创建pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mongodb-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
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: 30017
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:4.4
imagePullPolicy: IfNotPresent
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-pvc
mountPath: /data/db
volumes:
- name: mongo-pvc
persistentVolumeClaim:
claimName: mongodb-pvc

(2)接着执行如下命令对这个 YAML 文件进行部署:
kubectl apply -f mongodb.yaml

(3)稍等片刻,执行如下命令可以查看是否创建成功:
kubectl get pv
kubectl get pods
kubectl get service

3,访问测试

(1)我们使用客户端工具连接上我们刚刚创建的 MongoDB,然后创建一个 hangge 数据库以及 test 集合,并给集合中插入一些数据,说明 MongoDB 部署成功。

(2)接着执行如下命令强制重启 pod,重启后再次查看数据库可以发现数据没有丢失,说明数据持久化也是成功的。
kubectl replace --force -f mongodb.yaml

附:开启用户权限认证

(1)通过上面步骤部署好的 MongoDB 数据库无需用户名、密码即可连接,如果想要开启权限验证,只需要在 YAML 文件中入环境变量 MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD 即可。
注意:由于我这里将密码设置为纯数字(12345),因此需要加上引号。
# 创建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:4.4
          imagePullPolicy: IfNotPresent
          env:
            - name: MONGO_INITDB_ROOT_USERNAME
              value: root
            - name: MONGO_INITDB_ROOT_PASSWORD
              value: '12345'
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mongo-pvc
              mountPath: /data/db
      volumes:
        - name: mongo-pvc
          persistentVolumeClaim:
            claimName: mongodb-pvc

(2)注意如果之前已经使用没有鉴权的方式部署过 MongoDB,并且做了持久化,那么再改动 YMAL 文件重新部署是不会起作用的。这种情况我们可以进入执行如下命令进入容器:
kubectl exec -it mongo-deploy-8558c64994-pxcg5 /bin/bash

(3)进入 mongodb 客户端:
mongo admin

(4)执行如下命令创建用户即可:
use admin
db.createUser(
  {
    user: "root",
    pwd: "12345",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
评论

全部评论(0)

回到顶部