calico 安装及配置实现docker跨主机网络

说明:

本文通过配置使用 calico 最新版本,实现 docker 容器的跨主机通讯。

Calico 是一个纯3层协议,支持VM、Docker、Rocket、OpenStack、Kubernetes、或者直接在物理机上使用。官网上给出可以支持上万个主机、上百万的工作负载(container),由于它是纯三层协议,使用BGP协议(基于IP),更易于调试,支持IPv6,支持灵活的安全策略。

环境:

ubuntu 14.04.4 两台,安装的是docker 1.11.1 版本,ip 地址分别为 192.168.3.229192.168.3.228

etcd 2.3.6

calicoctl v1.0.0-beta

准备:

在每台主机上都安装或下载好 calicoctl, 可通过命令 wget https://github.com/projectcalico/calico-containers/releases/download/v1.0.0-beta/calicoctl 完成下载。

启动 etcd,可使用如下命令手工启动 etcd 并运行到后台: nohup ./etcd -name kube -listen-client-urls http://0.0.0.0:2379 -advertise-client-urls http://192.168.4.229:2379 > etcd.out &

分别在两台主机上都配置 docker 使用 etcd 作为 cluster-store,在 /etc/docker/daemon.json 内配置或新增如下内容:

{
"cluster-store":"etcd://192.168.3.229:2379"
}

配置完成后重启 docker 服务以便配置生效。

在每台主机上可以预先拉取 calico/node:v1.0.0-beta 镜像。

启动calico服务:

在每台主机上均运行命令:

export ETCD_ENDPOINTS=http://192.168.3.229:2379
./calicoctl node run --name 192.168.3.229

其中 calicoctl 命令里的 name,每台主机均可以根据自身 ip 来填写。 命令实际使用 calico/node 镜像启动了一个容器,执行输出内容如下:

Running command to load modules: modprobe -a xt_set ip6_tables
Enabling IPv4 forwarding
Enabling IPv6 forwarding
Increasing contrack limit
Running the following command:

docker run -d --net=host --privileged --name=calico-node -e IP6= -e NO_DEFAULT_POOLS= -e ETCD_SCHEME= -e CALICO_LIBNETWORK_ENABLED=true -e HOSTNAME=192.168.3.229 -e AS= -e ETCD_ENDPOINTS=http://192.168.3.229:2379 -e ETCD_AUTHORITY= -e IP= -e CALICO_NETWORKING_BACKEND=bird -v /var/run/calico:/var/run/calico -v /lib/modules:/lib/modules -v /run/docker/plugins:/run/docker/plugins -v /var/run/docker.sock:/var/run/docker.sock -v /var/log/calico:/var/log/calico calico/node:v1.0.0-beta

每台主机均启动 node 后,可查看 calico 内的 node 情况:

./calicoctl get node
NAME            
192.168.3.228   
192.168.3.229   

./calicoctl node status
Calico process is running.

IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+---------------+-------------------+-------+----------+-------------+
| 192.168.3.228 | node-to-node mesh | up    | 07:21:09 | Established |
+---------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

配置网络 IP Pool

通过如下命令可以查看 calico 的默认 ip pool

 ./calicoctl get ipPool
CIDR                       
192.168.0.0/16             
fd80:24e2:f998:72d6::/64   

可以看到其默认的 ipv4 的 ip 池为 192.168.0.0/16 我们通过如下 yaml 文件创建新的 ip 池:

- apiVersion: v1
  kind: ipPool
  metadata:
    cidr: 10.10.0.0/16
  spec:
    ipip:
      enabled: true
    nat-outgoing: true

执行命令 ./calicoctl create -f calico.yaml 创建此 ip pool,然后通过 ./calicoctl delete ipPool 192.168.0.0/16 删除原来的 ip pool。

网络创建

由于 calico 已经对接了 docker 的 CNM 网络模型,因此网络的创建,删除等管理动作,都可以在 docker 内完成。 通过如下命令创建和查看 calico 网络:

docker network create --driver calico --ipam-driver calico-ipam net1

docker network create --driver calico --ipam-driver calico-ipam net2

docker network ls
NETWORK ID          NAME                DRIVER
c11b915fd760        bridge              bridge              
9f5a5025c65a        host                host                
8787da6413ac        net1                calico              
32cd38e0980b        net2                calico              
20a70c2f57c1        none                null     

跨主机通讯验证

在第一个节点上创建如下容器:

docker run --net net1 --name workload-A -tid busybox

docker run --net net2 --name workload-B -tid busybox

docker run --net net1 --name workload-C -tid busybox

在第二个节点上创建如下容器:

docker run --net net2 --name workload-D -tid busybox

docker run --net net1 --name workload-E -tid busybox

通过 ping 命令查看网络连通性:

docker exec workload-A ping -c 4 workload-C //同主机通讯同网络通讯
PING workload-C (10.10.86.194): 56 data bytes
64 bytes from 10.10.86.194: seq=0 ttl=63 time=0.080 ms
64 bytes from 10.10.86.194: seq=1 ttl=63 time=0.105 ms
64 bytes from 10.10.86.194: seq=2 ttl=63 time=0.050 ms
64 bytes from 10.10.86.194: seq=3 ttl=63 time=0.055 ms

docker exec workload-A ping -c 4 workload-E //跨主机通讯同网络通讯
PING workload-E (10.10.48.65): 56 data bytes
64 bytes from 10.10.48.65: seq=0 ttl=62 time=0.584 ms
64 bytes from 10.10.48.65: seq=1 ttl=62 time=0.491 ms
64 bytes from 10.10.48.65: seq=2 ttl=62 time=0.843 ms
64 bytes from 10.10.48.65: seq=3 ttl=62 time=0.551 ms

docker exec workload-A ping -c 4 workload-B //同主机不同网络通讯
ping: bad address 'workload-B'

docker exec workload-A ping -c 4 workload-D //跨主机不同网络通讯
ping: bad address 'workload-D'

同时也可以查看到各容器的 ip 地址: workload-A:cali0@if6:10.10.86.192/32 workload-B:cali0@if8:10.10.86.193/32 workload-C:cali0@if10:10.10.86.194/32 workload-D:cali0@if6:10.10.48.64/32 workload-E:cali0@if8:10.10.48.65/32