使用Calico配置Docker网络

试验环境

IP地址 服务器
10.200.0.101 node1
10.200.0.102 node2
10.200.0.103 etcd
软件名 版本
centos 7.2
calicoctl 1.0.2
docker 1.10.3
etcd 2.3

配置与搭建

1) 状态协同工具etcd搭建
calico需要是通过etcd来实现各节点直接状态的协同。etcd集群的安装可以参考官方文档,这里使用的是单台(10.200.0.103)的2.3版本的etcd。

接下来的配置,需要在node1和node2上都进行操作,下面就以node1(10.200.0.101)为例进行说明。

2) 配置docker
docker的安装这里不多说,calico的官网上写的docker需要1.9及以后的版本,这里使用1.10的docker版本。

要想使用calico构建容器网络的话,docker daemon需要配置一个cluster store。由于calico使用的是etcd,在docker的/etc/sysconfig/docker配置文件的OPTIONS里面添加:

#根据实际情况替换
--cluster-store=etcd://10.200.0.103:2379

3) 使用calicoctl
calicoctl在1.0以后的版本,命令与之前有所改变。calicoctl 1.0之后calicoctl管理的都是资源(resource),之前版本的ip pool,profile, policy等都是资源。资源通过yaml或者json格式方式来定义,通过calicoctl create 或者apply来创建和应用,通过calicoctl get命令来查看。使用yaml或json来定义资源的格式为:

apiVersion: v1
kind: 
metadata:
  # Identifying information
  name: 
  ...
spec:
  # Specification of the resource
  ... 

calico支持的资源类型(kind)有:bgpPeer, hostEndpoint, policy, ipPool, profile, workloadEndpoint等。关于资源定义的详细,可参考官网。

a) 下载calico的命令管理工具calicoctl
下载calicoctl的操作如下:

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

由于/usr/local/bin在系统的PATH路径里面,所以之后就可以直接使用calicoctl命令了。

b) 配置calicoctl的datastore
calicoctl默认是会读取/etc/calico/calicoctl.cfg的配置文件(也可以通过–config选项来指定要读取的配置文件),配置里指定etcd集群的地址,文件的格式类似如下:

apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
  datastoreType: "etcdv2"
  etcdEndpoints: "http://etcd1:2379,http://etcd2:2379"

c) 运行calico/node
使用如下命令运行:

#以在node1上运行为例
sudo calicoctl node run --ip=10.200.0.101

服务器上还没有calico/node镜像的话,会先进行下载。运行成功后,可以看到正在运行的名为calico-node的容器。通过下面命令查看节点状态信息:

sudo calicoctl node status

d) 使用calicoctl创建ipPool
查看ip pool的命令为:

calicoctl get ipPool

创建ip pool首先定义一个资源文件ipPool.yaml,如:

- apiVersion: v1
  kind: ipPool
  metadata:
    cidr: 10.20.0.0/24
  spec:
    ipip:
      enabled: true
    nat-outgoing: true

然后运行命令进行创建:

calicoctl create -f ipPool.yaml

这样再通过calicoctl get ipPool命令查看,就会发现生成了一个10.20.0.0/24的ip pool。

连通性验证

在上面创建的ip pool(10.20.0.0/24)里创建子网络,如:

docker network create --driver calico --ipam-driver calico-ipam  --subnet 10.20.0.0/24 net1
docker network create --driver calico --ipam-driver calico-ipam  --subnet 10.20.0.0/24 net2
docker network create --driver calico --ipam-driver calico-ipam  --subnet 10.20.0.0/24 net3

上面创建了net1,net2和net3三个不同的网络。上面的命令在任意一个节点上执行即可。由于node1和node2使用的是同一套etcd,在两个节点上都可以通过docker network ls命令查看到生成的网络信息:
使用Calico配置Docker网络_第1张图片

参考官网上的一个例子,在node1和node2上分别创建几个容器来测试下容器网络的连通性。

#node1
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
#node2
docker run --net net3 --name workload-D -tid busybox
docker run --net net1 --name workload-E -tid busybox

可以在node1上使用如下命令来试验连通性:

#同一网络内的容器(即使不在同一节点主机上)可以使用容器名来访问
docker exec workload-A ping -c 4 workload-C.net1
docker exec workload-A ping -c 4 workload-E.net1
#不同网络内的容器需要使用容器ip来访问(使用容器名会报:bad address)
docker exec workload-A ping -c 2  `docker inspect --format "{{ .NetworkSettings.Networks.net2.IPAddress }}" workload-B`

同一网络内的容器是能相互通信的;不同网络内的容器相互是不通的。不同节点上属于同一网络的容器也是能相互通信的,这样就实现了容器的跨主机互连。

你可能感兴趣的:(docker,容器化技术笔记)