• Calico
    • Calico架构
    • IP-in-IP
    • Calico CNI
    • Calico CNM
    • Calico Kubernetes
    • Calico的不足

    Calico

    Calico 是一个纯三层的数据中心网络方案(不需要Overlay),并且与OpenStack、Kubernetes、AWS、GCE等IaaS和容器平台都有良好的集成。

    Calico在每一个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成。 这样保证最终所有的workload之间的数据流量都是通过IP路由的方式完成互联的。Calico节点组网可以直接利用数据中心的网络结构(无论是L2或者L3),不需要额外的NAT,隧道或者Overlay Network。

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

    Calico架构

    Calico - 图1

    Calico主要由Felix、etcd、BGP client以及BGP Route Reflector组成

    1. Felix,Calico Agent,跑在每台需要运行Workload的节点上,主要负责配置路由及ACLs等信息来确保Endpoint的连通状态;
    2. etcd,分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性;
    3. BGP Client(BIRD), 主要负责把Felix写入Kernel的路由信息分发到当前Calico网络,确保Workload间的通信的有效性;
    4. BGP Route Reflector(BIRD),大规模部署时使用,摒弃所有节点互联的 mesh 模式,通过一个或者多个BGP Route Reflector来完成集中式的路由分发。
    5. calico/calico-ipam,主要用作Kubernetes的CNI插件

    Calico - 图2

    IP-in-IP

    Calico控制平面的设计要求物理网络得是L2 Fabric,这样vRouter间都是直接可达的,路由不需要把物理设备当做下一跳。为了支持L3 Fabric,Calico推出了IPinIP的选项。

    Calico CNI

    见https://github.com/projectcalico/cni-plugin。

    Calico CNM

    Calico通过Pool和Profile的方式实现了docker CNM网络:

    1. Pool,定义可用于Docker Network的IP资源范围,比如:10.0.0.0/8或者192.168.0.0/16;
    2. Profile,定义Docker Network Policy的集合,由tags和rules组成;每个 Profile默认拥有一个和Profile名字相同的Tag,每个Profile可以有多个Tag,以List形式保存。

    具体实现见https://github.com/projectcalico/libnetwork-plugin,而使用方法可以参考http://docs.projectcalico.org/v2.1/getting-started/docker/。

    Calico Kubernetes

    见http://docs.projectcalico.org/v2.1/getting-started/kubernetes/.

    For Kubeadm 1.5 with Kubernetes 1.5.x:

    1. kubectl apply -f http://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/hosted/kubeadm/1.5/calico.yaml

    For Kubeadm 1.6 with Kubernetes 1.6.x:

    1. kubectl apply -f http://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

    这会在Pod中启动Calico-etcd,在所有Node上启动bird6、felix以及confd,并配置CNI网络为calico插件:

    Calico - 图3

    1. # Calico相关进程
    2. $ ps -ef | grep calico | grep -v grep
    3. root 9012 8995 0 14:51 ? 00:00:00 /bin/sh -c /usr/local/bin/etcd --name=calico --data-dir=/var/etcd/calico-data --advertise-client-urls=http://$CALICO_ETCD_IP:6666 --listen-client-urls=http://0.0.0.0:6666 --listen-peer-urls=http://0.0.0.0:6667
    4. root 9038 9012 0 14:51 ? 00:00:01 /usr/local/bin/etcd --name=calico --data-dir=/var/etcd/calico-data --advertise-client-urls=http://10.146.0.2:6666 --listen-client-urls=http://0.0.0.0:6666 --listen-peer-urls=http://0.0.0.0:6667
    5. root 9326 9325 0 14:51 ? 00:00:00 bird6 -R -s /var/run/calico/bird6.ctl -d -c /etc/calico/confd/config/bird6.cfg
    6. root 9327 9322 0 14:51 ? 00:00:00 confd -confdir=/etc/calico/confd -interval=5 -watch --log-level=debug -node=http://10.96.232.136:6666 -client-key= -client-cert= -client-ca-keys=
    7. root 9328 9324 0 14:51 ? 00:00:00 bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bird.cfg
    8. root 9329 9323 1 14:51 ? 00:00:04 calico-felix
    1. # CNI网络插件配置
    2. $ cat /etc/cni/net.d/10-calico.conf
    3. {
    4. "name": "k8s-pod-network",
    5. "cniVersion": "0.1.0",
    6. "type": "calico",
    7. "etcd_endpoints": "http://10.96.232.136:6666",
    8. "log_level": "info",
    9. "ipam": {
    10. "type": "calico-ipam"
    11. },
    12. "policy": {
    13. "type": "k8s",
    14. "k8s_api_root": "https://10.96.0.1:443",
    15. "k8s_auth_token": "<token>"
    16. },
    17. "kubernetes": {
    18. "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
    19. }
    20. }
    21. $ cat /etc/cni/net.d/calico-kubeconfig
    22. # Kubeconfig file for Calico CNI plugin.
    23. apiVersion: v1
    24. kind: Config
    25. clusters:
    26. - name: local
    27. cluster:
    28. insecure-skip-tls-verify: true
    29. users:
    30. - name: calico
    31. contexts:
    32. - name: calico-context
    33. context:
    34. cluster: local
    35. user: calico
    36. current-context: calico-context

    Calico - 图4

    Calico的不足

    • 既然是三层实现,当然不支持VRF
    • 不支持多租户网络的隔离功能,在多租户场景下会有网络安全问题
    • Calico控制平面的设计要求物理网络得是L2 Fabric,这样vRouter间都是直接可达的

    参考文档

    • https://xuxinkun.github.io/2016/07/22/cni-cnm/
    • https://www.projectcalico.org/
    • http://blog.dataman-inc.com/shurenyun-docker-133/