calico配置BlockAffinity
书接上文
上文书说到,我在测试固定ip部署redis集群的方案。
因为是手动分配IP,所以第一次测试为了简单起见,我用了连续的6个ip。虽然测试效果不错,但是这样配置使所有pod全部落在一个node上。有很大的安全风险。
进而想到calico对一整个ip池分成多个block块进行分配。那么我从分配到多个node上的block块中取ip,就可以达到使redis集群各节点部署到多个node的效果。
进而我就需要手动控制calico对block块的分配,发现了Block affinity可以影响block分配。
然而当天没有搞定,
我编写了Block affinity的yaml。一直apply失败
我以为是因为我的环境calico版本太低。

实际上这是错的,又打脸了,哈哈
真正的原因
我编写的yaml文件apply失败是因为我的api写错了,并不是calico版本低不支持Block affinity。
网上关于Block affinity编写基本没有找到资料,官方也没有给例子。
Block affinity是calico提供了一个crd资源。
每分配一个block,同时会创建一个blockaffinities.crd.projectcalico.org

查看现在已经有的blockaffinities。
拿出来一个照抄一下。
写出了正确的yaml
1 | apiVersion: crd.projectcalico.org/v1 |
指定分配一个cidr12.12.0.0/21 到 node6上去
(之前的文章里已经创建过了12.12.0.0/20的ippool)

apply之后,查看路由,发现已经生成了指向node6的12.12.0.0/21的这条路由。
一种可行的方案
综上来看,可以设想一种可行的方案
假设我们搭建一个有6个node节点的k8s集群来专门做redis集群。
创建一个大的ippool。
比如12.12.0.0/20。有4000多个ip,足够创建600多个集群,足够了。

然后将ippool分成6个block
那么需要用23位掩码,实际上有8个block。我们只用6个。浪费2个无所谓。

通过编写blockaffinities直接指定每个block到具体的node上
| cidr | node节点 | ip范围 |
|---|---|---|
| 12.12.0.0/23 | node1 | 12.12.0.1~12.12.1.254 |
| 12.12.2.0/23 | node2 | 12.12.2.1~12.12.3.254 |
| 12.12.4.0/23 | node3 | 12.12.4.1~12.12.5.254 |
| 12.12.6.0/23 | node4 | 12.12.6.1~12.12.7.254 |
| 12.12.8.0/23 | node5 | 12.12.8.1~12.12.9.254 |
| 12.12.10.0/23 | node6 | 12.12.10.1~12.12.11.254 |
进而可以编写一个管理ip的程序,给业务用户分配redis的ip。