【问题标题】:How to use a host IP from a container?如何使用容器中的主机 IP?
【发布时间】:2018-08-30 15:51:58
【问题描述】:

在使用主机网络选项运行的容器中,可以使用容器中的主机网络接口及其 IP 并联系外部网络来自此接口和 IP。因此,如果主机配置了多个 IP,容器可以选择使用哪个。

我可以对 Kubernetes 进行类似的设置并让容器使用主机 IP 吗?

注意:我需要特定 IP 联系外部服务的流程,我不一定需要从外部视图将这些 IP 分配给容器。

【问题讨论】:

    标签: networking kubernetes


    【解决方案1】:

    正如我在Egress IP adress selection 中所写:

    Istio Egress Gateway 可以帮助您解决这个问题,所以我建议您研究一下。

    否则,它仍然依赖于特定平台和部署集群的方式。例如,在 AWS 上,您可以通过使用分配有弹性 IP 的实例(无论是常规 EC2 还是 AWS NAT 网关)来确保您的出口流量始终来自预定义的已知 IP 集。即使使用上面的 Egress,您也需要一些方法来为此定义一个固定 IP,因此 AWS ElasticIP(或等效的)是必须的。

    【讨论】:

    • 感谢您的回答。这个想法看起来很有趣,然后我进一步了解 Egress Gateway。除了阻止到外部服务的流量之外,我没有看到如何处理来自容器的 IP,或者根据请求更改 TCP 请求 IP。它也会带来限制,因为它需要配置所有外部 IP,而这里我们可能有不断变化的 IP。主机 IP 静态附加到主机,我不打算使用 AWS。
    【解决方案2】:

    我会尝试一下。我希望我能理解你的问题。您只需要从 pod/container 内部连接到外部 ip。

    我们通过创建一个没有选择器的 kubernetes 服务来实现这一点。

    
    kind: Service 
    apiVersion: v1 
    metadata:
      name: your-external-system
        

    随后创建一个与您的服务同名的端点对象。

    
    kind: Endpoints 
    apiVersion: v1 
    metadata: 
      name: your-external-system
      subsets: 
        - addresses: 
           - ip: 192.168.0.1 
           ports: 
           - port: 3306
        
    最后在您的 pod 中,您可以在这种情况下简单地引用服务名称(your-external-system)

    【讨论】:

    • 不是外部 IP,而是 from 一个主机 IP 作为源 IP。
    • 哦,你不必做任何事情。如果您的 pod 想要与之通信的服务在集群之外,该服务将看到您的 pod 正在运行的 hostIp。我知道这一点是因为我们的一个系统正在使用 ip 过滤来只允许某些主机连接到它。我们所做的只是将所有 Kubernetes 主机 Ips 添加到白名单中。
    • 我需要容器来选择它的IP。
    • 您可以在您的 pod 中配置 hostNetwork=true。它类似于 docker --network 主机。这是你要找的吗?
    • 这也是我想出来的选项,并且这样做测试
    【解决方案3】:

    pod 规范中的hostNetwork=true 将宿主网络暴露给 pod,容器可以访问网络接口:

    apiVersion: v1
    kind: Pod
    metadata:
      name: lookup
    spec:
      hostNetwork: true
      containers:
        - name: lookup
          image: sbusso/lookup_ips:latest
          ports:
          - containerPort: 9000
    

    测试它:kubectl port-forward lookup 9000 然后转到http://127.0.0.1:9000/ 并获取网络接口详细信息:

    lo
    - 127.0.0.1/8
    - ::1/128
    eth0
    - 10.0.2.15/24
    - fe80::a00:27ff:fea1:6e61/64
    eth1
    - 192.168.99.101/24
    - fe80::a00:27ff:fe77:d179/64
    

    注意,Kubernetes 良好实践中不建议使用此选项:https://kubernetes.io/docs/concepts/configuration/overview/#services

    【讨论】:

    • 嗨,Stéphane,谢谢,您的答案正是我想要的(在 pod 内创建一个 tcpdump)。但我不明白,因为我认为吊舱需要能力。对于 podman,我使用 --net=host --privileged(在此示例中,--privileged 是多余的)。我可以看到 .spec.hostNetwork == --net=host 但我看不到 --privileged 的等效项(使用 docker 编辑我不需要 --privileged
    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多