Rancher容器集群跨主机网络模式切换

Flannel或canal网络插件

切换host-gw模式

默认部署出来是canal的vxlan的模式
查看宿主机网卡,会发现多了个flannel.1网卡,这个是建立vxlan隧道的网卡

跨主机的网卡都是走flannel.1网卡出去,因为要经过vxlan封包

切换到host-gw模式的方法
编辑集群

将flannel_backend_type改为host-gw
保存,等待集群进行更新

继续修改canal默认的configmap文件

切换到System项目——>资源——>配置映射修改canal-config

保存,然后将机器重启
在次查看flannel.1网卡已经消失了,所有流量出去通过对应的明细路由进行访问 。

验证
创建workload,多个副本,分布到不同主机上,进行跨主机ping测试

在不同主机上互相ping测试,看看跨主机网络是否正常,这里需要注意的是,在公有云和openstack上是ping不通的因为host-gw模式公有云默认都开启了防ARP欺骗,分配的Mac地址和IP都绑定了,非平台分配的mac地址和IP出去会被drop掉。

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-subne模式

Calico-ipip模式和calico-bgp模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用BGP的场景可以使用cross-subnet模式,实现同子网机器使用calico-BGP模式,跨子网机器使用calico-ipip模式。

部署集群网络选择calico网络插件

默认部署出来是calico的ip-in-ip的模式
查看宿主机网卡,会发现多了个tunl0网卡,这个是建立ip隧道的网卡

去其他主机的路由都是走tunl0网卡出去

切换到cross-subnet模式

1
kubectl edit ipPool/default-ipv4-ippool

将ipipMode改为crossSubnet


在UI将calico-node的POD删了重建

重启检查calico网络

可以看见同子网的主机出口走的是bgp,不同子网主机走的是tunl0网卡走ipip模式
验证
创建应用测试跨主机网络,在不同主机上互相ping测试,看看跨主机网络是否正常。

配置Route reflector

安装方式
Single host上面binary安装
Single host上面continer安装
作为k8s pod运行
实际经验:
Binary方式在集群里面的一台worker节点安装(比如RR)
calicoctl会检测bird/felix的运行状态
在非calico node节点运行只能使用部分命令,不能运行calico node相关命令
通过配置calicoctl来对calico进行控制,通常情况下建议将

1
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.13.3/calicoctl

配置可执行权限

1
chmod +x calicoctl

复制的/usr/bin/目录

1
cp calicoctl /usr/bin/

配置calicoctl连接Kubernetes集群

1
2
3
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 mesh

1
2
3
4
5
6
7
8
9
10
11
cat <<EOF | calicoctl apply -f -
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
nodeToNodeMeshEnabled: false
asNumber: 63400
EOF

设置Route reflector
配置Route reflector支持多种配置方式如:1、支持配置全局BGP peer,。2、支持针对单个节点进行配置BGP Peer。也可以将calico节点充当Route reflector 这里以配置calico节点充当Router reflector为例。

配置节点充当BGP Route Reflector

可将Calico节点配置为充当路由反射器。为此,要用作路由反射器的每个节点必须具有群集ID-通常是未使用的IPv4地址。

要将节点配置为集群ID为244.0.0.1的路由反射器,请运行以下命令。这里将节点名为rke-node4的节点配置为Route Reflector,若一个集群中要配置主备rr,为了防止rr之间的路由环路,需要将集群ID配置成一样

1
calicoctl patch node rke-node4 -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'

给节点打上对应的label标记该节点以表明它是Route Reflector,从而允许BGPPeer资源选择它。

1
kubectl label node rke-node4 route-reflector=true

创建BGPPeer

1
2
3
4
5
6
7
8
9
10
11
export CALICO_DATASTORE_TYPE=kubernetes
export CALICO_KUBECONFIG=~/.kube/config
cat <<EOF | calicoctl apply -f -
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: peer-with-route-reflectors
spec:
nodeSelector: all()
peerSelector: route-reflector == 'true'
EOF

查看BGP节点状态
node上查看,peer type由node-to-node mesh变为 node specific

Route Reflector上节点查看,节点已正常建立连接