OpenShift 4 之 GitOps(6)用ArgoCD部署MongoDB主從集羣

部署架構

本文介紹如何利用ArgoCD在三個OpenShift集羣上部署一套MongoDB的主從集羣。下一章節再在部署三個OpenShift集羣上部署應用訪問MongoDB集羣。在這裏插入圖片描述

部署MongoDB主從集羣

準備操作環境

  1. 操作環境以Linux爲例。
  2. 正常安裝ArgoCD服務器和客戶端。
  3. 將https://github.com/openshift/federation-dev.git複製一份到自己的github賬號,然後再clone一份到本地。最後將本地的federation-dev/labs/utility/目錄中的文件全部賦予可執行權限,並將該目錄放到PATH環境變量中。
  4. 參照《OpenShift 4 之 GitOps(1)安裝ArgoCD環境》。
  5. 在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訪問,需要生成證書和祕鑰。

  1. 進入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
  1. 生成CA文件。
$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  1. 設置所需環境變量,最後創建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
  1. 合併祕鑰和證書文件。
$ cat mongodb-key.pem mongodb.pem > mongo.pem

更新被部署的YAML文件

在Gitops中所有部署對象都是YAML文件,所以在通過ArgoCD執行YAML之前,我們還需要將和操作環境相關的配置更新到YAML中。

  1. 修改本地的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
  1. 修改本地的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
  1. 修改本地的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
  1. 將mongo-secret.yaml、mongo-rs-deployment.yaml、mongo-route.yaml更新至自己的github。

在三個OpenShift集羣中部署MongoDB

  1. 將自己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 
  1. 運行命令,查看三個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  
  1. 查看三個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

  1. 執行命令通過給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
  1. 執行命令(該命令在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-
  1. 執行命令,查看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集羣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章