Kubernetes集群上运行MongoDB实践(Ubuntu 18.04LTS)

原创
2019/03/01 09:09
阅读数 1.3K

MongoDB可以支持裸机运行、容器运行和Kubernetes集群运行等多种方式,其中Kubernetes上可以采用yaml部署容器、Helm Chart部署和Operator等方式,运行的动态伸缩能力有所不同。我在Kubernetes上部署MongoDB采用helm chart,还是有一些问题(非授权模式部分功能无法使用),Operator还在开发之中。部署完成后,可以使用mongo shell或者mongodb compass(如下图)来进行管理。

1、裸机部署mongodb

安装 MongoDB 服务,参考:

首先,添加apt源的key:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

添加 apt source,如下:

echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list

安装mongdb软件,执行:

sudo apt-get update
sudo apt-get install -y mongodb-org

sudo apt install mongodb-org-tools mongodb-org-shell mongodb-server-core

设置版本保持(为固定的版本),执行:

echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections

安装完毕。

2、启动MongoDB服务

2.1 启动服务进程

直接启动为命令行任务,执行:

mongod --port 27017 --dbpath /home/supermap/gvzr00/mongodb/mongodbx --bind_ip 10.1.1.203

作为服务,启动 mongod,执行:

sudo service mongod start

2.2 确认 MongoDB 启动成功

检查 mongod 集成成功启动,检查log 文件,位于 /var/log/mongodb/mongod.log ,是否出现:

[initandlisten] waiting for connections on port 27017

27017是独立模式下的缺省 mongod 服务端口。

你可以看到一些非致命的 mongod 警告输出信息,在初始的评估MongoDB阶段,可以安全地忽略掉这些警告信息。

2.3 停止 MongoDB服务

停止 mongod 服务,使用命令:

sudo service mongod stop

2.4 重新启动MongoDB

执行下面的命令:

sudo service mongod restart

2.5 使用MongoDB

启动 mongo shell 在与 mongod同一个主机上,运行 mongo shell,不带任何命令行参数连接到 mongod服务,缺省主机为localhost,端口27017:

mongo

使用mongo shell的更多连接参数, 如使用不同的主机和端口,参阅 The mongo Shell

MongoDB 提供了 Getting Started Guides,参阅 Getting Started 获取不同的版本信息。

3、Docker部署MongoDB

只需要一个命令即可启动MongoDB服务,具体操作和使用方法与裸机方式基本相同。如下:

$ docker run -d --name mongo --restart=always -p 27017:27017 mongo:4.1

通过compose来运行,示例 stack.yml 部署 mongo如下:

# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

4、Helm Chart部署MongoDB

使用Helm Chart可以快速部署MongoDB到Kubernetes集群中。但是,由于Helm Chart开发和MongoDB版本变化的原因,一些部署参数需要根据实际情况调整才能正常运行起来。

helm install --namespace mongodb --name mongodb ./mongo-helm

4.1 固定节点

作为服务,需要固定的IP主地址或者通过Ingress作为访问入口进行服务的重定向。作为最为简单的入门,我将其部署到固定节点,通过修改helm chart的values.yaml文件,然后更新helm部署即可。添加如下的信息:

nodeSelector: 
  kubernetes.io/hostname: podc02

4.2 存储使用

可以使用本地存储(需要固定运行的节点)或者网络存储(我这里用GlusterFS)。当然,也可以使用NSF/Ceph/iSCSI等存储系统(我没有测试过)。

  • Hostpath存储

创建本地存储卷,如下:

PV-物理卷创建yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodb
  namespace: mongodb
spec:
  capacity:
    storage: 80Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /home/supermap/mongodb/mongodb

PVC-卷声明创建yaml::

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mongodb
  namespace: mongodb
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 80Gi
  • GlusterFS

创建相应的卷即可,如下:

endpoint创建yaml:

apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs-gvzr00
  namespace: mongodb
subsets:
- addresses:
  - ip: 10.1.1.193
  - ip: 10.1.1.234
  - ip: 10.1.1.205
  - ip: 10.1.1.112
  ports:
  - port: 10000
    protocol: TCP

pv-物理卷创建yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodb
  namespace: mongodb
spec:
  capacity:
    storage: 800Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-gvzr00"
    path: "gvzr00/mongodb/mongodb"
    readOnly: false

pvc-卷请求创建yaml:

 kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mongodb
  namespace: mongodb
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 800Gi

4.3 权限控制

在裸机部署下,可以按照官方文档的方式使用。

  • 缺省情况下,不需要账号密码即可访问。
  • 然后创建账号数据库,再将mongod添加 -auth参数启动,即可启用认证访问模式。

但在Kubernetes部署中,缺省部署未使用授权模式。出现的一些问题包括:

  • 但是db.tables等命令提示需要授权才能使用。
  • 对admin数据库调用createUser时也提示需要授权才能使用。
  • 因为无法创建账户数据库,因此无法启用授权模式。
  • 需要进一步调整helm chart的参数,待续。

5、Operator部署

Operator是Kubernetes的一种应用管理自定义资源。

通过Kubernetes的操作器(Operator),可以管理mongdb集群多个实例的动态运行情况。获取关于mongodb operator的信息,参考:

或者,访问最新的 https://www.operatorhub.io/ 获取版本,使用参考:

目前,该Operator还在开发之中,仅用于评估。

6、更多参考

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部