Kubernetes 网络插件 Calico 完全运维指南
适用范围
本文档测试范围:
概述
Calico 是一种开源网络和网络安全解决方案,适用于容器,虚拟机和基于主机的本机工作负载。Calico 支持广泛的平台,包括 Kubernetes,docker,OpenStack 和裸机服务。Calico 后端支持多种网络模式。
BGP 模式:将节点做为虚拟路由器通过 BGP 路由协议来实现集群内容器之间的网络访问。IPIP 模式:在原有 IP 报文中封装一个新的 IP 报文,新的 IP 报文中将源地址 IP 和目的地址 IP 都修改为对端宿主机 IP。cross-subnet:Calico-ipip 模式和 calico-bgp 模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用 BGP 的场景可以使用 cross-subnet 模式,实现同子网机器使用 calico-BGP 模式,跨子网机器使用 calico-ipip 模式。
calico 切换 BGP 模式
部署完成后默认使用 calico-ipip 的模式,通过在节点的路由即可得知,通往其他节点路由通过 tunl0 网卡出去
修改为 BGP 网络模式,在 system 项目中修改 calico-node daemonset
修改CALICO_IPV4POOL_IPIP改为 off,添加新环境变量FELIX_IPINIPENABLED为 false
修改完成后对节点进行重启,等待恢复后查看主机路由,与 ipip 最大区别在于去往其他节点的路由,由 Tunnel0 走向网络网卡。
calico 切换 cross-subnet 模式
Calico-ipip 模式和 calico-bgp 模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用 BGP 的场景可以使用 cross-subnet 模式,实现同子网机器使用 calico-BGP 模式,跨子网机器使用 calico-ipip 模式。
部署集群网络选择 calico 网络插件
默认部署出来是 calico 的 ip-in-ip 的模式 查看宿主机网卡,会发现多了个 tunl0 网卡,这个是建立 ip 隧道的网卡
去其他主机的路由都是走 tunl0 网卡出去
切换到 cross-subnet 模式
kubectl edit ipPool/default-ipv4-ippool
将 ipipMode 改为 crossSubnet
在 UI 将 calico-node 的 POD 删了重建
重启检查 calico 网络
可以看见同子网的主机出口走的是 bgp,不同子网主机走的是 tunl0 网卡走 ipip 模式
创建应用测试跨主机网络,在不同主机上互相 ping 测试,看看跨主机网络是否正常。
配置 Route reflector
安装 calicoctl
安装方式有以下几种
Single host 上面 binary 安装Single host 上面 continer 安装作为 k8s pod 运行
实际经验:
Binary 方式在集群里面的一台 worker 节点安装(比如 RR),calicoctl 会检测 bird/felix 的运行状态。在非 calico node 节点运行只能使用部分命令,不能运行 calico node 相关命令。
通过配置 calicoctl 来对 calico 进行控制,通常情况下建议将
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.13.3/calicoctl
配置可执行权限
chmod x calicoctl
复制的/usr/bin/目录
cp calicoctl /usr/bin/
配置 calicoctl 连接 Kubernetes 集群
export CALICO_DATASTORE_TYPE=kubernetes
export CALICO_KUBECONFIG=~/.kube/config
calicoctl node status
calico node-to-node mesh
默认情况下 calico 采用 node-to-node mesh 方式 ,为了防止 BGP 路由环路,BGP 协议规定在一个 AS(自治系统)内部,IBGP 路由器之间只能传一跳路由信息,所以在一个 AS 内部,IBGP 路由器之间为了学习路由信息需要建立全互联的对等体关系,但是当一个 AS 规模很大的时候,这种全互联的对等体关系维护会大量消耗网络和 CPU 资源,所以这种情况下就需要建立路由反射器以减少 IBGP 路由器之间的对等体关系数量。
Route reflector 角色介绍
早期 calico 版本提供专门的 route reflector 镜像,在新版本 calico node 内置集成 route reflector 功能。Route reflector 可以是以下角色:
集群内部的 node 节点集群外部节点运行 calico node其他支持 route reflector 的软件或者设备。
这里以一个集群内部的 node 节点为例:
关闭 node-to-node meshcat