1.1 前提准备

  • 制作MongoDB 镜像,可从 Docker Hub 官网 下载镜像,目的是解决提示权限mongo-sidecar提示权限错误问题(官方镜像基础上添加了密码认证)

生成 keyfile ,编写Dockerfile,构建镜像

# 生成 keyfile
[root@registry mongodb]# openssl rand -base64 741 > mongodb-keyfile
# 查看文件信息
[root@registry mongodb]# ls
Dockerfile  mongodb-keyfile
# 创建Dockerfile
[root@registry mongodb]# cat Dockerfile
FROM mongo:3.6.4
ADD mongodb-keyfile /data/config/mongodb-keyfile
RUN chown mongodb:mongodb /data/config/mongodb-keyfile && chmod 600 /data/config/mongodb-keyfile# 构建镜像
[root@registry mongodb]# docker build -f Dockerfile -t jinyuyun.top/mongo:3.6.4 .

构建镜像

  • 外部ceph集群搭建好,(使用cephfs-csi 做数据持久卷,作为 MongoDB用来存放数据)

1.2 编写 yaml 文件

编写 mongodb-statefulset.yaml 文件,创建ServiceAccount,RBAC,StatefulSet以及提供了一个对外暴露的 NodePort 类型的 Service,用于外部访问。

# cat mongodb-statefulset.yaml
---
apiVersion: v1
kind: Namespace
metadata:name: mongodblabels:name: mongo
---
apiVersion: v1
kind: ServiceAccount      #集群访问apiserver的凭证
metadata:name: mongonamespace: mongodb---
# rbac配置
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: mongo-default-view
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: view
subjects:- kind: ServiceAccountname: mongonamespace: mongodb---
#mongo部署service
apiVersion: v1
kind: Service
metadata:name: mongonamespace: mongodblabels:name: mongo
spec:ports:- port: 27017targetPort: 27017clusterIP: Noneselector:role: mongo
---
#mongo暴露外部端口用于外部访问
apiVersion: v1
kind: Service
metadata: name: mongo-servicenamespace: mongodblabels: name: mongo
spec: ports: - name: mongoport: 27017nodePort: 27017selector: role: mongotype: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mongonamespace: mongodb
spec:selector: matchLabels: role: mongoenvironment: prodserviceName: "mongo"replicas: 2template:metadata:labels:role: mongoenvironment: prodspec:terminationGracePeriodSeconds: 10serviceAccountName: mongocontainers:- name: mongoimage: jinyuyun.top/mongo:3.6.4imagePullPolicy: IfNotPresentresources:limits:            # 限定资源cpu: 500mmemory: 500Mirequests:cpu: 100mmemory: 50Mienv:- name: MONGO_INITDB_ROOT_USERNAMEvalue: root- name: MONGO_INITDB_ROOT_PASSWORDvalue: 123args: 此处需要将command改为args ,否则 MONGO_INITDB_ROOT_USERNAME,MONGO_INITDB_ROOT_PASSWORD会被覆盖不能生效- mongod- "--replSet"- rs0- "--bind_ip"- 0.0.0.0- --clusterAuthMode- keyFile- --keyFile- /data/config/mongodb-keyfile#      - "--smallfiles"#      - "--noprealloc"ports:- containerPort: 27017volumeMounts:- name: mongo-datamountPath: /data/db- name: mongo-sidecarimage: jinyuyun.top/mongo-k8s-sidecarimagePullPolicy: IfNotPresentresources:limits:            # 限定资源cpu: 500mmemory: 500Mirequests:cpu: 100mmemory: 50Mienv:- name: KUBE_NAMESPACEvalue: mongodb- name: MONGODB_USERNAMEvalue: root- name: MONGODB_PASSWORDvalue: 123- name: MONGO_SIDECAR_POD_LABELSvalue: "role=mongo,environment=prod"- name: MONGODB_DATABASEvalue: adminvolumeClaimTemplates:- metadata:name: mongo-dataspec:accessModes: [ "ReadWriteMany" ]storageClassName: "jyy-cephfs-sc"resources:requests:storage: 3Gi

1.3 部署mongodb-statefullset.yaml文件

[root@master mongodb]# kubectl apply -f mongodb-statefulset.yaml
namespace/mongodb created
serviceaccount/mongo created
clusterrolebinding.rbac.authorization.k8s.io/mongo-default-view created
persistentvolumeclaim/mongodb-pvc created
service/mongo created
service/mongo-service created
statefulset.apps/mongo created

1.4 查看部署的mongo集群

[root@master mongodb]# kubectl get all -o wide
NAME                               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                              AGE   SELECTOR
service/csi-metrics-cephfsplugin   ClusterIP   10.103.172.38   <none>        8080/TCP                             35d   app=csi-cephfsplugin
service/kubernetes                 ClusterIP   10.96.0.1       <none>        443/TCP                              58d   <none>
service/nfs-provisioner            ClusterIP   10.110.5.164    <none>        2049/TCP,20048/TCP,111/TCP,111/UDP   58d   app=nfs-provisioner
[root@master mongodb]# kubectl get all -n mongodb
NAME          READY   STATUS    RESTARTS   AGE
pod/mongo-0   2/2     Running   0          55m
pod/mongo-1   2/2     Running   0          54mNAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
service/mongo           ClusterIP   None             <none>        27017/TCP         55m
service/mongo-service   NodePort    10.102.239.141   <none>        27017:27017/TCP   55mNAME                     READY   AGE
statefulset.apps/mongo   2/2     55m

1.4 进入容器查看集群状态

# 进入mongo-0 pod, 使用密码登录
[root@master mongodb]# kubectl exec -it mongo-0 -n mongodb -- mongo
# 进入db:admin
rs0:PRIMARY> use admin;
# 认证
rs0:PRIMARY> db.auth("root","123");
# 查看数据库
rs0:PRIMARY> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB# 查看集群状态
rs0:PRIMARY> rs.status()# 可知集群状态信息
mongo-0    PRIMARY
mongo-1    SECONDARY

 1.5 高可用主从读写测试

# 主节点存储数据
rs0:PRIMARY> db.test.insert({"name":"zhangshan"})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
rs0:PRIMARY> exit# 从节点查看数据库数据
rs0:SECONDARY> use admin
switched to db admin
rs0:SECONDARY> db.auth("root","root123");
1
rs0:SECONDARY> rs.slaveOk()
rs0:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
rs0:SECONDARY> use test
switched to db test
rs0:SECONDARY> db.test.find().pretty()
{ "_id" : ObjectId("618a307a30ed71e51682d041"), "name" : "zhangshan" }
rs0:SECONDARY> exit

1.5 使用访问MongoDB

mongo cluster访问默认连接为:

mongodb://mongo1,mongo2,mongo3:27017/dbname_?

在kubernetes中最常用的FQDN连接服务的连接为:

#appName.$HeadlessServiceName.$Namespace.svc.cluster.local

因为我们采用statefulset部署的pod,所以命名均有规则,所以实际上如果连接到副本的mongodb cluster,上面的默认连接该为(默认为namespace之外):

mongodb://mongo-0.mongo.mongodb.svc.cluster.local:27017,mongo-1.mongo.mongodb.svc.cluster.local:27017/?replicaSet=rs0

mongodb集群部署完成。

1.6 参考

k8s 搭建mongodb多副本集群 | 易学教程

https://segmentfault.com/a/1190000017321906

Kubernetes部署高可用MongoDB集群 - EvenChan - 博客园

https://github.com/cvallance/mongo-k8s-sidecar

k8s使用StatefulSet部署MongoDB集群相关推荐

  1. 在Docker中安装和部署MongoDB集群

    在Docker中安装和部署MongoDB集群 - tianshidan1998 - 博客园

  2. mysql主从配置duxi_手把手超详细Docker部署MongoDB集群

    Mongodb集群搭建 mongodb 集群搭建的方式有三种:主从备份(Master - Slave)模式,或者叫主从复制模式. 副本集(Replica Set)模式. 分片(Sharding)模式. ...

  3. k8s部署MongoDB集群(李作强)

    编写service的文件: [root@k8s-master-1 mongodb]# vim service.yaml apiVersion: v1 kind: Service metadata: n ...

  4. k8s容器化部署及集群搭建笔记

    kubeadm部署k8s 将此文章写给我最心爱的女孩 目录 kubeadm部署k8s 1.部署准备工作 小知识 2.安装具体步骤 1.安装docker 2.配置国内镜像加速器 3.添加k8s的阿里云y ...

  5. 部署MongoDB集群

    处理多种常见的故障 单节点失效,如何恢复工作 数据库意外被杀死如何进行数据恢复 数据库发生拒绝服务如何排查原因 数据库磁盘快满时如何处理 MongoDB 无数据结构限制: 1. 没有表结构的概念,每条 ...

  6. K8S Deployment脚本部署Tomcat集群

    Deployment脚本范本 部署相关常用命令 kubectl apply 是更新已经存在的脚本 kubectl create 是创建部署脚本 vim tomcat-deploy.yml replic ...

  7. k8s部署有状态(StatefulSet)zk-kafka集群

    k8s部署有状态(StatefulSet)zk-kafka集群 一共是五台服务器: 功能 IP node-1 192.168.10.201 node-2 192.168.10.202 node-3 1 ...

  8. 在K8s上部署Redis 集群

    一.前言 架构原理:每个Master都可以拥有多个Slave.当Master下线后,Redis集群会从多个Slave中选举出一个新的Master作为替代,而旧Master重新上线后变成新Master的 ...

  9. K8S 部署rabbitmq集群

    K8S 部署rabbitmq集群 版本介绍 名称 版本 k8s 1.18 rabbitmq 3.8 命名空间:rabbitmq 我这里已经建立 configmap 配置文件 [root@k8s-mas ...

最新文章

  1. 网站服务器可以用虚拟主机吗,做网站虚拟主机可以用服务器吗
  2. 【Android 高性能音频】Oboe 开发流程 ( Oboe 音频帧简介 | AudioStreamCallback 中的数据帧说明 )
  3. 详解使用fastboot为Android刷入原厂镜像
  4. 完整版使用Shell脚本在多个服务器同时实现Mysql建表语句和删除表
  5. AliCloudDenoise 语音增强算法:助力实时会议系统进入超清音质时代
  6. String到底是值类型还是引用类型(C#)
  7. 使用TensorFlow进行鬼写
  8. ikbc机械键盘打字出现重复_双十一机械键盘优惠清单,阿米洛/ikbc/吉利鸭/杜咖/美商海盗船/雷神/Filco机械键盘推荐...
  9. dtoj#4263. duliu
  10. java 依赖其他项目时如何导出_使用Eclipse将具有外部依赖性的Java项目导出到jar...
  11. 常用PDF编辑工具 Adobe Acrobat、PDF-XChange Editor 、福昕PDF编辑器、PDFelement
  12. (原创)创建windows域---深入理解域概念
  13. UE4更改天空盒材质
  14. js调用数科阅读器_aspx调用js函数
  15. 2020校招Java笔试题
  16. JAVA结合AE(Adobe After Effects),通过解析AE源文件AEPX,替换素材,渲染合成,转码等操作
  17. 内存卡 无法格式化 修复命令
  18. 【大咖说】激活数据价值,永洪科技智胜法则
  19. 安装淘宝镜像cnpm时报错!npm ERR! enoent ENOENT: no such file or directory, rename
  20. echart中饼图如何显示数据 实现鼠标移动切换显示(vue中)

热门文章

  1. 关于maven pom (父项目)的maven子moudle/springboot子项目
  2. 解决VS2019中”This function or variable may be unsafe.”警告
  3. 查指定范围内的街道(基于经纬度)
  4. base64转化字节流
  5. 鱼眼摄像头标定与畸变校正(双OPENCV版本)
  6. 梦幻西游玩家最多的服务器,梦幻西游:第54次合服计划公布了,这两个服务器的玩家有福了...
  7. c#中的sealed关键字
  8. 亚马逊云科技 build on - 实验20220806
  9. 天若OCR 5.0 出现“该区域未发现文本”处理经过
  10. php api接口验证签名错误,API常用签名验证方法(PHP实现)