k8s使用MetalLB.md

使用 MetalLB 时,对局域网环境的要求取决于你选择的 MetalLB 操作模式。它主要提供两种模式:Layer 2 模式BGP 模式。它们对网络环境的要求截然不同。


模式一:Layer 2 模式(最常用,对网络要求最低)

这是 MetalLB 的默认模式,也是绝大多数私有环境的首选。

工作原理

  • MetalLB 会选择一个节点作为“演讲者”,该节点会使用 ARP(IPv4)或 NDP(IPv6) 协议来响应来自局域网的 IP 地址请求。
  • 简单来说,当你在局域网内请求 http://192.168.1.100 时,你的计算机会广播问:“谁是 192.168.1.100?”。被 MetalLB 指定的那个 Kubernetes 节点会回答:“是我!”,之后所有去往这个 IP 的流量都会发往该节点,再由该节点通过 kube-proxy 路由到实际的 Istio Ingress Gateway Pod。

对局域网环境的要求

  1. IP 地址池:你需要为 MetalLB 分配一个或多个空闲的、连续的 IP 地址段,这个段必须与你的 Kubernetes 节点网络在同一个二层广播域内。

    • 例如:你的节点 IP 是 192.168.1.10-192.168.1.20,那么你可以分配 192.168.1.100-192.168.1.110 给 MetalLB。
    • 关键:这些 IP 不能被网络中的 DHCP 服务器分配,也不能被任何其他设备静态占用。
  2. 二层网络连通性

    • 所有 Kubernetes 节点必须位于同一个二层网络(同一个子网/VLAN) 中。
    • 客户端(访问服务的机器)也必须与 Kubernetes 节点在同一个二层网络中,或者网络路由器必须能够将 ARP/NDP 广播转发到客户端所在的子网。
    • 简单判断:如果你的客户端能直接 ping 通你的 Kubernetes 节点 IP,那么通常也满足 Layer 2 模式的要求。
  3. 对路由器的要求

    • 基本上没有要求。这是 Layer 2 模式最大的优点。它不要求路由器支持任何特定协议(如 BGP)。普通的家用路由器、简单的二层交换机都能完美支持。

优缺点

  • 优点:配置简单,对网络设备无特殊要求,即插即用。
  • 缺点
    • 故障转移有延迟:如果当前负责响应的节点宕机,MetalLB 会选举另一个节点来接管 IP,这个过程中会有几秒到十几秒的网络中断。
    • 带宽限制:所有流量都必须经过那个“演讲者”节点,无法实现真正的多节点负载均衡。如果流量巨大,该节点可能成为瓶颈。
    • ARP/NDP 泛滥:在大型网络中,过多的 ARP 流量可能成为问题。

模式二:BGP 模式(适用于生产级网络)

这种模式适用于具有支持 BGP 路由器的、更复杂的网络环境。

工作原理

  • 每个 Kubernetes 节点都会与一个或多个网络路由器建立 BGP 对等会话。
  • 当 MetalLB 需要分配一个 IP 时,它会通过 BGP 协议向路由器宣告:“这个 IP 在我这里(某个特定节点上),请把来这个 IP 的流量都发给我”。
  • 路由器会基于其路由表,智能地将去往该 IP 的流量负载均衡到所有宣告了该路由的节点上。

对局域网环境的要求

  1. 支持 BGP 的路由器:这是必须的。你网络中的核心路由器或三层交换机必须支持 BGP 协议,并且你需要有权限配置 BGP 对等体。

    • 常见支持 BGP 的设备:Cisco IOS/IOS-XE/NX-OS, Juniper JunOS, Arista EOS, FRRouting, Bird 等。
  2. BGP 对等体配置

    • 你需要知道路由器的 IP 地址和 AS 号。
    • 你需要在路由器上配置,允许 Kubernetes 节点的 IP 与其建立 BGP 连接。
    • 你需要在 MetalLB 的配置中指定路由器的 IP 和 AS 号。
  3. IP 地址池:同样需要分配一段空闲的 IP 地址。这个段不一定要和节点 IP 在同一个子网,因为 BGP 是三层路由协议。

优缺点

  • 优点
    • 真正的负载均衡:流量可以被路由器均衡地分发给多个 Kubernetes 节点。
    • 快速故障转移:如果某个节点宕机,BGP 协议会迅速(秒级)从路由表中撤回该节点的路由,流量会自动切换到其他健康节点。
    • 扩展性好:适用于大型、复杂的网络。
  • 缺点
    • 配置复杂:需要同时配置 Kubernetes 和网络设备,对运维人员要求高。
    • 对网络设备有硬性要求:必须要有支持 BGP 的路由器。

总结与建议

特性 Layer 2 模式 BGP 模式
网络要求 ,只需普通二层交换机/路由器 ,需要支持 BGP 的路由器
配置复杂度 低,主要在 Kubernetes 内配置 高,需配置 Kubernetes 和网络设备
负载均衡 否,流量集中到单一节点 是,路由器可实现多节点均衡
故障转移速度 慢(秒级到十几秒) 快(秒级)
适用场景 中小型部署、实验室、开发测试环境 大型、生产级、高可用性要求高的环境

给你的建议:

  1. 如果你是第一次在私有环境使用,或者你的网络比较简单(例如,使用普通家用路由器或简单的企业交换机),请毫不犹豫地选择 Layer 2 模式。 它能解决 90% 以上的私有化部署需求,并且配置非常简单。
  2. 只有当你管理一个大型数据中心网络,拥有支持 BGP 的核心路由器,并且对流量负载均衡和快速故障转移有极高要求时,才考虑使用 BGP 模式。

实践步骤(Layer 2 模式):

  1. 安装 MetalLB。
    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
  2. 创建一个 ConfigMap,指定一个与你的节点在同一网段的 IP 地址池。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    apiVersion: v1
    kind: ConfigMap
    metadata:
    namespace: metallb-system
    name: config
    data:
    config: |
    address-pools:
    - name: default
    protocol: layer2
    addresses:
    - 192.168.1.100-192.168.1.110 # 替换为你的空闲 IP 段
  3. 保持 Istio Ingress Gateway 的 Service 类型为 LoadBalancer
  4. 稍等片刻,查看 kubectl get svc -n istio-system istio-ingressgateway,其 EXTERNAL-IP 就会显示为 MetalLB 分配的 IP(如 192.168.1.100)。现在,你就可以在局域网内通过 http://192.168.1.100 访问你的服务了。