我按照以下链接中的指南操作: http://blog.kubernetes.io/2017/01/running-mongodb-on-kubernetes-with-statefulsets.html
并使用StatefulSets在Kubernetes上设置mongo DB副本集。到目前为止一切顺利,但是如何在群集外公开静态主机名,以便我可以从Google实例中访问它们?
如果我使用节点的IP,它将正常工作,但这些可以随时更改(当pod故障并使用不同的IP等重新启动时)...
提前致谢!
答案 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的成熟。