[英]How do you set-up Mongo replica set on Kubernetes?
我想在Kubernetes上設置一個Mongo副本集。 我想有三個復制品。 這意味着我需要啟動3個實例。
我應該開始三個pod,每個都有Mongo,並使用該服務指向主要的? 或者我應該以某種方式使用復制控制器?
這個答案已經過時了。 我在這里使用更新的方法編寫了詳細的分步教程。 我強烈建議您閱讀所有內容。
簡而言之,您運行一個sidecar應用程序為您配置副本集,並為每個實例使用一個服務或ping K8s API以獲取pod IP地址。
示例:這僅適用於Google Cloud。 您需要對其他平台進行修改,尤其是在卷周圍:
git clone https://github.com/leportlabs/mongo-k8s-sidecar.git
cd mongo-k8s-sidecar/example/
make add-replica ENV=GoogleCloudPlatform
(這樣做三次) mongodb://mongo-1,mongo-2,mongo-3:27017/dbname_?
通常情況下,建立一個集群節點集像復制品套蒙戈,你將創建一個Service
跟蹤的服務名下的吊艙(所以例如,創建一個標簽的MongoDB的復制控制器mongodb
和Service
跟蹤的情況下,然后可以為其成員查詢服務(使用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一起使用的更新方法,請參閱:
有關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.