hello云胜

技术与生活

0%

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版本太低。

image-20230721100723293

实际上这是错的,又打脸了,哈哈

真正的原因

我编写的yaml文件apply失败是因为我的api写错了,并不是calico版本低不支持Block affinity。

网上关于Block affinity编写基本没有找到资料,官方也没有给例子。

Block affinity是calico提供了一个crd资源。

每分配一个block,同时会创建一个blockaffinities.crd.projectcalico.org

image-20230721101043147

查看现在已经有的blockaffinities。

拿出来一个照抄一下。

写出了正确的yaml

1
2
3
4
5
6
7
8
apiVersion: crd.projectcalico.org/v1
kind: BlockAffinity
metadata:
name: paas-m-k8s-node-6-12-12-0-0-21
spec:
cidr: 12.12.0.0/21
node: paas-m-k8s-node-6

指定分配一个cidr12.12.0.0/21 到 node6上去

(之前的文章里已经创建过了12.12.0.0/20的ippool)

image-20230721101323598

apply之后,查看路由,发现已经生成了指向node6的12.12.0.0/21的这条路由。

一种可行的方案

综上来看,可以设想一种可行的方案

假设我们搭建一个有6个node节点的k8s集群来专门做redis集群。

创建一个大的ippool。

比如12.12.0.0/20。有4000多个ip,足够创建600多个集群,足够了。

image-20230721102148027

然后将ippool分成6个block

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

image-20230721102327143

通过编写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。