【问题标题】:Each of the individual kubernetes containers to be made accessible from Internet - is it possible?每个单独的 kubernetes 容器都可以从 Internet 访问 - 有可能吗?
【发布时间】:2017-05-16 04:59:40
【问题描述】:

我正在考虑将 kubernetes 作为我的应用程序的平台。我将启动多个 StatefulSet,每个包含多达 32 个容器。 kubernetes 集群将包含几个节点,每个节点将被分配给例如超过 32 个外部 IP 地址。

我的应用程序要求在 Internet 上运行的客户端能够通过静态 IP 地址和端口访问每个单独的服务器实例,以实现基于客户端的负载平衡和故障转移。服务器可能会不时启动和死亡,但服务器运行时服务器地址应该是稳定的。

简而言之,我希望能够像这样从 Internet 访问我的容器:

  • 有状态集 1:
    • 容器 1:node1.domain.com:1000
    • 容器 2:node2.domain.com:1000
  • 有状态集 2:
    • 容器 1:node1.domain.com:1001
    • 容器 2:node2.domain.com:1001
  • 有状态集 3:
    • 容器 1:node2.domain.com:1002
    • 容器 2:node3.domain.com:1002

这是可以用 Kubernetes 实现的吗?如果是这样,您能否提供有关 Kubernetes 文档的提示和参考?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    您与StatefulSet 绑定的任何原因?对我来说听起来更像是DaemonSet。如果您想坚持使用StatefulSet,只需使用container 规范中的容器/主机端口参数即可。

    例如,在集群中与您的选择器条件匹配的每个节点上,在各自的端口上运行应用程序 overflow-foooverflow-baroverflow-baz

    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: overflow-app
      labels:
        app: overflow-app-agent
        version: v1
    spec:
      template:
        metadata:
          labels:
            name: overflow-app
        spec:
          hostPID: true
          hostIPC: true
          hostNetwork: true
          containers:
          - image: overflow-foo:latest
            name: overflow-bar
            command: [ "bash", "-c", "run.sh" ]
            ports:
            - containerPort: 1000
              hostPort: 1000
          - image: overflow-bar:latest
            name: overflow-bar
            command: [ "bash", "-c", "run.sh" ]
            ports:
            - containerPort: 1001
              hostPort: 1001
          - image: overflow-baz:latest
            name: overflow-baz
            command: [ "bash", "-c", "run.sh" ]
            ports:
            - containerPort: 1002
              hostPort: 1002
    

    【讨论】:

    • 嗯,是的,就如何执行而言,这可能就是我所需要的。我有两个后续问题。 1)我需要容器能够通过稳定的网络 ID 相互通信,使用稳定的存储和按需扩展。我在看 StatefulSet,因为它正好提供了这个功能。 2)如果我在模板中指定 hostPort 与 hostNetwork 选项,它最终将绑定到哪个 IP?例如,我可能只有几个 kubernetes 节点,但同一个 Set 中有许多容器和许多外部 IP 地址。而且我需要将每个节点绑定到一些外部 IP 和端口。
    • 这听起来很危险,就像“帮我做作业”一样。讨厌说 RTFM 但是...阅读 docker、kubernetes 和 openshift 文档。您的问题将在大多数“入门”文档中得到解答。
    • 1) 以这种方式部署时,容器都将假定其主机的 IP/networkID。 2)这个问题没有意义...... hostnetworkhostPort 做两件不同的事情。 hostNetwork 为 pod 提供对节点网络的完全访问权限。在我看来,它只需要端口。仅在您需要时才公开端口。
    • 对不起,我不是故意强迫别人做我的工作。网络主题在 kubernetes 中没有明确记录。它给出了一些典型的场景,但仍然非常有限。因此,尚不清楚使用 Kubernetes 究竟可以实现什么。这个问题的目的是阐明 Kubernetes 的网络功能并填补文档空白。在深入研究和实验之前,专家建议可以节省宝贵的时间,尤其是在 Kubernetes 不符合我的要求的情况下。
    【解决方案2】:

    听起来您想使用Services 来曝光您的StatefulSets。您将为每个 Stateful Set 定义一个服务,并使用 NodePortLoadBalancer 将其公开给外部世界。 NodePort 可用于在集群中的每个 Node 上寻址,并且 LoadBalancer 将是一个单一的入口点,它还可以平衡 StatefulSet 的不同 PODs 的负载。有关更多信息,您可以阅读Services 的官方文档,尤其是NodePortLoadBalancer 的部分。

    附加说明 - NodePort 默认使用端口范围 30000-32767,但您可以使用集群参数 service-node-port-range 更改它。见docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-05
      • 2019-04-22
      • 2013-12-11
      • 2011-12-24
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多