1. 背景
openelb 0.5.1 版本的控制面和数据面集成在 openelb-manager 中,为满足建行的数据面和控制面分离的需求,需要将 openelb 拆分为 openelb-manager(deploy) 和 openelb-speaker(ds)
功能划分如下:
组件 | 功能 | 其他说明 |
---|---|---|
openelb-controller | ipam | 容器网络 |
openelb-speaker | 路由宣告 | 主机网络 |
2. openelb-controller 功能点:
当前版本需要支持的功能(基本功能):
- openelb-controller deploy 支持多副本
- ipam
- 处理 eip 并为 svc 分配 ip,记录 ip-svc 关系
- 支持默认 eip
feature 开发:
- 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 功能点:
当前版本需要支持的功能(基本功能):
- layer2 speaker:
- 将 svcip 分布到不同的节点、发布 GARP、回应 arp 请求
- 检测 eip 配置网卡信息
- bgp speaker:
- bgp 处理 bgpcong、bgppeer,并正常建立 bgp peer 并发布路由
- 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 分配逻辑
删除 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