1. 背景

openelb 0.5.1 版本的控制面和数据面集成在 openelb-manager 中,为满足建行的数据面和控制面分离的需求,需要将 openelb 拆分为 openelb-manager(deploy) 和 openelb-speaker(ds)

功能划分如下:

组件功能其他说明
openelb-controlleripam容器网络
openelb-speaker路由宣告主机网络

2. openelb-controller 功能点:

当前版本需要支持的功能(基本功能):

  • openelb-controller deploy 支持多副本
  • ipam
    • 处理 eip 并为 svc 分配 ip,记录 ip-svc 关系
    • 支持默认 eip

feature 开发:

  1. eip 绑定 namespace,同时去除 svc 指定的重复意义的 openelb 注解 ipam 分配原理发生变化,由之前的手动指定分配方式变更为以下两种:
  annotations:
    lb.kubesphere.io/v1alpha1: openelb
    protocol.openelb.kubesphere.io/v1alpha1: layer2
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip

openelb 0.5.x 默认 eip 支持的技术实现为:使用 webhook 拦截 service 的创建事件,并将相应的 openelb 的注解添加到 service 的annotation 列表中,由未指定 eip + protocol 变为指定 eip + protocol 分配。也相当于是指定分配

  • 自动分配:
    • 根据匹配的 namespace 按照特定的算法(轮询、顺序即IP占满后选下一个)来分配,不在意选定 eip 的协议(协议只与 speaker 相关)
    • 使用默认的 eip 分配
annotations:
  "lb.kubesphere.io/v1alpha1": "openelb"
# todo: 支持 spec.loadBalancerClass 指定
  • 手动指定分配:
# 指定 eip 分配
annotations:
  "eip.openelb.kubesphere.io/v1alpha2": "eip"
# 指定 ip 分配(ip 需要在已有的 eip 中)
annotations:
  "eip.openelb.kubesphere.io/v1alpha1": "192.168.1.10"
or
spec.loadBalancerIP: "192.168.1.10"
# loadBalancerIP - Kubernetes v1.24 中被弃用,保留现有的逻辑

3. openelb-speaker 功能点:

当前版本需要支持的功能(基本功能):

  1. layer2 speaker:
  • 将 svcip 分布到不同的节点、发布 GARP、回应 arp 请求
  • 检测 eip 配置网卡信息
  1. bgp speaker:
  • bgp 处理 bgpcong、bgppeer,并正常建立 bgp peer 并发布路由
  1. vip speaker:
  • 分配 svcip 后填充 configmap
  • 将 svcip 注册到网卡
  • 故障转移

enhance 功能:

  • 支持故障转移、自感知节点加入、退出
  • 默认启动 bgp speaker,需要 bgppeer 和 bgpconf;通过启动参数可以动态启动 layer2、vip speaker
  • 修复vip 卸载 keepalived-vip ds 依旧存在的问题
  • 与其他 bgp cni 兼容 参考 metallb - 不部署 speaker

补充 - eip 绑定 namespace

1. eip 资源定义

spec:
  priority: 1
  namespaces: 
  - namespace-1
  - default
  namespaceSelector: 
    kubesphere.io/workspace: workspace

2. 修改 ip 分配逻辑

image.png

删除 webhook,保留 eip.openelb.kubesphere.io/is-default-eip 注解,只有指定is-default-eip 注解的为默认的 eip。未指定 namespace 的 eip 均为notReady 状态,此时不能用于自动分配,只能指定 eip 分配。

总的分配流程:

  • namespace 绑定了多个 eip,根据轮询、优先级的算法选取 ip 未被占用完的 eip;如果都没有可用 ip,选取默认 eip 或者 报错:没有可用的 eip
  • namespace 绑定了一个 eip,选取 eip;若 eip 地址已用完,选取默认 eip 或者 报错:没有可用的 eip
  • namespace 没有绑定 eip,选取默认 eip

安装、测试

wget https://raw.githubusercontent.com/openelb/openelb/refactor/deploy/openelb.yaml
# 修改 openelb.yaml 中的镜像 
# kubesphere/openelb-controller:v0.6.0 -> rykren/openelb-controller:refactor
# kubesphere/openelb-speaker:v0.6.0 -> rykren/openelb-speaker:refactor
vim openelb.yaml
kubectl apply -f openelb.yaml