【问题标题】:How to pass incoming traffic in bare-metal cluster with MetalLB and Ingress Controllers?如何使用 MetalLB 和 Ingress Controller 传递裸机集群中的传入流量?
【发布时间】:2021-07-29 14:25:55
【问题描述】:

我正试图在裸机 k8s 集群上向外界公开内部负载平衡。

假设我们有一个基本集群:

  1. 一些主节点和一些工作节点,有两个接口,一个面向公众 (eth0) 和一个本地 (eth1),ip 在 192.168.0.0/16 网络内

  2. 部署MetalLB并为其内部ip配置192.168.200.200-192.168.200.254范围

  3. Ingress 控制器及其服务类型为 LoadBalancer

据我目前的理解,MetalLB 现在应该将 192.168.200.200-192.168.200.254 中的一个 ip 分配给入口服务。

但我有以下几个问题:

在每个节点上,我可以卷曲入口控制器 externalIP(只要它们在 eth1 上可访问),并附加主机标头,并从对应入口资源中配置的服务获得响应,还是仅在入口 pod 所在的节点上有效当前放置?

我有哪些选择可以将传入的外部流量传递到 eth0 到在 eth1 网络上侦听的入口?

是否可以转发请求保存源IP地址或附加X-Forwarded-For标头是唯一的选择?

【问题讨论】:

    标签: kubernetes kubernetes-ingress metallb


    【解决方案1】:

    假设我们使用Layer2 谈论Metallb

    解决以下问题:

    在每个节点上,我可以卷曲入口控制器 externalIP(只要它们在 eth1 上可访问),并附加主机标头,并从对应入口资源中配置的服务获得响应,还是仅在入口 pod 所在的节点上有效当前放置?

    是否可以转发请求保存源IP地址或附加X-Forwarded-For标头是唯一的选择?

    在保留源IP的前提下划分解决方案,这个问题可以是双向的:


    保留源 IP 地址

    为此,您需要通过设置(在您的 YAML 清单中)设置 Ingress controllerService of type LoadBalancer 以支持“本地流量策略”:

    • .spec.externalTrafficPolicy: Local

    只要在每个Node 上都有您的Ingress controller 的副本,此设置就有效,因为所有连接到您的控制器的网络都将包含在单个Node 中。

    引用官方文档:

    使用Local 流量策略,接收流量的节点上的kube-proxy 仅将其发送到同一节点上的服务pod。节点之间没有“水平”流量。

    因为kube-proxy 不需要在集群节点之间发送流量,所以您的 pod 可以看到传入连接的真实源 IP 地址。

    此策略的缺点是传入流量仅流向服务中的某些 pod。不在当前领导节点上的 Pod 不会接收流量,它们只是作为副本存在,以防需要故障转移。

    Metallb.universe.tf: Usage: Local traffic policy


    不保留源 IP 地址

    如果您的用例不需要您保留源 IP 地址,您可以使用:

    • .spec.externalTrafficPolicy: Cluster

    此设置不要求您的 Ingress controller 的副本将出现在每个 Node 上。

    引用官方文档:

    使用默认的Cluster 流量策略,接收流量的节点上的kube-proxy 会进行负载平衡,并将流量分配到服务中的所有 Pod。

    此策略导致服务中所有 Pod 的流量分布均匀。但是,kube-proxy 在进行负载平衡时会掩盖连接的源 IP 地址,因此您的 pod 日志将显示外部流量似乎来自服务的领导节点。

    Metallb.universe.tf: Usage: Cluster traffic policy


    解决第二个问题:

    我有哪些选项可以将传入的外部流量传递到 eth0 到在 eth1 网络上侦听的入口?

    Metallb 默认侦听所有接口,您只需在 Metallb 配置中从 eth 指定地址池。

    您可以通过以下方式找到有关此主题的更多参考:

    此类配置的示例如下:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: metallb-system
      name: config
    data:
      config: |
        address-pools: # HERE
        - name: my-ip-space
          protocol: layer2
          addresses:
          - 192.168.1.240/28
    

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2020-12-29
      • 2019-12-26
      • 1970-01-01
      • 2022-01-17
      • 2020-10-18
      • 2018-12-23
      • 2021-01-07
      • 2019-02-28
      相关资源
      最近更新 更多