WHAT Calico

       Calico是一个纯三层的协议,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议可达信息(路由)到剩余数据中心。与 Flannel 不同的是 Calico 不使用隧道或 NAT 来实现转发,而是巧妙的把所有二三层流量转换成三层流量,并通过 host 上路由配置完成跨 Host 转发

      把 Host 当作 Internet 中的路由器,同样使用 BGP 同步路由,并使用 iptables 来做安全访问策略,最终设计出了 Calico 方案

 

WHY Calico

     多数的虚拟化平台实现中,通常使用二层隔离技术实现 workloads 的网络,二层的技术有一些弊端,比如依赖 VLAN、bridge 和隧道等技术,其中 bridge 带来了复杂性,vlan 隔离和 tunnel 隧道则消耗更多的资源并对物理环境有要求,随着网络规模的增大,整体会变得越加复杂

     二层网络通讯需要依赖广播消息机制,广播消息的开销与 host 的数量呈指数级增长,Calico 使用的三层路由方法,则完全抑制了二层广播,减少了资源开销

    参考: https://www.projectcalico.org/why-calico/

 

HOW Calico

     Calico在每一个节点利用高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息向整个Calico广播,小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成

Calico组件:

     Felix:Calico agent     运行在每台node上,为容器设置网络信息:IP,路由规则,iptable规则等

     BIRD:  BGP Client: 监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播告诉其他 Host 节点,从而实现网络互通

     BGP Route Reflector: 大型网络仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,所有节点需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数

     calicoctl: calico命令行管理工具

 

Calico网络方式(两种)

  •     IPIP 把 IP 层封装到 IP 层的一个 tunnel。的作用其实基本上就相当于一个基于IP层的网桥!一般来说,普通的网桥是基于mac层的,根本不需 IP,而这个 ipip 则是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。
  •      BGP 边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。BGP不使用传统的内部网关协议(IGP)的指标
     

数据包转发过程

  •     容器内所有数据包都转发到一个虚假的地址 169.254.1.1,发送 ARP 请求 
  •     Host 的 veth 端收到 ARP 请求时开启网卡的 proxy arp 功能把自己的 MAC 地址返回给容器
  •     使用了 169.254.1.1 这样的地址,Host 判断为三层路由转发,查询本地路由发送给对端 host,如果配置 BGP,这里会看到 proto 协议为 BIRD
  •     当 host 收到数据包时查找本地路由表匹配,转发到对应的 veth 端从而到达容器

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         169.254.1.1     0.0.0.0         UG    0      0        0 eth0
169.254.1.1     0.0.0.0         255.255.255.255 UH    0      0        0 eth0

 

参考:

    https://docs.projectcalico.org/v3.8/reference/architecture/

 

calico 部署

   Installing with the Kubernetes API datastore—50 nodes or less

下载 calico.yaml

curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -O

修改pod的子网掩妈

POD_CIDR="<your-pod-cidr>" \
sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" calico.yaml

Apply the manifest using the following command.

kubectl apply -f calico.yaml

 

   参考: https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/calico

     

ConfigMap部分主要参数

   如果使用 etcd 作为 store 后端

  •  etcd_endpoints:参数指定etcd的地址,可以使用K8S Master所用的etcd,也可以另外搭建。
  • calico_backend:Calico的后端,默认为bird
  • cni_network_config:符合CNI规范的网络配置,其中type=calico表示,Kubelet从 CNI_PATH(默认为/opt/cni/bin)找名为calico的可执行文件,用于容器IP地址的分配。
  • etcd如果配置了TLS安全认证,需要指定相应的ca、cert、key等文件

  # Configure this with the location of your etcd cluster.
  etcd_endpoints: "http://192.168.1.8:2379"
  # If you're using TLS enabled etcd uncomment the following.
  # You must also populate the Secret below with these files.
  etcd_ca: ""   # "/calico-secrets/etcd-ca"
  etcd_cert: "" # "/calico-secrets/etcd-cert"
  etcd_key: ""  # "/calico-secrets/etcd-key"
  # Typha is disabled.
  typha_service_name: "none"
  # Configure the backend to use.
  calico_backend: "bird"

 

calico-node initcontainers 做的事情

   install-cni:在各Node上安装CNI二进制文件到/opt/cni/bin目录下,并安装相应的网络配置文件到/etc/cni/net.d目录下

      initContainers:
        # This container performs upgrade from host-local IPAM to calico-ipam.
        # It can be deleted if this is a fresh installation, or if you have already
        # upgraded to use calico-ipam.
        - name: upgrade-ipam
          image: calico/cni:v3.7.4
          command: ["/opt/cni/bin/calico-ipam", "-upgrade"]
        # This container installs the CNI binaries
        # and CNI network config file on each node.
        - name: install-cni
          image: calico/cni:v3.7.4
          command: ["/install-cni.sh"]
 

 

calico-node服务的主要参数:

         CALICO_IPV4POOL_CIDR: Calico IPAM的IP地址池,Pod的IP地址将从该池中进行分配。

         CALICO_IPV4POOL_IPIP:是否启用IPIP模式,Calico将在node上创建一个tunl0的虚拟隧道。使用IPIP模式时,设置 CALICO_IPV4POOL_IPIP="always",不使用IPIP模式时,设置为"off",此时将使用BGP模式。

 

生成的配置 /etc/cni/net.d/10-calico.conflist 

# cat 10-calico.conflist 
{
  "name": "k8s-pod-network",
  "cniVersion": "0.3.0",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "master-node",
      "mtu": 1440,
      "ipam": {
          "type": "calico-ipam"
      },
      "policy": {
          "type": "k8s"
      },
      "kubernetes": {
          "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "portmap",
      "snat": true,
      "capabilities": {"portMappings": true}
    }
  ]
}

 

calicoctl 配置,datastoreType 使用kubernetes

 # cat /etc/calico/calicoctl.cfg 
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "kubernetes"
  kubeconfig: "/root/.kube/config"

# calicoctl node status
Calico process is running.

IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+---------------+-------------------+-------+----------+-------------+
| 192.168.73.44 | node-to-node mesh | up    | 07:34:34 | Established |
+---------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

 

calico 缺点 

  • 路由的数目与容器数目相同,非常容易超过路由器、三层交换、甚至node的处理能力,从而限制了整个网络的扩张。(可以使用大规模方式解决)
  • 每个node上会设置大量(海量)的iptables规则、路由,运维、排障难度大。
  • 原理决定了它不可能支持VPC,容器只能从calico设置的网段中获取ip。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐