Calico学习:内外网络互通方案
文章目录
Calico作为CNI插件,基于纯IP的方案实现Pod网络的互通。为了能够让集群外的主机(假设称为NodeA)能够直接访问Pod IP,实际上只要将Kubernetes集群的路由信息完整同步NodeA上即可。
假设当前Kubernetes包括以下4个节点,且默认 calico 中只包含一个ipPool,cidr为30.233.0.0/16,blockSize为26,每个Node在该ipPool中分配到的地址段为:
|
|
相同子网
主机 NodeA 的IP地址 192.168.121.210/24和node1~4二层互通。 为了让NodeA可以访问集群中的Pod,用户可以手工添加以下静态路由:
|
|
这种情况NodeA和集群的所有节点是2层互通的,只要指对路由就可以打通Pod网络。
跨子网
当主机 NodeA 和 node1~4 不是IP互通时,无法添加路由规则。 此时可以通过在 NodeA 上部署容器化的 Calico/Node 服务,通过在BGP协议将 K8S 路由信息自动同步到 NodeA 节点,并且借助 Calico/Node 可以在节点上自动创建 IPIP 隧道,解决跨子网问题。
当用户使用Kubernetes作为存储后端时,Calico基于Kubernetes Node建立BGP Peer,为了让 NodeA 能够和其他节点建立Session。我们需要手工在Kubernets中创建一个name为“node-ext”的虚拟节点。
|
|
假设 NodeA 节点IP为 192.168.222.210,通过以下命令在 NodeA 中启动 Calico 容器:
|
|
KUBECONFIG 指定的 kubeconfig 可以从中/etc/kubernetes/admin.conf 获取
calico-node 的相关日志信息保存在 /var/log/calico 目录中
上述方案在跨子网的环境上可以成功,但是在一些特殊环境无法成功。
浮动IP场景,集群内节点只能通过 NodeA 的浮动ip访问,并且浮动ip是通过NAT的方式映射的
目前这种玩法,实际上calico官方并不支持。
参考:https://github.com/projectcalico/calico/issues/3407
文章作者 yoaz
上次更新 2021-11-19
许可协议 MIT