Calico
简介
Calico为容器和虚拟机提供安全的网络连接。
Calico创建并管理第3层平面网络,为每个宿主(容器、VM)分配一个完全可路由的IP地址。
Calico是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心。
工作负载可以在没有IP封装或网络地址转换的情况下进行通信,以实现裸机性能,更轻松的故障排除和更好的互操作性。
在需要覆盖的环境中,Calico使用IP-in-IP tunneling或可以与其他overlay 网络如flannel一起使用。
Calico还提供网络安全规则的动态控制。
使用Calico简单的策略语言,您可以实现对容器,虚拟机工作负载和裸机主机端点之间通信的精细控制。
已经可以应用在Kubernetes, OpenShift, and OpenStack中。
工作原理
Calico利用Linux内核本地的路由和iptables firewall功能。
故如果采用Calico的话,宿主上会存在大量的iptables规则,在节点规模大的情况下,根本无法维护。
所有来自容器,虚拟机和主机的所有流量在路由到其目标之前,都会遍历这些内核中的规则。

calicoctl:通过简单的命令行界面实现高级策略和网络连接。
orchestrator plugin:负责和k8s等进行协调
key/value store:保存Calico的策略和网络配置状态。
calico/node:在每个主机上运行,从键/值存储中读取相关的策略和网络配置信息,并在Linux内核中实现。
Calico部署
参考calico
k8s集群
1 | [root@node-141 etcd-v3.1.5-linux-amd64]# ./etcd -name 141etcd -data-dir '/var/lib/etcd/141etcd' -advertise-client-urls 'http://12.12.223.141:2379' --listen-client-urls 'http://12.12.223.141:2379' & |
做完下面的第4小步,再启动kubelet
calico部署
参考calico
- 用calicoctl启动calico node(会以docker方式起)
1 | # Download and install `calicoctl` |
- 下载kubelet需要的cni plugin
1 | wget -N -P /opt/cni/bin https://github.com/projectcalico/cni-plugin/releases/download/v1.10.0/calico |
- 下载standard CNI lo plugin
1 | wget https://github.com/containernetworking/cni/releases/download/v0.3.0/cni-v0.3.0.tgz |
- cni配置
1 | mkdir -p /etc/cni/net.d |
我的配置如下:
1 | [root@151node calico]# cat /etc/cni/net.d/10-calico.conf |
- 下载policy-controller.yaml
1 | # wget https://docs.projectcalico.org/v2.5/getting-started/kubernetes/installation/policy-controller.yaml |
- 启动calico node,所有节点都执行
1 | [root@152node calico]# sudo ETCD_ENDPOINTS=http://12.12.223.141:2379 ./calicoctl node run --node-image=quay.io/calico/node:v2.5.1 |
- 效果
1 | [root@151node calico]# sudo ETCD_ENDPOINTS=http://12.12.223.141:2379 ./calicoctl node status |
calicoctl node status的时候至少需要两个或以上节点才能建立Bgp连接,如果是AllInOne的部署,单节点当然没有bgp邻居45。
- 管理ip pool,其中
192.168.0.0/16为calico默认的ip pool
1 | [root@151node calico]# sudo ETCD_ENDPOINTS=http://12.12.223.141:2379 ./calicoctl get pool -o wide |
测试连通性
1 | [root@151node yaml]# cat registry.yaml |
node ping 分布在自身的pod
1 | [root@151node yaml]# kubectl get po -o wide |
可以看出calico给每个pod和本地node之间建立了一个veth对
151node ping 另外一个node的pod
1 | # kubectl get pod |
如果跨node ping不同,可能是iptables规则的问题,执行iptables -F