2017-10-13 140 views
5

我已经部署了两个POD-s,hostnetwork设置为true。当POD-s部署在同一个OpenShfit节点上时,一切正常,因为它们可以使用节点IP发现彼此。OpenShift和hostnetwork = true

当POD-s部署在不同的OpenShift节点上时,它们不能互相发现,如果我想使用节点IP将一个POD指向另一个POD,我就无法访问主机。如何解决这个问题?

+0

为什么您需要首先将hostnetwork设置为true?即使在不同的节点上,同一项目中的任何窗格都应该能够与同一项目中的任何其他窗格进行交谈。这是因为每个吊舱都有自己的IP地址,访问将被设置为允许连接。 –

+0

您真的不应该使用节点IP作为其他Pod的寻址机制。使用pod的名称作为主机名,或者更好地使用服务名称作为主机名,并相信内部路由将其发送到该服务的其中一个窗格。 IOW,无论如何都不需要使用IP,因为有一个内部DNS将pod名称和服务名称映射到您的IP。 –

+0

@Graham Dumpleton我需要使用hostnetwork进行REDIS集群设置。 REDIS需要它才能在Docker上工作。那就是他们在官方REDIS集群文档中说的。 – dplesa

回答

0

如果您希望两个容器共享相同的物理机器并利用回送进行快速通信,那么最好将它们定义为具有两个容器的单个Pod。

如果两个容器是为了漂浮在一个更大的集群上并且更松散地耦合,那么我建议利用Kubernetes中的Service构造(在OpenShift下)并将其用于适当的发现。

服务在https://kubernetes.io/docs/concepts/services-networking/service/记录,而且随着内部DNS服务(如果实现的话 - 常见于Kubernetes 1.4及更高版本),他们提供给我们Kubernetes管理那里的东西是一种手段,更新中的<servicename>.<namespace>.svc.cluster.local形式的内部DNS条目。例如,如果您在默认名称空间中设置了名为“backend”的服务的Pod,另一个Pod可以将其引用为backend.default.svc.cluster.local。 Kubernetes关于DNS部分的文档可以在https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

这也避免了“hostnetwork = true”的复杂性,并让OpenShift(或特定的Kubernetes)管理网络。

+0

不幸的是,正如我在上面的评论中所解释的,我必须使用主机网络。这是我在OpenShift上部署的应用程序的限制。 – dplesa

+0

我不知道应用程序是什么(显然),但是如果它需要hostnetwork = true,那么在Kubernetes/OpenShift中部署可能是一个糟糕的选择。他们支持一个抽象,用两个容器紧密耦合(网络和存储智能)与“每个Pod的N容器”概念,但除此之外,期望网络被抽象得比应用程序允许的更多。 – heckj