1. 安装etcd集群

通过文章部署etcd集群部署etcd集群

2. 安装docker-ce

通过文章docker安装和加速安装docker-ce

2.1 修改配置

修改docker启动脚本配置存储到etcd

1
ExecStart=/usr/bin/dockerd --cluster-store=etcd://192.168.10.41:2379 -H fd:// --containerd=/run/containerd/containerd.sock

2.2 重启docker

1
2
systemctl daemon-reload
systemctl restart docker

3. 安装calico

3.1 创建目录

1
mkdir /etc/calico

3.2 创建配置文件

[root@node003 ~]# cat /etc/calico/calicoctl.cfg

1
2
3
4
5
6
apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
datastoreType: "etcdv2"
etcdEndpoints: "http://192.168.10.43:2379"

3.3 创建隧道

1
calicoctl node run --node-image=quay.io/calico/node:v2.6.12 -c /etc/calico/calicoctl.cfg

3.4 查看状态

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@node001 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+---------------+-------------------+-------+----------+-------------+
| 192.168.10.42 | node-to-node mesh | up | 17:38:59 | Established |
| 192.168.10.43 | node-to-node mesh | up | 17:39:01 | Established |
+---------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

3.5 创建容器网络

在任意主机上创建网络

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

–driver calico 指定使用 calico 的 libnetwork CNM driver。
–ipam-driver calico-ipam 指定使用 calico 的 IPAM driver 管理 IP。
calico 为 global 网络,etcd 会将 calnet1 同步到所有主机

3.6 查看容器网络

1
2
3
4
5
6
[root@node001 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f43625b6bef2 bridge bridge local
5c3a504b7498 calnet1 calico global
d1f8d4b0e2bf host host local
5255a26fa295 none null local

4. 通信原理

每在主机上创建一个容器,则会在物理机上创建一张虚拟网卡

4.1 node001节点创建容器

1
[root@node001 ~]# docker run --name c91 --net calnet1 -itd busybox  sh

查看容器 node001 的 网卡

多了一张网卡17: calic0c1251d07d@if16

查看容器 c91 的 IP

从这里可以看到容器里的虚拟网卡 cali0 和物理机的 calif6391d136be 是 veth pair 关系。

4.2 看总拓扑图

5. 路由关系

5.1 看c91路由

不管目的地到哪里都走cali0

5.2 看node001路由

目的地址到192.168.152.133的数据包都从calic0c1251d07d(vm91新生成的虚拟网卡)走
目的地到192.168.112.128的数据包都冲eth1发送到node002节点
每台主机都知道不同的容器在哪台主机上,所以会动态设置路由。