一、Calico介绍

Calico是一个纯3层的数据中心网络方案。能够提供可控的VM、容器、裸机之间的IP通信。

通过将整个互联网的可扩展IP网络原则压缩到数据中心级别,Calico在每一个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成。

这样保证最终所有的workload之间的数据流量都是通过IP路由的方式完成互联的。

网络维护 - Calico - 图1

Calico节点组网可以直接利用数据中心的网络结构(无论是L2或者L3),不需要额外的NAT,隧道或者Overlay Network。

网络维护 - Calico - 图2

如上图所示,这样保证这个方案的简单可控,而且没有封包解包,节约CPU计算资源的同时,提高了整个网络的性能。

此外,Calico基于iptables还提供了丰富而灵活的网络Policy,保证通过各个节点上的ACLs来提供Workload的多租户隔离、安全组以及其他可达性限制等功能。

1.1 Calico 架构

网络维护 - Calico - 图3

  • Felix,Calico Agent,跑在每台需要运行Workload的节点上,主要负责配置路由及ACLs等信息来确保Endpoint的连通状态;

  • etcd,分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性;

  • BGP Client(BIRD), 主要负责把Felix写入Kernel的路由信息分发到当前Calico网络,确保Workload间的通信的有效性;

  • BGP Route Reflector(BIRD),大规模部署时使用,摒弃所有节点互联的 mesh 模式,通过一个或者多个BGP Route Reflector来完成集中式的路由分发;

二、对接云帮

2.1 云帮Calico架构图

网络维护 - Calico - 图4

2.2 Calico在云帮实现的功能

容器网络的互连

Calico在每一个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成。 这样保证最终所有的workload之间的数据流量都是通过IP路由的方式完成互联。

隔离租户

Calico基于iptables提供了丰富而灵活的网络Policy,保证通过各个节点上的ACLs来提供Workload的多租户隔离、安全组以及其他可达性限制等功能。

2.3 k8s结合calico的使用

k8s与calico流程架构图

网络维护 - Calico - 图5

  • 通过k8s创建启动网络容器,通过calico-cni插件根据cni的配置然后分配calico的网络。

CNI配置文件介绍

  1. cat /etc/goodrain/cni/net.d/10-calico.conf
  2. {
  3. "name": "calico-k8s-network", ##网络的名字
  4. "cniVersion": "0.1.0", ##CNI标准的版本号
  5. "type": "calico", ##网络插件的类型
  6. "etcd_endpoints": "http://127.0.0.1:2379", ##etcd地址
  7. "log_level": "info", ##日志级别
  8. "ipam": {
  9. "type": "calico-ipam" ##ipam的类型
  10. },
  11. "kubernetes": {
  12. "kubeconfig": "/etc/goodrain/kubernetes/admin.kubeconfig". ##kubeconfig文件路径
  13. }
  14. }

三、Calico性能测试

3.1 测试环境

系统CentOS7.3
宿主机的主机名宿主机IP容器IP
calico110.80.84.49172.19.183.195
calico210.81.9.113172.19.189.196
  • 测试工具:iperf 命令

3.2 宿主机测试

  • calico2执行命令
  1. [root@calico2 ~]# iperf -s calico1
  2. iperf: ignoring extra argument -- calico1
  3. ------------------------------------------------------------
  4. Server listening on TCP port 5001
  5. TCP window size: 85.3 KByte (default)
  6. ------------------------------------------------------------
  • calico1执行命令

  1. [root@calico1 ~]# iperf -c calico2 -i 2

Client connecting to calico2, TCP port 5001

TCP window size: 85.0 KByte (default)

[ 3] local 10.80.84.49 port 33618 connected with 10.81.9.113 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 2.0 sec 186 MBytes 781 Mbits/sec
[ 3] 2.0- 4.0 sec 130 MBytes 547 Mbits/sec
[ 3] 4.0- 6.0 sec 124 MBytes 522 Mbits/sec
[ 3] 6.0- 8.0 sec 124 MBytes 519 Mbits/sec
[ 3] 8.0-10.0 sec 124 MBytes 521 Mbits/sec
[ 3] 0.0-10.1 sec 689 MBytes 571 Mbits/sec

  • 以上测试是客户端calico1到服务端calico2的上行带宽测试

3.3 容器测试

  • 在calico1宿主机上的容器端执行命令
  1. rain@36a969da35df472eaab75d71c6b27c11-fr3c2:~$ iperf -s 172.19.189.196
  2. iperf: ignoring extra argument -- 172.19.189.196
  3. ------------------------------------------------------------
  4. Server listening on TCP port 5001
  5. TCP window size: 85.3 KByte (default)
  6. ------------------------------------------------------------
  • 在calico2宿主机的容器执行命令

  1. rain@36a969da35df472eaab75d71c6b27c11-8k3kw:~$ iperf -c 172.19.183.195 -i 2

Client connecting to 172.19.183.195, TCP port 5001

TCP window size: 85.0 KByte (default)

[ 3] local 172.19.189.196 port 54252 connected with 172.19.183.195 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 2.0 sec 179 MBytes 750 Mbits/sec
[ 3] 2.0- 4.0 sec 115 MBytes 481 Mbits/sec
[ 3] 4.0- 6.0 sec 126 MBytes 530 Mbits/sec
[ 3] 6.0- 8.0 sec 115 MBytes 481 Mbits/sec
[ 3] 8.0-10.0 sec 113 MBytes 476 Mbits/sec
[ 3] 0.0-10.0 sec 648 MBytes 543 Mbits/sec

  • 以上测试是客户端calico1的容器到服务端calico2中容器的上行带宽测试

3.4 结论

  • 通过测试对比我们发现使用calico中容器之间的网络与宿主机的消耗是非常小的。

四、Calico维护

4.1 Calico的常用资源

资源说明
node物理机连接数
ipPoolcalico的ip池
policy节点的资源
profile配置文件的资源

4.2 Calico对资源的常用操作

  • 资源常用命令

命令用途create创建apply增加delete删除replace修改get查看

  • 操作资源格式calicoctl <COMMAND> -f <FILE_NAME>

  • 例:添加一个calico的ip池calicoctl apply -f ippool.yaml

查看命令
查看节点连接状态calicoctl node status
查看状态信息命令格式calicoctl get < NAME >
以文件格式查看详细信息的命令格式calicoctl get < NAME > -o yaml
  • 例:以文件形式查看calico的ip池信息calicoctl get ippool -o yaml

4.3 Calico连接的ip更改

  • 以下为示例环境

测试环境

系统CentOS 7.3
主机名ip
calico110.80.84.49
calico210.81.9.113

查看Calico节点之间当前连接状态与IP

calicoctl node status

修改calico-node的启动文件进行修改calico连接的ip(所有节点都要改)

  • vim /usr/lib/systemd/system/calico-node.service

  • 主要修改第18行-e IP_AUTODETECTION_METHOD=first-found \IP_AUTODETECTION_METHOD这个是calico默认的变量,这个变量是自动检测ip(一般为公网ip)

  • 我们可以修改成指定的变量或IP把 -e IP_AUTODETECTION_METHOD=first-found \改成-e IP=${DEFAULT_IPV4} \

  1. cat /usr/lib/systemd/system/calico-node.service
  2. [Unit]
  3. Description=calicoctl node
  4. After=docker.service
  5. Requires=docker.service
  6. [Service]
  7. User=root
  8. EnvironmentFile=/etc/goodrain/envs/calico.sh #calico的配置文件
  9. PermissionsStartOnly=true
  10. ExecStartPre=-/usr/bin/docker rm -f calico-node
  11. #ExecStart=/usr/share/gr-calico/scripts/start-calico.sh
  12. ExecStart=/usr/bin/docker run --net=host \
  13. --privileged \
  14. --name=calico-node \
  15. --restart=always \
  16. -e NO_DEFAULT_POOLS= \
  17. -e CALICO_LIBNETWORK_ENABLED=true \
  18. -e IP=${DEFAULT_IPV4} \ # #calico的IP连接地址(修改连接ip就修改的这里)
  19. -e CALICO_LIBNETWORK_CREATE_PROFILES=true \
  20. -e CALICO_LIBNETWORK_LABEL_ENDPOINTS=false \
  21. -e CALICO_LIBNETWORK_IFPREFIX=cali \
  22. -e NODENAME=${HOSTNAME} \
  23. -e CALICO_NETWORKING_BACKEND=bird \
  24. -e IP6_AUTODETECTION_METHOD=first-found \
  25. -e ETCD_ENDPOINTS=${ETCD_ENDPOINTS} \
  26. -v /var/log/calico:/var/log/calico \
  27. -v /var/run/calico:/var/run/calico \
  28. -v /lib/modules:/lib/modules \
  29. -v /run/docker/plugins:/run/docker/plugins \
  30. -v /var/run/docker.sock:/var/run/docker.sock \
  31. ${NODE_IMAGE}
  32. Restart=always
  33. ExecStop=-/usr/bin/docker stop calico-node
  34. RestartSec=10
  35. [Install]
  36. WantedBy=multi-user.target

查看该变量的内容

  1. [root@calico1 ~]# cat /etc/goodrain/envs/calico.sh
  2. DEFAULT_IPV4=10.80.84.49
  3. ETCD_ENDPOINTS=http://127.0.0.1:2379
  4. NODE_IMAGE=hub.goodrain.com/dc-deploy/calico-node:v2.4.1

修改完重启查看连接信息

  1. [root@calico2 ~]# systemctl daemon-reload
  2. [root@calico2 ~]# systemctl restart calico-node.service
  3. [root@calico2 ~]# calicoctl node status
  4. Calico process is running.
  5. IPv4 BGP status
  6. +--------------+-------------------+-------+----------+-------------+
  7. | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
  8. +--------------+-------------------+-------+----------+-------------+
  9. | 10.80.84.49 | node-to-node mesh | up | 07:12:52 | Established |
  10. +--------------+-------------------+-------+----------+-------------+
  11. IPv6 BGP status
  12. No IPv6 peers found.