我想在Kubernetes上设置一个Mongo副本集.我想有三个复制品.这意味着我需要启动3个实例.
我应该开始三个pod,每个都有Mongo,并使用该服务指向主要的?或者我应该以某种方式使用复制控制器?
这个答案已经过时了.我在这里使用更新的方法编写了详细的分步教程.我强烈建议您阅读所有内容.
简而言之,您运行一个sidecar应用程序为您配置副本集,并为每个实例使用一个服务或ping K8s API以获取pod IP地址.
示例:这仅适用于Google Cloud.您需要对其他平台进行修改,尤其是在卷周围:
请按照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
(这样做三次)
通过服务连接到副本集.
mongodb://mongo-1,mongo-2,mongo-3:27017/dbname_?
您还可以使用原始pod IP地址,而不是为每个pod创建服务
使用此https://github.com/thesandlord/kubernetes-pod-ip-finder.git
通常,要设置一组群集节点(如mongo和副本集),您可以创建一个Service
跟踪服务名称下的pod(例如,创建带有标记的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}'
将返回群集中mongodb实例的IP和主机名.
现在您知道群集中的谁,您可以在init脚本中创建副本集.显然,这意味着您需要启动第Service
一个,您的启动脚本需要等待所有节点启动并向服务注册,然后您可以继续.如果您使用一个图像,使用一个脚本,它将在每个节点上运行n,因此您需要检查副本集是否已存在或处理错误.要注册的第一个pod应该完成工作.另一种选择是将所有节点作为单个节点运行,然后运行一个单独的引导脚本来创建副本集.
最后,然后调用mongodb集群,您需要确保指定具有副本集名称的URL作为选项:
mongodb://mongodb:27017/database?replicaSet=replicaSetName
由于您不知道主服务器的IP,您可以通过服务调用它,mongodb
这会将请求负载平衡到其中一个节点,如果您没有指定副本集名称,最终会出现连接错误因为只有主人才能得到写请求.
显然这不是一步一步的教程,但我希望能让你开始.