簡體   English   中英

你如何在Kubernetes上設置Mongo副本?

[英]How do you set-up Mongo replica set on Kubernetes?

我想在Kubernetes上設置一個Mongo副本集。 我想有三個復制品。 這意味着我需要啟動3個實例。

我應該開始三個pod,每個都有Mongo,並使用該服務指向主要的? 或者我應該以某種方式使用復制控制器?

這個答案已經過時了。 在這里使用更新的方法編寫了詳細的分步教程。 我強烈建議您閱讀所有內容。

簡而言之,您運行一個sidecar應用程序為您配置副本集,並為每個實例使用一個服務或ping K8s API以獲取pod IP地址。

示例:這僅適用於Google Cloud。 您需要對其他平台進行修改,尤其是在卷周圍:

  1. 請按照https://github.com/leportlabs/mongo-k8s-sidecar.git中的示例進行操作
    • git clone https://github.com/leportlabs/mongo-k8s-sidecar.git
    • cd mongo-k8s-sidecar/example/
    • make add-replica ENV=GoogleCloudPlatform (這樣做三次)
  2. 通過服務連接到副本集。
    • mongodb://mongo-1,mongo-2,mongo-3:27017/dbname_?
  3. 您還可以使用原始pod IP地址,而不是為每個pod創建服務

通常情況下,建立一個集群節點集像復制品套蒙戈,你將創建一個Service跟蹤的服務名下的吊艙(所以例如,創建一個標簽的MongoDB的復制控制器mongodbService跟蹤的情況下,然后可以為其成員查詢服務(使用API​​服務器,您可以查找節點

curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt https://kubernetes/api/v1/namespaces/default/endpoints/mongodb

其中mongodb是服務名稱的選擇器。

返回帶有一堆字段的JSON對象,所以很容易解析這些是使用jq https://stedolan.github.io/jq/

將curl命令傳遞給jq查詢

jq '.subsets[].addresses[]' | jq '{ip: .ip, host:.targetRef.name}' jq '.subsets[].addresses[]' | jq '{ip: .ip, host:.targetRef.name}'將返回群集中mongodb實例的IP和主機名。

現在您知道群集中的誰,您可以在init腳本中創建副本集。 顯然,這意味着您需要首先啟動Service ,您的啟動腳本需要等待所有節點啟動並注冊服務,然后您可以繼續。 如果您使用一個圖像,使用一個腳本,它將在每個節點上運行n,因此您需要檢查副本集是否已存在或處理錯誤。 要注冊的第一個pod應該完成工作。 另一種選擇是將所有節點作為單個節點運行,然后運行一個單獨的引導腳本來創建副本集。

最后,然后調用mongodb集群,您需要確保指定具有副本集名稱的URL作為選項:

mongodb://mongodb:27017/database?replicaSet=replicaSetName

由於您不知道主服務器的IP,您可以通過服務mongodb調用它,它會將請求負載平衡到其中一個節點,如果您沒有指定副本集名稱,您將最終得到連接錯誤,因為只有主設備可以獲得寫請求。

顯然這不是一步一步的教程,但我希望能讓你開始。

這是我目前正在運行的示例。

apiVersion: v1
kind: Service
metadata:
  labels:
    name: mongo
  name: mongo-svc1
spec:
  ports:
    - port: 27017
      targetPort: 27017
  selector:
    type: mongo-rs-A
---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: mongo
  name: mongo-svc2
spec:
  ports:
    - port: 27017
      targetPort: 27017
  selector:
    type: mongo-rs-B
---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: mongo
  name: mongo-svc3
spec:
  ports:
    - port: 27017
      targetPort: 27017
  selector:
    type: mongo-rs-C
---

apiVersion: v1
kind: ReplicationController

metadata:
  name: mongo

spec:
  replicas: 1
  selector:
    name: mongo-nodea
    role: mongo
    environment: test

  template:
    metadata:
      labels:
        name: mongo-nodea
        role: mongo
        environment: test
        type: mongo-rs-A
    spec:
      containers:
        - name: mongo-nodea
          image: mongo
          command:
            - mongod
            - "--replSet"
            - rsABC
            - "--smallfiles"
            - "--noprealloc"
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mongo-persistent-storage
              mountPath: /data/db
      volumes:
        - name: mongo-persistent-storage
          flocker:
            datasetName: FlockerMongoVolSetA
---
apiVersion: v1
kind: ReplicationController

metadata:
  name: mongo-1

spec:
  replicas: 1
  selector:
    name: mongo-nodeb
    role: mongo
    environment: test

  template:
    metadata:
      labels:
        name: mongo-nodeb
        role: mongo
        environment: test
        type: mongo-rs-B
    spec:
      containers:
        - name: mongo-nodeb
          image: mongo
          command:
            - mongod
            - "--replSet"
            - rsABC
            - "--smallfiles"
            - "--noprealloc"
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mongo-persistent-storage
              mountPath: /data/db
      volumes:
        - name: mongo-persistent-storage
          flocker:
            datasetName: FlockerMongoVolSetB
---
apiVersion: v1
kind: ReplicationController

metadata:
  name: mongo-2

spec:
  replicas: 1
  selector:
    name: mongo-nodec
    role: mongo
    environment: test

  template:
    metadata:
      labels:
        name: mongo-nodec
        role: mongo
        environment: test
        type: mongo-rs-C
    spec:
      containers:
        - name: mongo-nodec
          image: mongo
          command:
            - mongod
            - "--replSet"
            - rsABC
            - "--smallfiles"
            - "--noprealloc"
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mongo-persistent-storage
              mountPath: /data/db
      volumes:
        - name: mongo-persistent-storage
          flocker:
            datasetName: FlockerMongoVolSetC


kubectl --kubeconfig=clusters/k8s-mongo/kubeconfig get po,svc -L type,role,name
NAME            READY     STATUS    RESTARTS   AGE       TYPE         ROLE      NAME
mongo-1-39nuw   1/1       Running   0          1m        mongo-rs-B   mongo     mongo-nodeb
mongo-2-4tgho   1/1       Running   0          1m        mongo-rs-C   mongo     mongo-nodec
mongo-rk9n8     1/1       Running   0          1m        mongo-rs-A   mongo     mongo-nodea
NAME         CLUSTER_IP   EXTERNAL_IP   PORT(S)     SELECTOR          AGE       TYPE      ROLE      NAME
kubernetes   10.3.0.1     <none>        443/TCP     <none>            21h       <none>    <none>    <none>
mongo-svc1   10.3.0.28    <none>        27017/TCP   type=mongo-rs-A   1m        <none>    <none>    mongo
mongo-svc2   10.3.0.56    <none>        27017/TCP   type=mongo-rs-B   1m        <none>    <none>    mongo
mongo-svc3   10.3.0.47    <none>        27017/TCP   type=mongo-rs-C   1m        <none>    <none>    mongo

在主節點上,我將進入mongo shell

rs.status()rs.initiate()rs.add(“10.3.0.56:27017”)

我目前遇到這個問題,我遇到了兩個節點沒有主節點的輔助和啟動狀態。

rs.status()
{
    "set" : "rsABC",
    "date" : ISODate("2016-01-21T22:51:33.216Z"),
    "myState" : 2,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "mongo-rk9n8:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 242,
            "optime" : {
                "ts" : Timestamp(1453416638, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2016-01-21T22:50:38Z"),
            "infoMessage" : "could not find member to sync from",
            "configVersion" : 2,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "10.3.0.56:27017",
            "health" : 1,
            "state" : 0,
            "stateStr" : "STARTUP",
            "uptime" : 45,
            "optime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2016-01-21T22:51:28.639Z"),
            "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
            "pingMs" : NumberLong(40),
            "configVersion" : -2
        }
    ],
    "ok" : 1
}

請看下面的鏈接。 在kubernetes中,創建服務地址,然后控制器和replicaset啟動可以很容易地生成.... https://www.mongodb.com/blog/post/running-mongodb-as-a-microservice-with-docker-和kubernetes

@Stephen Nguyen

我只是復制你的案例並為它創建名稱空間測試(我相應地更改你的yaml文件),並通過以下方式初始化我的mongo:

rs.initiate({
     "_id" : "rsABC",
     "members" : [
          {
               "_id" : 0,
               "host" : "mongo-svc1.test:27017",
               "priority" : 10
          },
          {
               "_id" : 1,
               "host" : "mongo-svc2.test:27017",
               "priority" : 9
          },
          {
               "_id" : 2,
               "host" : "mongo-svc3.test:27017",
                "arbiterOnly" : true
          }
     ]
})

它似乎確實有效:

> rs.status()
{
        "set" : "rsABC",
        "date" : ISODate("2016-05-10T07:45:25.975Z"),
        "myState" : 2,
        "term" : NumberLong(2),
        "syncingTo" : "mongo-svc1.test:27017",
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "mongo-svc1.test:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 657,
                        "optime" : {
                                "ts" : Timestamp(1462865715, 2),
                                "t" : NumberLong(2)
                        },
                        "optimeDate" : ISODate("2016-05-10T07:35:15Z"),
                        "lastHeartbeat" : ISODate("2016-05-10T07:45:25.551Z"),
                        "lastHeartbeatRecv" : ISODate("2016-05-10T07:45:25.388Z"),
                        "pingMs" : NumberLong(0),
                        "electionTime" : Timestamp(1462865715, 1),
                        "electionDate" : ISODate("2016-05-10T07:35:15Z"),
                        "configVersion" : 1
                },
                {
                        "_id" : 1,
                        "name" : "mongo-svc2.test:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 1171,
                        "optime" : {
                                "ts" : Timestamp(1462865715, 2),
                                "t" : NumberLong(2)
                        },
                        "optimeDate" : ISODate("2016-05-10T07:35:15Z"),
                        "syncingTo" : "mongo-svc1.test:27017",
                        "configVersion" : 1,
                        "self" : true
                },
                {
                        "_id" : 2,
                        "name" : "mongo-svc3.test:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 657,
                        "lastHeartbeat" : ISODate("2016-05-10T07:45:25.549Z"),
                        "lastHeartbeatRecv" : ISODate("2016-05-10T07:45:23.969Z"),
                        "pingMs" : NumberLong(0),
                        "configVersion" : 1
                }
        ],
        "ok" : 1
}

我按服務名稱添加mongo節點。

就像單挑一樣。 不要在生產中使用mongo-k8s-sidecar方法,因為它有潛在的危險后果。 有關將MongoDB與k8s StatefulSets一起使用的更新方法,請參閱:

  1. 將MongoDB副本集部署為Kubernetes StatefulSet
  2. 在Kubernetes上配置MongoDB的一些關鍵生產設置
  3. 在Kubernetes上使用企業版的MongoDB
  4. 使用Kubernetes StatefulSets部署MongoDB Sharded Cluster

有關MongoDB和Kubernetes的更多信息,請訪問: http ://k8smongodb.net/

我正在使用它作為解決方案。 尚未准備就緒。

設置MongoDB復制

獲取所有MongoDB pod IP kubectl describe pod <PODNAME> | grep IP | sed -E 's/IP:[[:space:]]+//' kubectl describe pod <PODNAME> | grep IP | sed -E 's/IP:[[:space:]]+//'

和...

運行kubectl exec -i <POD_1_NAME> mongo

和......

rs.initiate({ 
     "_id" : "cloudboost", 
     "version":1,
     "members" : [ 
          {
               "_id" : 0,
               "host" : "<POD_1_IP>:27017",
               "priority" : 10
          },
          {
               "_id" : 1,
               "host" : "<POD_2_IP>:27017",
               "priority" : 9
          },
          {
               "_id" : 2,
               "host" : "<POD_3_IP>:27017",
               "arbiterOnly" : true
          }
     ]
});

例如 :

rs.initiate({  
     "_id" : "cloudboost",
     "version":1,
     "members" : [ 
          {
               "_id" : 0,
               "host" : "10.244.1.5:27017",
               "priority" : 10
          },
          {
               "_id" : 1,
               "host" : "10.244.2.6:27017",
               "priority" : 9
          },
          {
               "_id" : 2,
               "host" : "10.244.3.5:27017",
               "arbiterOnly" : true
          }
     ]
}); 

請注意:您的群集的IP可能不同。

TODO:創建無頭服務以自動發現節點並初始化復制集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM