行至水穷处 坐看“云”起时

Cloud Native ADN -> CNadn.Net

k8s利用F5实现租户流量隔离?

环境背景:

flannel vxlan CNI 网络模型, F5 CC容器对接方案。

目标:

实现在F5上利用route domain对不同NS的流量隔离,类似如下:

— | — | — | — | — | —
Ns1 | Cc1 | Svc1 | cm1 | Partition 1 | Route domain1
— | — | — | — | — | —
Ns2 | Cc2 | Svc2 | cm2 | Partition2 | Route domain2

过程分析:

要想实现不同cc监控不同NS下资源并发布到不同的partition/RD下,那么需要cc

在写入bigip配置时携带 partition/RD信息,这些配置包括:
静态FDB/静态ARP/VS/POOL/Monitor等。

F5的configmap容许在定义资源的时候携带 RD ID

对于写入FDB/ARP信息时,需要在设置cc容器配置时,告知cc 相关的flannel tunnel在哪个partition下,类似这样:

那么,这就需要BIGIP上首先在不同的partition下设置不同的vxlan tunnel。类似openstack,不同的租户下使用相同的vtep地址建立不同的vxlan tunnel(tunnel里的key不一样),然后将这些tunnel分别关联到Partition对应的RD上,实现真正网络隔离。 但是flannel 无法针对不同的NS配置不同的VNI,这导致在F5上无法为不同的租户配置具有相同Key ID 的vxlan tunnel(F5会报错)。 因此做法行不通。

那为了避开上面这个tunnel创建问题,利用BIGIP 不同VLAN 作为vtep来与k8s node建立tunnel,这样tunnel可以建立,此时对于flannel来说,BIGIP上的这两个vtep 就需要像两个k8s node (按照F5 cc的思路,每个BIGIP vtep,在k8s里模拟成一个假 node),于是就需要给这两个不同的tunnel分别配置self IP, 按照flannel的默认要求,tunnel的selfIP需要/16掩码(容器使用/24),此时就会出现需要给两个不同的tunnel 都配置相同的网络号的问题,类似这样:

Tunnel 1 selfip 10.244.244.0/16

Tunnel 2 selfip 10.244.245.0/16

但实际上tunnel2 是属于另一个RD的,所以携带上RD号后,可以成功设置self ip。

随后,就需要开始为F5上这两个tunnel的vtep分别设置假的k8s node,但是此时,F5上的这两个tunnel的MAC地址是一样的,这导致k8s真节点上的flannel无法正确添加相关fdb表:

第一个tunnel vtep作为fake node加入后
00:50:56:b3:2e:29 dev flannel.1 dst 172.16.40.202 self permanent

第二个tunnel vtep作为fake node加入后
00:50:56:b3:2e:29 dev flannel.1 dst 172.16.30.202 self permanent

 所以,实际无法达成真正的通过RD流量的隔离。这并不是CC的问题,而是flannle本身实际上无法真正的给不同的NS分配不同的VNI号来实现不同NS的不同tunnel流量隔离。

就目前来看,要实现NS流量隔离,需要用不同cc对接不同的BIGIP。

同一个bigip可以做到不同的NS配置对应到不同的partition下,但是route domain层面无法隔离,不同partition还需要都用相同的route domain。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注