环境背景:
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下,类似这样:
1 2 3 4 |
"--bigip-partition=cka", "--namespace=cka", "--pool-member-type=cluster", "--flannel-name=/cka/flannel_vxlan", |
1 2 3 4 |
"--bigip-partition=k8s", "--namespace=default", "--pool-member-type=cluster", "--flannel-name=/k8s/flannel_vxlan", |
那么,这就需要BIGIP上首先在不同的partition下设置不同的vxlan tunnel。类似openstack,不同的租户下使用相同的vtep地址建立不同的vxlan tunnel(tunnel里的key不一样),然后将这些tunnel分别关联到Partition对应的RD上,实现真正网络隔离。 但是flannel 无法针对不同的NS配置不同的VNI,这导致在F5上无法为不同的租户配置具有相同Key ID 的vxlan tunnel(F5会报错)。 因此做法行不通。
1 |
The tunnel /cka/test must have a unique VNI - the specified VNI(1) conflicts with VNI of tunnel /Common/flannel_vxlan. |
那为了避开上面这个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。
文章评论