Calico网络

一、Calico介绍

Rainbond默认使用Calico定义容器虚拟网络。

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

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

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

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

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

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

1.1 Calico 架构

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

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

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

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

二、对接Rainbond

2.1 Rainbond-Calico架构图

2.2 Calico在Rainbond实现的功能
  • 容器网络的互连

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

  • 隔离租户

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

2.3 k8s结合calico的使用
  • k8s与calico流程架构图

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

  • CNI配置文件介绍

cat /opt/rainbond/etc/cni/10-calico.conf
{
    "name": "calico-k8s-network",    ##网络的名字
    "cniVersion": "0.1.0",           ##CNI标准的版本号
    "type": "calico",                 ##网络插件的类型
    "etcd_endpoints": "http://127.0.0.1:2379", ##etcd地址
    "log_level": "info",     ##日志级别
    "ipam": {            
        "type": "calico-ipam"    ##ipam的类型
    },
    "kubernetes": {
        "kubeconfig": "/opt/rainbond/etc/kubernetes/kubecfg/admin.kubeconfig".  ##kubeconfig文件路径
    }
}

三、Calico性能测试

3.1 测试环境
系统 CentOS7.4
宿主机的主机名 宿主机IP 容器IP
calico1 10.80.84.49 172.19.183.195
calico2 10.81.9.113 172.19.189.196
  • 测试工具:iperf 命令
3.2 宿主机测试
  • calico2执行命令
[root@calico2 ~]# iperf -s calico1
iperf: ignoring extra argument -- calico1
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
  • calico1执行命令
[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宿主机上的容器端执行命令
rain@36a969da35df472eaab75d71c6b27c11-fr3c2:~$ iperf  -s  172.19.189.196

iperf: ignoring extra argument -- 172.19.189.196
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
  • 在calico2宿主机的容器执行命令
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 物理机连接数
ipPool calico的ip池
policy 节点的资源
profile 配置文件的资源
  • 资源使用yaml文件描述

详细资源与格式介绍

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启动参数

calico启动配置文件路径为 /etc/systemd/system/calico.service

[Unit]
Description=calico
After=docker.service

[Service]
ExecStartPre=-/bin/bash -c 'docker rm calico'
ExecStart=/bin/bash -c '/usr/bin/docker run --net=host  --privileged  --name=calico   --restart=always  -e NO_DEFAULT_POOLS=  -e CALICO_LIBNETWORK_ENABLED=true -e CALICO_IPV4POOL_IPIP=always  -e IP=10.10.10.19  -e CALICO_IPV4POOL_CIDR=10.20.0.0/16 -e CALICO_LIBNETWORK_CREATE_PROFILES=true  -e CALICO_LIBNETWORK_LABEL_ENDPOINTS=false  -e CALICO_LIBNETWORK_IFPREFIX=cali  -e NODENAME=node1 -e CALICO_NETWORKING_BACKEND=bird  -e IP6_AUTODETECTION_METHOD=first-found  -e ETCD_ENDPOINTS=http://10.10.10.19:2379 -v /var/log/calico:/var/log/calico  -v /var/run/calico:/var/run/calico  -v /lib/modules:/lib/modules -v /var/lib/calico:/var/lib/calico -v /run/docker/plugins:/run/docker/plugins  -v /var/run/docker.sock:/var/run/docker.sock  goodrain.me/calico-node:v3.3.1'
ExecStop=/bin/bash -c 'docker stop calico'
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

五、其它可支持的网络组件

Rainbond还支持midonet、flannel网络组件。