Calico 能够进行配置,为不同拓扑指定 IP 地址池。例如可能希望某些机架、地区、或者区域能够从同一个 IP 池中获取地址。这对于降低路由数量或者配合防火墙策略的要求会很有帮助。
cni 插件配置参考中的 IP 地址管理章节中包含了三种分配 IP 地址的方式。Kubernetes 注解方式只能用于 Namespace 或者 Pod 一级。剩下的只有两个办法,CNI 配置或者是基于节点选择器的 IP 池,相对于 CNI 配置的方式来说,节点选择器方案省去了修改本地文件的麻烦。
在更高层次上,基于节点选择器的 IP 地址分配方法就是给节点设置标签,然后用节点选择器选择对应的 IP 地址池进行分配。后面的内容中将给出一个详细的例子,用这种方式来设置一种机架亲和方式的 IP 地址分配方案。
如果 Calico 无法根据上述顺序来决定一个 IP 地址池,或者在选定的地址池中找不到可用的 IP 地址,那么这一工作负载就不会分到 IP 地址,无法启动。为了防止这种情况的发生,我们建议所有节点至少有一个合适的地址池。
这一功能需要 Calico 在 ETCD 模式下工作。
本例中,我们会创建一个集群,其中包含四个节点,分布在两个机架上,每个机架各两台。示意如下:
-------------------
| router |
-------------------
| |
--------------- ---------------
| rack-0 | | rack-1 |
--------------- ---------------
| kube-node-0 | | kube-node-2 |
- - - - - - - - - - - - - - - -
| kube-node-1 | | kube-node-3 |
- - - - - - - - - - - - - - - -
Pod IP 地址范围为 192.168.0.0/16
,我们进行如下设计:保留 192.168.0.0/24
给 rack-0
, 192.168.1.0/24
给 rack-1
。
要设置一个没有缺省地址池的的 Calico,首先运行 calicoctl get ippool -o wide
,会看到已经创建了一个 192.168.0.0/16
的地址池:
NAME CIDR NAT IPIPMODE DISABLED SELECTOR
default-ipv4-ippool 192.168.0.0/16 true Always false all()
default-ipv4-ippool
地址池已经存在,并占据了整个 /16
块,因此必须删除:calicoctl delete ippools default-ipv4-ippool
calicoctl get ippool -o wide
进行查看:
NAME CIDR NAT IPIPMODE DISABLED SELECTOR rack-1-ippool 192.168.0.0/24 true Always false rack == "0" rack-2-ippool 192.168.1.0/24 true Always false rack == "1"