Kubernetes没有为本地集群提供网络负载平衡器的实现(即svc 类型为loadbalance),Kubernetes附带的Network LB的实现都是调用各种IaaS平台(GCP,AWS,Azure等)的粘合代码。如果您未在受支持的IaaS平台(GCP,AWS,Azure等)上运行, 则LoadBalancers在创建时将无限期保持pending状态
metalb解决了这种问题,使得本地集群也能使用loadbalance类型的svc
kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml二层只需要配置IP地址段即可
cat >> metallb < EOFapiVersion: v1kind: ConfigMapmetadata: namespace: metallb-system name: configdata: config: | address-pools: - name: default protocol: layer2 addresses: - 10.10.8.200-10.10.8.205EOFbgp模式需要配置以下信息
示例配置:
apiVersion: v1kind: ConfigMapmetadata: namespace: metallb-system name: configdata: config: | peers: - peer-address: 10.0.0.1 peer-asn: 64501 my-asn: 64500 address-pools: - name: default protocol: bgp addresses: - 192.168.10.0/24缺省情况下,BGP模式将每个分配的IP通告给配置的对等方,而没有其他BGP属性。对于每个svc ip对等路由器将收到一个32位掩码的路由信息,BGP localpref设置为零且没有BGP Community。
通过 bgp-advertisements可以自定义广播配置, 除了可以配置localpref和Community之外还可以配置聚合路由, aggregation-length广播参数可以扩大广播的32位掩码 结合多种广播配置,这使您可以创建与BGP网络其余部分互操作的广播
假设您租用/24了公共IP空间,并且已将其分配给MetalLB。默认情况下,MetalLB将每个IP通告为/32, 但您的IP提供商拒绝路由/24以外的路由。因此,您需要以某种方式以/24向您的IP提供商进行广播发布,但仍然可以在内部进行单个IP路由。
配置如下:
apiVersion: v1kind: ConfigMapmetadata: namespace: metallb-system name: configdata: config: | peers: - peer-address: 10.0.0.1 peer-asn: 64501 my-asn: 64500 address-pools: - name: default protocol: bgp addresses: - 198.51.100.0/24 bgp-advertisements: - aggregation-length: 32 localpref: 100 communities: - no-advertise - aggregation-length: 24 bgp-communities: no-advertise: 65535:65282通过使用node-selectors 配置中的对等方属性将对等方限制为某些节点
使用主机名hostA或hostB有 rack=frontend标签,但没有标签 network-speed=slow使用该配置
peers:- peer-address: 10.0.0.1 peer-asn: 64501 my-asn: 64500 node-selectors: - match-labels: rack: frontend match-expressions: - key: network-speed operator: NotIn values: [slow] - match-expressions: - key: kubernetes.io/hostname operator: In values: [hostA, hostB]由于错误的Smurf_attack保护, 一些旧的用户网络设备错误地阻止了以.0和.255结尾的IP地址。
如果您的用户或网络遇到此问题,则可以 avoid-buggy-ips:true在地址池上进行设置以将.0和标记.255为不可用。
修改type: LoadBalancer查看状态
# kubectl get svc -n kube-system kube-state-metricsNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkube-state-metrics LoadBalancer 200.0.210.165 10.10.8.203 8080:31527/TCP,8081:32312/TCP 4sspec.loadBalancerIP字段metadata.annotations.metallb.universe.tf/address-poolmetadata.annotations.metallb.universe.tf/allow-shared-ip:"共享秘钥",只有共享秘钥相同的svc才能共享IPmetallb 赋予了我们使用本地网络直接访问K8S内部服务的能力而不需要依赖于nodeport或者host port,但是当前为beta,不推荐生产使用.