istio-ingress-gateway在私有局域网中使用.md

在Kubernetes中,LoadBalancer类型的Service是否需要额外配置,以及私有集群(局域网环境)能否使用,取决于集群的部署环境(云厂商托管/私有自建),具体如下:

一、LoadBalancer类型的Service是否需要额外配置?

LoadBalancer类型的Service的核心作用是:通过集群外部的负载均衡器(通常是基础设施提供的)暴露服务,并自动将负载均衡器的流量转发到集群内的Pod。其配置需求高度依赖底层基础设施

1. 云厂商托管集群(如AWS EKS、GCP GKE、Azure AKS)

  • 通常无需手动额外配置:云厂商的Kubernetes服务(托管集群)会自动集成其自有负载均衡器服务(如AWS ELB、GCP LB)。
    当创建LoadBalancer类型的Service时,云厂商会:

    • 自动创建一个外部负载均衡器实例;
    • 为负载均衡器分配公网IP(或私有IP,取决于配置);
    • 自动配置负载均衡器与集群内Service的关联(如转发规则、健康检查)。
  • 例外情况:若需自定义负载均衡器(如指定私有IP、修改健康检查参数、绑定SSL证书等),需通过Service的annotations配置(不同云厂商的注解不同)。
    例如,AWS中指定私有子网的负载均衡器:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apiVersion: v1
    kind: Service
    metadata:
    name: my-service
    annotations:
    service.beta.kubernetes.io/aws-load-balancer-internal: "true" # 私有负载均衡器
    spec:
    type: LoadBalancer
    selector:
    app: my-app
    ports:
    - port: 80
    targetPort: 8080

2. 私有自建集群(非云厂商环境,如物理机、虚拟机、局域网)

  • 必须额外配置:私有集群没有云厂商提供的负载均衡器服务,Kubernetes本身无法直接创建LoadBalancer类型的Service(会处于Pending状态,EXTERNAL-IP始终为<pending>)。
    此时需部署第三方负载均衡器解决方案(如MetalLB),才能让LoadBalancer类型的Service生效。

二、私有集群(局域网)中能否使用LoadBalancer类型?

可以使用,但需要额外部署工具(如MetalLB),否则LoadBalancer类型的Service无法正常工作。

原理:私有集群的“负载均衡器”如何实现?

私有环境中没有云厂商的负载均衡器,需通过工具模拟这一功能。最常用的工具是MetalLB,它是专为裸金属Kubernetes集群设计的负载均衡器实现,核心功能是:

  • 管理一个局域网内的“IP地址池”(需提前规划,确保这些IP在局域网中未被占用);
  • 当创建LoadBalancer类型的Service时,从IP池中分配一个IP作为EXTERNAL-IP
  • 通过ARP/NDP(二层模式)或BGP(三层模式)将该IP与集群内的Service关联,实现流量转发。

私有集群中部署MetalLB并使用LoadBalancer的步骤:

1. 部署MetalLB
1
2
3
4
5
# 安装MetalLB(使用官方Manifest)
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml

# 等待Pod就绪(命名空间为metallb-system)
kubectl get pods -n metallb-system
2. 配置IP地址池(关键)

需定义一个局域网内的IP地址段(确保未被其他设备占用),作为MetalLB分配给LoadBalancer Service的IP来源。

创建配置文件metallb-ip-pool.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: my-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.100-192.168.1.200 # 局域网内的IP段(根据实际网络规划修改)
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement # 二层模式(适合简单局域网,无需BGP路由配置)
metadata:
name: l2-advertisement
namespace: metallb-system
spec:
ipAddressPools:
- my-ip-pool # 关联上面定义的IP池

应用配置:

1
kubectl apply -f metallb-ip-pool.yaml
3. 创建LoadBalancer类型的Service验证
1
2
3
4
5
6
7
8
9
10
11
12
# service-example.yaml
apiVersion: v1
kind: Service
metadata:
name: my-lb-service
spec:
type: LoadBalancer
selector:
app: my-app # 关联你的Pod标签
ports:
- port: 80
targetPort: 8080 # Pod的端口

应用后查看Service:

1
2
kubectl get svc my-lb-service
# 输出应显示EXTERNAL-IP为192.168.1.xxx(从IP池中分配)

此时,局域网内的设备可通过该EXTERNAL-IP:80访问服务。

三、总结

  1. LoadBalancer类型的配置需求

    • 云厂商集群:通常无需额外配置(自动集成),复杂场景需通过annotations自定义。
    • 私有集群:必须部署MetalLB等工具,并配置局域网IP池。
  2. 私有集群(局域网)能否使用

    • 可以使用,但不能直接用(原生K8s不支持),需通过MetalLB等工具实现,核心是为LoadBalancer Service分配局域网内的可用IP。
  3. 替代方案:若不想部署MetalLB,私有集群可直接使用NodePort(通过节点IP+端口访问)或Ingress(配合NodePort或主机网络)暴露服务,只是灵活性和可用性略低于LoadBalancer

使用 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。
  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 访问你的服务了。