OpenShift 4 之 GitOps(6)用ArgoCD部署MongoDB主从集群
《OpenShift 4.x HOL教程汇总》
文章目录
- 部署架构
- 部署MongoDB主从集群
- 准备操作环境
- 配置ArgoCD
- 准备MongoDB所需证书
- 更新被部署的YAML文件
- 在三个OpenShift集群中部署MongoDB
- 配置MongoDB的ReplicaSet
部署架构
本文介绍如何利用ArgoCD在三个OpenShift集群上部署一套MongoDB的主从集群。下一章节再在部署三个OpenShift集群上部署应用访问MongoDB集群。
部署MongoDB主从集群
准备操作环境
- 操作环境以Linux为例。
- 正常安装ArgoCD服务器和客户端。
- 将https://github.com/openshift/federation-dev.git复制一份到自己的github账号,然后再clone一份到本地。最后将本地的federation-dev/labs/utility/目录中的文件全部赋予可执行权限,并将该目录放到PATH环境变量中。
- 参照《OpenShift 4 之 GitOps(1)安装ArgoCD环境》。
- 在https://pkg.cfssl.org/下载对应平台的cfssl和cfssljson软件。
配置ArgoCD
参考《OpenShift 4 之 GitOps(4)用ArgoCD向Multi-Cluster发布应用》,先通过“oc config rename-context <NEW_NAME>”命令修改三个OpenShift集群的Config Context名称(分别命名为cluster1、cluster2、cluster3),然后通过“argocd cluster add <CONTEXT_NAME>”命令分别将三个OpenShift集群加到ArgoCD环境中。
准备MongoDB所需证书
为了让MongoDB可通过TLS访问,需要生成证书和秘钥。
- 进入lab-6-assets目录,然后创建三个文件,分别是ca-config.json,ca-csr.json,mongodb-csr.json。
$ cd ~/federation-dev/labs/lab-6-assets
$ cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "8760h"},"profiles": {"kubernetes": {"usages": ["signing", "key encipherment", "server auth", "client auth"],"expiry": "8760h"}}}
}
EOF$ cat > ca-csr.json <<EOF
{"CN": "Kubernetes","key": {"algo": "rsa","size": 2048},"names": [{"C": "US","L": "Austin","O": "Kubernetes","OU": "TX","ST": "Texas"}]
}
EOF$ cat > mongodb-csr.json <<EOF
{"CN": "kubernetes","key": {"algo": "rsa","size": 2048},"names": [{"C": "US","L": "Austin","O": "Kubernetes","OU": "TX","ST": "Texas"}]
}
EOF
- 生成CA文件。
$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
- 设置所需环境变量,最后创建MongoDB证书。
$ NAMESPACE=mongo
$ SERVICE_NAME=mongo
$ ROUTE_CLUSTER1=mongo-cluster1.$(oc --context=cluster1 get ingresses.config.openshift.io cluster -o jsonpath='{ .spec.domain }')
$ ROUTE_CLUSTER2=mongo-cluster2.$(oc --context=cluster2 get ingresses.config.openshift.io cluster -o jsonpath='{ .spec.domain }')
$ ROUTE_CLUSTER3=mongo-cluster3.$(oc --context=cluster3 get ingresses.config.openshift.io cluster -o jsonpath='{ .spec.domain }')
$ SANS="localhost,localhost.localdomain,127.0.0.1,${ROUTE_CLUSTER1},${ROUTE_CLUSTER2},${ROUTE_CLUSTER3},${SERVICE_NAME},${SERVICE_NAME}.${NAMESPACE},${SERVICE_NAME}.${NAMESPACE}.svc.cluster.local"
$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -hostname=${SANS} -profile=kubernetes mongodb-csr.json | cfssljson -bare mongodb
- 合并秘钥和证书文件。
$ cat mongodb-key.pem mongodb.pem > mongo.pem
更新被部署的YAML文件
在Gitops中所有部署对象都是YAML文件,所以在通过ArgoCD执行YAML之前,我们还需要将和操作环境相关的配置更新到YAML中。
- 修改本地的mongo-secret.yaml文件
$ sed -i "s/mongodb.pem: .*$/mongodb.pem: $(openssl base64 -A < mongo.pem)/" base/mongo-secret.yaml
$ sed -i "s/ca.pem: .*$/ca.pem: $(openssl base64 -A < ca.pem)/" base/mongo-secret.yaml
- 修改本地的mongo-rs-deployment.yaml文件
$ sed -i "s/primarynodehere/${ROUTE_CLUSTER1}:443/" base/mongo-rs-deployment.yaml
$ sed -i "s/replicamembershere/${ROUTE_CLUSTER1}:443,${ROUTE_CLUSTER2}:443,${ROUTE_CLUSTER3}:443/" base/mongo-rs-deployment.yaml
- 修改本地的mongo-route.yaml文件
$ sed -i "s/mongocluster1route/${ROUTE_CLUSTER1}/" overlays/cluster1/mongo-route.yaml
$ sed -i "s/mongocluster2route/${ROUTE_CLUSTER2}/" overlays/cluster2/mongo-route.yaml
$ sed -i "s/mongocluster3route/${ROUTE_CLUSTER3}/" overlays/cluster3/mongo-route.yaml
- 将mongo-secret.yaml、mongo-rs-deployment.yaml、mongo-route.yaml更新至自己的github。
在三个OpenShift集群中部署MongoDB
- 将自己github账号()中的三个MongoDB集群的配置加入到ArgoCD中。
$ MY_GITHUB=https://github.com/<MY-GITHUB>/federation-dev.git
$ argocd app create --project default --name cluster1-mongo \--repo ${MY_GITHUB} \--path labs/lab-6-assets/overlays/cluster1 \--dest-server $(argocd cluster list | grep cluster1 | awk '{print $1}') \--dest-namespace mongo --revision master --sync-policy automated$ argocd app create --project default --name cluster2-mongo \--repo ${MY_GITHUB} \--path labs/lab-6-assets/overlays/cluster2 \--dest-server $(argocd cluster list | grep cluster2 | awk '{print $1}') \--dest-namespace mongo --revision master --sync-policy automated$ argocd app create --project default --name cluster3-mongo \--repo ${MY_GITHUB} \--path labs/lab-6-assets/overlays/cluster3 \--dest-server $(argocd cluster list | grep cluster3 | awk '{print $1}') \--dest-namespace mongo --revision master --sync-policy automated
如果对自己Github账户中的部署文件进行了更改,可执行以下命令手动同步到ArgoCD。
$ argocd app sync cluster1-mongo
$ argocd app sync cluster2-mongo
$ argocd app sync cluster3-mongo
- 运行命令,查看三个ArgoCD app的状态。直到它们变为“Healthy”即完成。
$ argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
cluster1-mongo https://api.cluster-shanghai-fba4.shanghai-fba4.example.opentlc.com:6443 mongo default OutOfSync Healthy Auto <none> https://github.com/liuxiaoyu-git/federation-dev.git labs/lab-6-assets/overlays/cluster1 master
cluster2-mongo https://api.cluster-beijing-7536.beijing-7536.example.opentlc.com:6443 mongo default OutOfSync Healthy Auto <none> https://github.com/liuxiaoyu-git/federation-dev.git labs/lab-6-assets/overlays/cluster2 master
cluster3-mongo https://api.cluster-shanghai-e90b.shanghai-e90b.sandbox1824.opentlc.com:6443 mongo
- 查看三个OpenShift集群中的Deployment和Route对象都正常。
$ for cluster in cluster1 cluster2 cluster3; do oc --context $cluster -n mongo get deployment mongo; done
$ for cluster in cluster1 cluster2 cluster3; do oc --context $cluster -n mongo get deployment mongo; done
配置MongoDB的ReplicaSet
- 执行命令通过给pod打标签,将cluster1设为ReplicaSet的primary replica角色。
$ MONGO_POD=$(oc --context=cluster1 -n mongo get pod --selector="name=mongo" --output=jsonpath='{.items..metadata.name}')
$ oc --context=cluster1 -n mongo label pod $MONGO_POD replicaset=primary
- 执行命令(该命令在federation-dev/labs/utility目录中),查看MongoDB ReplicaSet的状态。
$ wait-for-mongo-replicaset cluster1 mongo 3
Checking if MongoDB Replicaset from namespace mongo on cluster cluster1 is configured
。。。
MongoDB ReplicaSet Status:
--------------------------
Primary Member:
"mongo-cluster1.apps.cluster-shanghai-fba4.shanghai-fba4.example.opentlc.com:443"
Secondary Members:
"mongo-cluster2.apps.cluster-beijing-7536.beijing-7536.example.opentlc.com:443"
"mongo-cluster3.apps.cluster-shanghai-e90b.shanghai-e90b.sandbox1824.opentlc.com:443"
**注意**:在操作的时候如果出现作为Primary成员的cluster1的状态如果不正常(后台的MongoCD Pod出现CrashLoopBackOff),可以尝试先执行以下命令删除cluster1的“replicaset=primary”的标签,然后再修改本节(1)步骤的命令(将cluster2或cluste在r3设为Primary成员),最后在执行修改后的命令。一旦在此步骤更换了replicaset的primary,后面所有和MongoDB
$ oc --context=cluster1 -n mongo label pod $MONGO_POD replicaset-
- 执行命令,查看MongoDB的Replicaset。确认其中三个member的"name"、"stateStr"和"syncingTo"字段内容,确认三个成员的相互关系是"stateStr"为"SECONDARY"的成员其"syncingTo"指向的是"stateStr"为"PRIMARY"的成员。
$ MONGO_POD=$(oc --context=cluster1 -n mongo get pod --selector="name=mongo" --output=jsonpath='{.items..metadata.name}')
$ oc --context=cluster1 -n mongo exec $MONGO_POD \-- bash -c 'mongo --norc --quiet --username=admin --password=$MONGODB_ADMIN_PASSWORD --host localhost admin --tls --tlsCAFile /opt/mongo-ssl/ca.pem --eval "rs.status()"'
此时在三个OpenShift集群中就配置好了三个具备主从关系的MongoDB集群。
OpenShift 4 之 GitOps(6)用ArgoCD部署MongoDB主从集群相关推荐
- OpenShift 4 之 GitOps(7)用ArgoCD部署Pacman应用集群
<OpenShift 4.x HOL教程汇总> 文章目录 Pacman应用部署架构 部署HAProxy 部署Pacman应用 本文是<OpenShift 4 之 GitOps(6)用 ...
- k8s(七)—statefullset部署mysql主从集群
1 使用statefullset部署mysql主从集群 mysql-0是master mysql-1和mysql-2是两个备份 当mysql写的时候,找headless service中的mysql- ...
- CentOS7.9上部署OpenShift3.11集群
CentOS7.9上部署OpenShift3.11集群 OCP官网文档:https://docs.openshift.com/container-platform/3.11/welcome/index ...
- kubernetes-1.11.0集群部署之master集群 (二)
kubernetes-1.11.0集群部署之master集群 (二) Master master 的组件有以下: 1. API ServerApi server提供HTTP/HTTPS RESTful ...
- k8s redis集群_基于K8S部署redis哨兵集群
本 文 主 要 内 容 什么是Kubernetes分布式容器管理平台 PaaS平台redis-sentinel集群架构简介 PaaS平台部署redis哨兵集群 redis-sentinel容器测试及验 ...
- 使用Minikube部署本地Kubernetes集群(二十九)
前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...
- 如何部署一个Kubernetes集群
来源 | 无敌码农 责编 | 寇雪芹 头图 | 下载于视觉中国 在上一篇文章<Kubernetes和Docker的关系是什么?>中,和大家分享了关于Kubernetes的基本系统架构以及关 ...
- 如何轻松地将可访问LAN的Pod部署到Kubernetes集群上
撰者 | Jack Wallen 译者 | Katie,责编 | Jerry 来源 | CSDN云计算 封图 | CSDN 下载自视觉中国 想要在Kubernetes集群上部署可访问LAN的Pod来达 ...
- 吊炸天!一行命令快速部署大规模K8S集群!!!
吊炸天!一行命令快速部署大规模K8S集群!!! 先决条件 请事先准备好几台服务器(测试环境虚拟机即可) 请事先设置好相同的root密码(方便同时操作多服务器) 请事先在Linux安装好docker 请 ...
最新文章
- 关于开源网管软件选型的几点思考
- android 应用变量,Android全局应用变量的使用
- 皮一皮:打完疫苗千万别睡太死...
- java 向量空间模型_VSM向量空间模型对文本的分类以及简单实现
- 邵阳学院学校云认证码_湖南所有五年制大专学校
- 机器学习中的度量—— 向量距离
- [数据库] Navicat for Oracle基本用法图文介绍
- 分布式和微服务的区别
- 解决方案:System.InvalidOperationException: 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。
- jmeter-Java关于MD5加密方法 以及16位32位互转
- VBscript读取excel表,中数据导入到SQLserver数据库里面
- Windows/Linux双系统安装(附:硬盘知识)
- ant压缩html,ant+yuicompressor压缩js/css
- 野火stm32资源下载(视频,手册等)
- 英雄联盟一直连接服务器win10,浅析win10英雄联盟连接不上服务器的解决教程
- 企业发展滞缓,还不是因为踩了这四个数据大坑!
- U盘容量变小实用解决方案
- vue自定义组件,ElementUi表单校验v-model不能即时生效的解决方法
- 12312312312313
- 安卓开发:WebView无法播放微信视频
热门文章
- linux diff 远程文件,登录diff命令,以单独的文件输出在linux
- 阶乘之和计算_浅谈积分计算的技巧
- 话唠黄金机器人_用了接吻教学机器人以后......哈哈哈哈不能我一个人瞎!
- python中if的输入格式_Python基础之输出格式和If判断
- python绘制折线图先对数据进行处理_python气象数据分析并绘制折线图-女性时尚流行美容健康娱乐mv-ida网...
- 计算机系毕业生自我评价,计算机系应届毕业生自我评价范文
- android 布局收缩成球,Android使用Material Design实现悬浮按钮
- python类为什么要初始化_python3类对象需要在init中初始化吗?
- 纯文字海报如何排版更引人注目?
- bytebuf池_PooledByteBuf内存池-------这个我现在不太懂