【问题标题】:OpenShift and hostnetwork=trueOpenShift 和 hostnetwork=true
【发布时间】:2017-10-13 21:17:01
【问题描述】:

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

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

【问题讨论】:

  • 为什么首先需要将hostnetwork设置为true?默认情况下,同一项目中的任何 pod 都应该能够与同一项目中的任何其他 pod 通信,即使在不同的节点上也是如此。这是因为每个 pod 都有自己的 IP 地址,并且会设置访问权限以允许连接。
  • 您真的不应该使用节点 IP 作为其他 pod 的寻址机制。使用 pod 的名称作为主机名,或者更好地使用服务名称作为主机名,并信任内部路由将其发送到该服务的其中一个 pod。 IOW,无论如何都不需要使用 IP,因为有一个内部 DNS 可以为您将 pod 名称和服务名称映射到 IP。
  • @Graham Dumpleton 我需要使用主机网络进行 REDIS 集群设置。 REDIS 需要它才能在 Docker 上工作。这就是他们在官方 REDIS 集群文档中所说的内容。
  • 什么是文档链接?在普通 docker 中运行的东西将不同于在 OpenShift/Kubernetes 下运行。如果端口分配已知,则不需要启用主机网络。
  • 如果您在 Google 上搜索“redis cluster kubernetes”,您还会找到各种示例。我建议查看与在 Kubernetes 中运行它相关的东西,而不是尝试根据在普通 docker 主机服务中的运行方式来解决它。通常,官方的 docker 镜像不是按照最佳实践构建的,并且不会在具有更严格安全性的容器环境中运行。

标签: kubernetes openshift redhat


【解决方案1】:

uswitch/kiam (https://github.com/uswitch/kiam) 服务是一个很好的用例示例。

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

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

最后...代理使用 GRPC 与服务器对话,该服务器直接连接到查找 kiam-server 时返回的 IP 地址之一。

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

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

【讨论】:

    【解决方案2】:

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

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

    服务记录在https://kubernetes.io/docs/concepts/services-networking/service/,以及内部 DNS 服务(如果已实现 - 在 Kubernetes 1.4 及更高版本中很常见),它们提供了一种让 Kubernetes 管理事物所在位置的方法,以以下形式更新内部 DNS 条目<servicename>.<namespace>.svc.cluster.local。例如,如果您在默认命名空间中设置了一个名为“backend”的服务的 Pod,则另一个 Pod 可以将其引用为 backend.default.svc.cluster.local。关于这部分 DNS 部分的 Kubernetes 文档可在 https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

    获得

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

    【讨论】:

    • 不幸的是,正如我在上面的 cmets 中解释的那样,我必须使用主机网络。这是我在 OpenShift 上部署的应用程序的限制。
    • 我不知道应用程序是什么(显然),但如果它需要 hostnetwork=true,那么在 Kubernetes/OpenShift 中部署可能是一个糟糕的选择。他们支持一种抽象,以保持两个容器紧密耦合(网络和存储方面)与“每个 Pod 的 N 个容器”概念,但除此之外,预计网络的抽象程度会超过此应用程序可能允许的程度。
    【解决方案3】:

    如果您必须绝对使用主机网络,您应该创建路由器,然后使用这些路由器在 pod 之间进行通信。您可以在 opeshift 中创建基于 ha 代理的路由器,参考这里 --https://docs.openshift.com/enterprise/3.0/install_config/install/deploy_router.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2016-08-30
      相关资源
      最近更新 更多