我已经部署了两个POD-s,hostnetwork设置为true。当POD-s部署在同一个OpenShfit节点上时,一切正常,因为它们可以使用节点IP发现彼此。OpenShift和hostnetwork = true
当POD-s部署在不同的OpenShift节点上时,它们不能互相发现,如果我想使用节点IP将一个POD指向另一个POD,我就无法访问主机。如何解决这个问题?
我已经部署了两个POD-s,hostnetwork设置为true。当POD-s部署在同一个OpenShfit节点上时,一切正常,因为它们可以使用节点IP发现彼此。OpenShift和hostnetwork = true
当POD-s部署在不同的OpenShift节点上时,它们不能互相发现,如果我想使用节点IP将一个POD指向另一个POD,我就无法访问主机。如何解决这个问题?
如果您希望两个容器共享相同的物理机器并利用回送进行快速通信,那么最好将它们定义为具有两个容器的单个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)管理网络。
如果您必须绝对使用hostnetwork,则应该创建路由器,然后使用这些路由器在pod之间进行通信。您可以在opeshift中创建ha基于代理的路由器,请参考此处 - https://docs.openshift.com/enterprise/3.0/install_config/install/deploy_router.html
为什么您需要首先将hostnetwork设置为true?即使在不同的节点上,同一项目中的任何窗格都应该能够与同一项目中的任何其他窗格进行交谈。这是因为每个吊舱都有自己的IP地址,访问将被设置为允许连接。 –
您真的不应该使用节点IP作为其他Pod的寻址机制。使用pod的名称作为主机名,或者更好地使用服务名称作为主机名,并相信内部路由将其发送到该服务的其中一个窗格。 IOW,无论如何都不需要使用IP,因为有一个内部DNS将pod名称和服务名称映射到您的IP。 –
@Graham Dumpleton我需要使用hostnetwork进行REDIS集群设置。 REDIS需要它才能在Docker上工作。那就是他们在官方REDIS集群文档中说的。 – dplesa