Kubernetes集羣上運行MongoDB實踐(Ubuntu 18.04LTS)

MongoDB能夠支持裸機運行、容器運行和Kubernetes集羣運行等多種方式,其中Kubernetes上能夠採用yaml部署容器、Helm Chart部署和Operator等方式,運行的動態伸縮能力有所不一樣。我在Kubernetes上部署MongoDB採用helm chart,仍是有一些問題(非受權模式部分功能沒法使用),Operator還在開發之中。部署完成後,可使用mongo shell或者mongodb compass(以下圖)來進行管理。node

一、裸機部署mongodb

安裝 MongoDB 服務,參考:git

首先,添加apt源的key:github

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

添加 apt source,以下:mongodb

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軟件,執行:docker

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

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

設置版本保持(爲固定的版本),執行:shell

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

安裝完畢。數據庫

二、啓動MongoDB服務

2.1 啓動服務進程

直接啓動爲命令行任務,執行:express

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

做爲服務,啓動 mongod,執行:ubuntu

sudo service mongod start

2.2 確認 MongoDB 啓動成功

檢查 mongod 集成成功啓動,檢查log 文件,位於 /var/log/mongodb/mongod.log ,是否出現:api

[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 獲取不一樣的版本信息。

三、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

四、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的參數,待續。

五、Operator部署

Operator是Kubernetes的一種應用管理自定義資源。

經過Kubernetes的操做器(Operator),能夠管理mongdb集羣多個實例的動態運行狀況。獲取關於mongodb operator的信息,參考:

或者,訪問最新的 https://www.operatorhub.io/ 獲取版本,使用參考:

目前,該Operator還在開發之中,僅用於評估。

六、更多參考

相關文章
相關標籤/搜索