使用群集外的StatefulSets在Kubernetes上公开MongoDB

时间:2017-01-31 23:49:37

标签: mongodb kubernetes google-cloud-platform

我按照以下链接中的指南操作: http://blog.kubernetes.io/2017/01/running-mongodb-on-kubernetes-with-statefulsets.html

并使用StatefulSets在Kubernetes上设置mongo DB副本集。到目前为止一切顺利,但是如何在群集外公开静态主机名,以便我可以从Google实例中访问它们?

如果我使用节点的IP,它将正常工作,但这些可以随时更改(当pod故障并使用不同的IP等重新启动时)...

提前致谢!

3 个答案:

答案 0 :(得分:4)

似乎答案出现在StatefulSet Basics文档部分Using Stable Network Identities中:

  

Pods的序号,主机名,SRV记录和A记录名称都有   没有改变,但与Pod相关的IP地址可能有   改变。在本教程使用的集群中,他们有。这就是为什么   重要的是不要将其他应用程序配置为连接到Pod   在IP地址的StatefulSet中。

     

如果您需要查找并连接到活动成员   StatefulSet,你应该查询无头服务的CNAME   的 (nginx.default.svc.cluster.local) 即可。与之相关的SRV记录   CNAME将仅包含正在运行的StatefulSet中的Pod   并准备好了。

     

如果您的应用程序已经实现了测试的连接逻辑   活跃和准备就绪,您可以使用Pod ( web-> 0.nginx.default.svc.cluster.local, web-1.nginx.default.svc.cluster.local) 的SRV记录,   因为他们很稳定,而你的   应用程序将能够发现Pods的地址   过渡到跑步和准备。

答案 1 :(得分:1)

我强烈建议您浏览一下服务文档,以确保您熟悉所发生的事情:

https://kubernetes.io/docs/concepts/services-networking/service/

  

Kubernetes服务是一个抽象,它定义了一组逻辑Pod和一个访问它们的策略 - 有时称为微服务。

考虑到这一点以及您使用的指南,请注意以下事项:

  

你可以说这是一个无头服务,因为clusterIP被设置为“无”。除此之外,它看起来与任何普通的Kubernetes服务完全相同。

所以您创建的是无头服务(无负载均衡器或暴露的IP)

为无头服务提供的配置代替

    apiVersion: v1
    kind: Service
    metadata:
      name: mongo
      labels:
        name: mongo
    spec:
      ports:
      - port: 27017
        targetPort: 27017
      clusterIP: None
      selector:
        role: mongo

你真正想要的是:

    apiVersion: v1
    kind: Service
    metadata:
      name: mongo
      labels:
        name: mongo
    spec:
      ports:
      - protocol: TCP
        port: 27017
        targetPort: 27017
      selector:
        role: mongo

非常微妙,但您会注意到clusterIP属性不再存在。

我还喜欢指定协议,以确保完整性,即使TCP是默认值。

答案 2 :(得分:-1)

您需要公开服务(svc)。根据定义,pod如你所说具有不同的IP。

https://kubernetes.io/docs/user-guide/petset/中提到的示例中,您会注意到服务定义。

foo.default.svc.cluster.local
         |service|
         /       \
| pod-asdf |    | pod-zxcv |

这是您需要专注的。一旦与DNS绑定的服务将为您提供稳定的查找。 顺便说一句,StatefulSets是早期Pet Sets的成熟。