盒子
盒子
文章目录
  1. 架构
  2. 准备
  3. 安装calicoctl
  4. 使用

部署Docker Calico网络

Calico是一种虚拟网络解决方案,不像其他的Weave、Flannel等专门支持Docker的方案,Calico支持容器、虚拟机、裸机服务等多种。同样他支持Kubernetes的CNI方案和Docker自己的CNM方案。在之前的公司做基于Mesos/Marathon的私有容器云的时候也选用这个这个方案。

架构

Calico主要由几个互相依赖的组建组成,这些组件包括FelixOrchestrator pluginetcdBIRDBGP Route Reflector (BIRD)

Felix

它是运行在每一个节点上的一个代理,为诸如每个节点上的容器或者虚拟机提供端口。负责路由的维护和ACL权限的控制以为每个主机端口提供需要的连接。

Calico支持多种环境,因此依赖于不同的环境Felix负责的任务包括:

  • 处理接口到系统内核的信息从而从内核中获取到来正确的处理通过入口所产生的流量;他通常就是确保主机通过其上的MAC地址响应来自每一个workload上ARP请求,并且转发IP包到他所管理的接口。通常在创建一个容器后,Felix就会系统网络中创建一个calic开头的网络接口,即它会监控接口的创建与清理以此确保对这些接口的编程应用在合适的时间。
  • 还负责规划端口到主机内核中FIB的路由,这确保了到达主机端口上的数据包得到响应的转发。
  • 还会负责在Linux内核中ACL的规划,这些ACL用来保证仅仅只有有效的流量能在端口之间发送,也确保了端口不能绕过Calico的安全措施。
  • 最后它还负责提供网络健康状态的数据,它会报告主机配置的一些错误和问题。这些数据会被写入到etcd使其他组件和网络维护人员可见。

Orchestrator插件

它主要是适配不同的平台,比如OpenStack或者Kubernetes。其主要目的就在于绑定Calico与对应平台的,以使用户可以使用对应平台的工具来管理Calico网络。比如Calico的Neutron ML2驱动就是一个插件,它可以集成Neutron’s ML2插件然后让用户通过Neutron API的调用来配置和管理Calico网络。

插件提供的功能包括:

  • 它包含网络管理的的API集合,然后以翻译这些API转换成 Calico的数据模型并存储在Calico的存储系统中。
  • 其次就是提供一些网络的反馈,比如提供Felix存活情况的信息,当网络安装失败标记一些端口为失败的。

etcd

etcd本身是一个分布式的KV存储,Calico使用它来完成不同组件之间的通信协作,以及确保Calico总是能构建一个正确的网络需要的一致性存储系统。

BGP Client

Calico会在每一个Felix的主机节点上部署一个BGP客户端,BGP客户端的角色用来读取Felix编程到内核的路由状态并且分发这些路由到整个数据中心。最主要的功能就是路由分发。

BGP Route Reflector

一些大规模的部署,简单的BGP成为一个瓶颈,因为需要每个BGP客户端连接到整个网络拓扑的其他BGP客户端,这就导致了连接迅速的增加难以维护。因此在大规模的部署中,Calico会部署一个BGP Route Reflector。这个组件通常用于互联网当中,扮演一个中心指向BGP客户端的连接,防止它们需要和集群中其他单独的BGP客户端通信。

冗余多个BGP route reflectors可以达到无缝的部署。当BGP客户端公布它的FIB(Forwarding Information Base)路由到route reflector上时,route reflector则会公布这些路由到部署中的其他节点。

准备

etcd

首先需要部署一个etcd集群,在测试时起先使用的是之前部署Docker overlay时使用的单节点的etcd,但发现死后都无法成功。一直提示etcd集群不可用。因为已经有三台阿里云:

1
2
3
172.18.115.116
172.18.240.120
172.18.240.119

我分别在买个机器部署一个etcd组成一个3节点的集群。我使用静态部署etcd,因此先创建一个shell脚本叫做etcd.sh

1
2
3
4
5
6
7
8
#!/bin/bash
./etcd --name enode1 --initial-advertise-peer-urls http://172.18.115.116:2380 \
--listen-peer-urls http://172.18.115.116:2380 \
--advertise-client-urls http://172.18.115.116:2379 \
--listen-client-urls http://172.18.115.116:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster enode1=http://172.18.240.119:2380,enode2=http://172.18.115.116:2380,enode3=http://172.18.240.120:2380 \
--initial-cluster-state new

enode1为每个etcd节点的name,因此三个脚本分别是enode1enode2enode3,接着替换--initial-advertise-peer-urls--listen-peer-urls--advertise-client-urls--listen-client-urls分别为其他两台机器的IP。

现在在etcd的github上下载合适的包,解压后复制脚本到解压后的目录启动etcd:

1
nohup sh etcd.sh > etcd.log 2>&1 &

Docker

Calico需要在Docker添加启动参数--cluster-store指定etcd,分别修改三台机器的Docker启动参数,添加--cluster-store指定已经部署好的etcd地址并重启Docker服务。

安装calicoctl

Calico的操作均是通过calicoctl来操作的,因此首先安装calicoctl。下载calicoctl二进制执行文件并复制到系统环境目录中:

1
2
sudo wget -O /usr/local/bin/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v1.3.0/calicoctl
sudo chmod +x /usr/local/bin/calicoctl

现在就可以运行calico/nodecalico/node时间上运行的也是一个Docker容器。因此有两种方式,一种是直接使用calicoctl,另一种则是直接使用Docker命令。

calicoctl

直接使用calicoctl命令分别在3台机器中的每一台运行:

1
sudo calicoctl node run --node-image=quay.io/calico/node:v1.3.0

容器创建成功之后就可以查看当前Calico 的状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ calicoctl node status
Calico process is running.
IPv4 BGP status
+----------------+-------------------+-------+------------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+----------------+-------------------+-------+------------+-------------+
| 172.18.240.119 | node-to-node mesh | up | 2017-07-14 | Established |
| 172.18.240.120 | node-to-node mesh | up | 2017-07-14 | Established |
+----------------+-------------------+-------+------------+-------------+
IPv6 BGP status
No IPv6 peers found.

可以看到已经正常运行。

docker

calicoctl可以打印出使用Docker运行的命令,添加参数运行--init-system--dry-run打印命令:

1
2
3
4
5
6
7
8
9
$ calicoctl node run --init-system --dryrun --node-image=quay.io/calico/node:v1.3.0
Use the following command to start the calico/node container:
docker run --net=host --privileged --name=calico-node --rm -e ETCD_AUTHORITY=127.0.0.1:2379 -e ETCD_SCHEME=http -e ETCD_ENDPOINTS= -e NODENAME=calico -e CALICO_NETWORKING_BACKEND=bird -e NO_DEFAULT_POOLS= -e CALICO_LIBNETWORK_ENABLED=true -e CALICO_LIBNETWORK_IFPREFIX=cali -v /var/run/calico:/var/run/calico -v /lib/modules:/lib/modules -v /var/log/calico:/var/log/calico -v /run/docker/plugins:/run/docker/plugins -v /var/run/docker.sock:/var/run/docker.sock quay.io/calico/node:v1.3.0
Use the following command to stop the calico/node container:
docker stop calico-node
20000000201409

使用

上面已经安装好了Calico,现在可以创建一个Calico的网络:

1
docker network create --driver calico --ipam-driver calico-ipam calico-network

现在使用docker network ls就可以看到这个叫做calico-network网络,在运行容器的时候执行这个网络就可以为这个容器应用Calico网络。

支持一下
扫一扫,支持forsigner