1、Calico介绍
Calico不会有任何网桥!!!
它会为每一个容器创建一个Veth pair 设备,一端在容器内,一端设置到宿主机上
数据的转发,靠 Calico 维护的路由规则
它是基于三层的二层通信
三层指的是实际物理网络架构
二层通信指的是,需要维护「MAC 地址级别的信息」,即「虚拟IP」与「MAC 地址」的映射关系
Calico是一个纯三层的协议,为OpenStack虚机和Docker容器提供多主机间通信。
Calico不使用重叠网络比如flannel和libnetwork重叠网络驱动,它是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心。
2、Calico 结构组成
3、Calico网络方式(两种)
备注:什么是vxlan
什么是VXLAN?
VXLAN,即Virtual Extensible LAN(虚拟可扩展局域网),是Linux本身支持的一网种网络虚拟化技术。VXLAN可以完全在内核态实现封装和解封装工作,从而通过“隧道”机制,构建出覆盖网络(Overlay Network)
VXLAN的设计思想是:
在现有的三层网络之上,“覆盖”一层虚拟的、由内核VXLAN模块负责维护的二层网络,使得连接在这个VXLAN二层网络上的“主机”(虚拟机或容器都可以),可以像在同一个局域网(LAN)里那样自由通信。
为了能够在二nfcu网络上打通“隧道”,VXLAN会在宿主机上设置一个特殊的网络设备作为“隧道”的两端,叫VTEP:VXLAN Tunnel End Point(虚拟隧道端点)
简而言之:
- 不需要关注 VTEP 与 VTEP 设备之间的通信(如何跨网段,如何进行三层网络的连通)
- 只需关注,将数据包传给当前 VTEP 设备后,如何获取目的 VTEP 的 MAC 地址,完成二层通信
4、Calico实验部署
Calico的原理理解起来,不是那么容易,
我们可以先进行搭建,再进行理解,下图是calico的跨主机通信
本次实验使用3台主机进行部署测试,菜单信息如下
开启中继路由、转发
防火墙设置
分发刚配置的文件到26、27机器
部署etcd集群
修改80.26/80.27这2台分发的配置文件为各自的主机IP及主机名
这三台机器就组成了etcd集群 ,注意hosts文件要添加上cat /etc/hosts,为后期映射准备
启动etcd
查看集群各节点信息
集成docker 和 etcd
在三台机器的docker.service中添加 --cluster-store=etcd://机器ip:2379
vim /usr/lib/systemd/system/docker.service
# 如下图所示,我的是
--cluster-store=etcd://192.168.80.25:2379
--cluster-store=etcd://192.168.80.26:2379
--cluster-store=etcd://192.168.80.27:2379
重启docker服务
systemctl daemon-reload
systemctl restart docker.service
systemctl status docker.service
如果出现上图报错,把原来【vim /usr/lib/systemd/system/docker.service】中除了我们添加的部分删除,即可重启成功
再次重启docker服务
下载calicoctl
calicoctl上传主机后将mv到/usr/bin/目录
启动calico服务
在Docker环境中Calico服务是做为容器来运行的,使用host的网络配置。
所有容器配置使用Calico服务,做为calico节点互相通信。
Calico在每个主机上通过一个自己的container与其他主机或者网络通讯
所以在三个节点上都要下载calico的node镜像
创建calico容器
查看calico状态
以上测试说明calico集群网络正常
添加calico子网
3台机器全部创建:
calicoctl get ipPool
calicoctl create-f ipPool.yaml
calicoctl get ipPool -o wide
创建IP池子
接着在上面创建的ip pool(192.168.10.0/24、192.168.20.0/24、192.168.30.0/24)里创建子网络。
可以从三个中选择一个或两个或全部去创建子网络。
如下创建了calico-net1,calico-net2和calico-net3三个不同的网络。
创建命令可以在任意一个节点上执行即可。
由于三个节点使用的是同一套etcd,所以子网络创建后,在其他两个节点上都可以通过
docker network 1s命令查看到生成的网络信息
--driver calico 网络使用calico驱动
--ipam-driver calico-ipam : 指定calico 的ipam 驱动管理ip
-subnet:指定calico-net1、calico-net2、calico-net3
这三个网段是global网段,etcd会将它们三个同步到所有的机器
开启ipv6转发,在各个节点上使用上面创建的三个子网去创建容器。
echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
80-25
docker run -itd --net calico-net1 --name docker-test1 busybox
docker run -itd --net calico-net2 --name docker-test11 busybox
docker run -itd --net calico-net3 --name docker-test111 busybox
80-26
docker run -itd --net calico-net1 --name docker-test2 busybox
docker run -itd --net calico-net2 --name docker-test22 busybox
docker run -itd --net calico-net3 --name docker-test222 busybox
80-27
docker run -itd --net calico-net1 --name docker-test3 busybox
docker run -itd --net calico-net2 --name docker-test33 busybox
docker run -itd --net calico-net3 --name docker-test333 busybox
查看各节点IP
测试网络是否ping通
docker exec -it docker-test1 ping -c 2 docker-test2.calico-net1
docker exec -it docker-test1 ping -c 2 docker-test3.calico-net1
docker exec -it docker-test11 ping -c 2 docker-test22.calico-net2
docker exec -it docker-test11 ping -c 2 docker-test33.calico-net2
docker exec -it docker-test111 ping -c 2 docker-test222.calico-net3
docker exec -it docker-test111 ping -c 2 docker-test333.calico-net3
全部正常ping同,说明网络正常通信
5、总结
1、同一网段里面容器互相Ping的通(即使不在同一个节点上,只要创建容器时使用的是同一个子网段)
2、不在同一个子网段的容器是Ping不通的
3、宿主机能Ping通他自身的所有容器ip,但不能ping通其他节点上的容器IP
4、所有节点的容器都能Ping通其他节点的宿主机ip
即-在calico默认设置下,只允许位于同一网络中的容器之间通信,这样就实现了容器的跨主机互连,
也可以更好实现网络隔离效果,位于不通网络下的容器想要通信,就要依赖calico的policy策略来实现了。