Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes OpenShift和hostnetwork=true_Kubernetes_Openshift_Redhat - Fatal编程技术网

Kubernetes OpenShift和hostnetwork=true

Kubernetes OpenShift和hostnetwork=true,kubernetes,openshift,redhat,Kubernetes,Openshift,Redhat,我部署了两个POD-s,hostnetwork设置为true。当POD-s部署在同一OpenShfit节点上时,一切正常,因为它们可以使用节点IP发现彼此 当POD-s部署在不同的OpenShift节点上时,它们无法相互发现,如果我想使用节点IP将一个POD指向另一个POD,则无法获得到主机的路由。如何解决此问题?如果您希望两个容器共享同一台物理机器,并利用环回进行快速通信,那么最好将它们一起定义为具有两个容器的单个Pod 如果这两个容器要漂浮在一个更大的集群上并且更松散地耦合,那么我建议利用K

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


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

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

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

服务记录在,并与内部DNS服务一起(如果实施-在Kubernetes 1.4和更高版本中常见),它们提供了一种方法,让Kubernetes管理事物所在的位置,以
.svc.cluster.local
的形式更新内部DNS条目。例如,如果您在默认名称空间中设置了一个名为“backend”的Pod,那么另一个Pod可以将其引用为
backend.default.svc.cluster.local
。有关此文件DNS部分的Kubernetes文档可在


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

如果您必须绝对使用hostnetwork,您应该创建路由器,然后使用这些路由器在POD之间进行通信。您可以在opeshift中创建基于ha代理的路由器,参考这里--

uswitch/kiam()服务是一个很好的用例示例

它有一个在所有工作节点的主机网络上运行的代理进程,因为它修改了防火墙规则以拦截(从主机上运行的容器)到AWS API的API请求

它还有一个在主机网络上运行的服务器进程来访问AWS api,因为AWS api位于仅对主机网络可用的子网上

最后。。。代理使用GRPC与服务器对话,GRPC直接连接到查找kiam服务器时返回的其中一个IP地址

因此,您在节点A的主机网络上运行代理部署的吊舱,试图连接到节点B的主机网络上运行的kiam服务器。。。。这根本不起作用


此外,这是一项私人服务。。。它不应该从网络外部可用。

为什么首先需要将hostnetwork设置为true?默认情况下,同一项目中的任何播客都应该能够与同一项目中的任何其他播客通话,即使是在不同的节点上。这是因为每个pod都有自己的IP地址,访问将被设置为允许连接。您确实不应该使用节点IP作为其他pod的寻址机制。使用pod的名称作为主机名,或者更好地使用服务名称作为主机名,并信任内部路由将其发送到该服务的其中一个pod。照此看来,无论如何都不需要使用IPs,因为有一个内部DNS可以为您将pod名称和服务名称映射到IPs。@Graham Dumpleton我需要使用hostnetwork进行REDIS群集设置。REDIS需要它才能在Docker上工作。这就是他们在官方REDIS集群文档中所说的。文档的链接是什么?在普通docker中运行东西将不同于在OpenShift/Kubernetes下运行。如果已知端口分配,则不需要启用主机网络。如果在Google上搜索“redis cluster kubernetes”,您还将找到各种示例。我建议您查看与在Kubernetes中运行它相关的内容,而不是根据在普通docker主机服务中的运行方式来尝试解决它。通常,docker官方镜像不是按照最佳实践构建的,也不会在具有更严格安全性的容器环境中运行。不幸的是,正如我在上面的评论中所解释的,我必须使用主机网络。这就是我在OpenShift上部署的应用程序的局限性。我不知道该应用程序是什么(显然),但如果它要求hostnetwork=true,那么在Kubernetes/OpenShift中部署可能是一个糟糕的选择。它们支持将两个容器紧密耦合(网络和存储方面)的抽象与“每个吊舱N个容器”的概念相结合,但除此之外,还希望网络的抽象程度比此应用程序所允许的更高。