Calico 搭建配置
作者:佚名 来源:小影志 时间:2018-06-07
介绍
Calico 是一个纯三层的协议,为 OpenStack 虚机和 Docker 容器提供多主机间通信。Calico 不使用重叠网络比如 flannel 和 libnetwork 重叠网络驱动,
Calico 依赖 etcd 在不同主机间共享和交换信息,存储 Calico 网络状态。Calico 网络中每个主机都要运行 Calico 组件,提供容器 interface 管理,动态路由,动态 ACL,报告状态等功能。
Calico 目前只支持 TCP、UDP、ICMP、ICMPv6 协议。
Calico 包括如下重要组件:Felix,etcd,BGP Client,BGP Route Reflector。
- Felix:主要负责路由配置以及 ACLS 规则的配置以及下发,它存在在每个 node 节点上。
- etcd:分布式键值存储,主要负责网络元数据一致性,确保 Calico 网络状态的准确性,可以与 kubernetes 共用。
- BGPClient(BIRD):主要负责把 Felix 写入 kernel 的路由信息分发到当前 Calico 网络,确保 workload 间的通信的有效性。
- BGPRoute Reflector(BIRD):大规模部署时使用,摒弃所有节点互联的 mesh 模式,通过一个或者多个 BGPRoute Reflector 来完成集中式的路由分发。
一、环境准备
1.1 机器信息
主机名 | IP | 系统 |
---|---|---|
W708-ATMQZLPR-1 | 172.29.150.202 | Centos 7.2 |
W708-ATMQZLPR-2 | 172.29.150.203 | Centos 7.2 |
W708-ATMQZLPR-3 | 172.29.150.204 | Centos 7.2 |
1.2 Docker配置
Docker 版本
Version: 1.12.6
Docker 配置
# vim /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target rhel-push-plugin.socket
[Service]
Type=notify
ExecStart=/usr/bin/dockerd-current \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
MountFlags=slave
[Install]
WantedBy=multi-user.target
vim /etc/docker/daemon.json
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.thinpooldev=/dev/mapper/docker-thinpool",
"dm.use_deferred_removal=true",
"dm.use_deferred_deletion=true"
],
"registry-mirrors": [
"http://f2d6cb40.m.daocloud.io",
"http://ef017c13.m.daocloud.io",
"http://74ecfe5d.m.daocloud.io",
"http://e1c83636.m.daocloud.io"
],
"insecure-registries": [
"172.29.150.223:5000",
"172.30.33.31:5000",
"172.29.151.41:5000"
],
"live-restore": true,
"graph": "/opt/docker",
"hosts": [
"unix:///var/run/docker.sock",
"tcp://0.0.0.0:2375"
],
"selinux-enabled": false,
"userland-proxy": false,
"exec-opts": [
"native.cgroupdriver=systemd"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "300m",
"max-file": "3"
},
"cluster-store": "etcd://172.29.150.202:2379",
"cluster-store-opts": {
"kv.cacertfile": "/opt/ssl/ca.pem",
"kv.certfile": "/opt/ssl/etcd.pem",
"kv.keyfile": "/opt/ssl/etcd-key.pem"
}
}
主要配置说明
要使用 Calico 作为 Docker 的网络插件,Docker 必须配置一个集群存储,这里使用 etcd 作为Docker 及 Calico 的集群存储。
cluster-store:配置etcd访问接口
cluster-store-opts:配置证书路径
1.3 etcd 配置
此项配置参考:搭建 etcd 集群。
二、搭建配置 Calico
2.1 配置准备
创建 calico 目录(以下路径均为自定义方便管理,在配置的时候跟官网有些区别,注意修改配置文件)
mkdir /opt/platform/calico #calico主目录
mkdir /opt/platform/calico/certs #calico证书目录
mkdir /opt/platform/calico/log #calico日志目录
创建证书
由于搭建 etcd 集群中已经创建了 etcd 的证书,calico 只需要复用即可
copy /opt/ssl/ca.pem /opt/ssl/etcd*.pem /opt/platform/calico/certs/
2.2 安装配置 Calico
安装 calicoctl
wget -O /opt/platform/calico/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v1.6.4/calicoctl
chmod +x /opt/platform/calico/calicoctl
配置 Calico 系统服务
#vim /lib/systemd/system/calico-node.service
[Unit]
Description=calico-node
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/opt/platform/calico/calico.env
ExecStartPre=-/usr/bin/docker rm -f calico-node
ExecStart=/usr/bin/docker run --net=host --privileged \
--name=calico-node \
-e NODENAME=${CALICO_NODENAME} \
-e IP=${CALICO_IP} \
-e IP6=${CALICO_IP6} \
-e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \
-e AS=${CALICO_AS} \
-e NO_DEFAULT_POOLS=${CALICO_NO_DEFAULT_POOLS} \
-e CALICO_LIBNETWORK_ENABLED=${CALICO_LIBNETWORK_ENABLED} \
-e ETCD_ENDPOINTS=${ETCD_ENDPOINTS} \
-e ETCD_CA_CERT_FILE=${ETCD_CA_CERT_FILE} \
-e ETCD_CERT_FILE=${ETCD_CERT_FILE} \
-e ETCD_KEY_FILE=${ETCD_KEY_FILE} \
-v /opt/platform/calico/certs:/etc/calico/certs \
-v /opt/platform/calico/log:/var/log/calico \
-v /run/docker/plugins:/run/docker/plugins \
-v /lib/modules:/lib/modules \
-v /var/run/calico:/var/run/calico \
-v /var/run/docker.sock:/var/run/docker.sock \
quay.io/calico/node:v2.6.2
ExecStop=-/usr/bin/docker stop calico-node
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
这里需要注意的是,官方的 service 配置中没有 certs 及 docker.sock 的映射路径,会导致 calico 找不到证书及无法启动容器
配置环境变量
# vim /opt/platform/calico/calico.env
ETCD_ENDPOINTS="https://172.29.150.202:2379,https://172.29.150.203:2379,https://172.29.150.204:2379"
ETCD_CA_CERT_FILE="/etc/calico/certs/ca.pem"
ETCD_CERT_FILE="/etc/calico/certs/etcd.pem"
ETCD_KEY_FILE="/etc/calico/certs/etcd-key.pem"
CALICO_NODENAME=""
CALICO_NO_DEFAULT_POOLS=""
CALICO_IP=""
CALICO_IP6=""
CALICO_AS=""
CALICO_LIBNETWORK_ENABLED=true
CALICO_NETWORKING_BACKEND=bird
这里需要注意的是,此配置为容器内部读取的变量,所以证书路径为容器路径,而不是宿主机路径。
配置 calicoctl 的 etcd 存储
# vim /etc/calico/calicoctl.cfg
apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
etcdEndpoints: https://172.29.150.202:2379,https://172.29.150.203:2379,https://172.29.150.204:2379
etcdKeyFile: /opt/platform/calico/certs/etcd-key.pem
etcdCertFile: /opt/platform/calico/certs/etcd.pem
etcdCACertFile: /opt/platform/calico/certs/ca.pem
这里需要注意的是,这是配置 calicoctl 调用 etcd 接口的环境变量,所以证书路径为宿主机路径。
calicoctl 默认读 /etc/calico/
下的 calicoctl.cfg
下载 calicoctl 镜像
docker pull quay.io/calico/node:v2.6.2
以上配置均需要在每个 node 节点上操作。
三、测试 Calico
3.1 启动 Calico
systemctl enable calico-node
systemctl start calico-node
3.2 创建 Calico 网络
docker network create --driver calico --ipam-driver calico-ipam net1
docker network create --driver calico --ipam-driver calico-ipam net2
docker network create --driver calico --ipam-driver calico-ipam --subnet=10.233.0.0/16 calico
配置说明:
- --driver calico:
- 网络使用 calico 驱动
- --ipam-driver calico-ipam:
- 指定使用 calico 的 IPAM 驱动管理 IP
- --subnet:
- 如果需要指定容器IP的话,需要指定 calico 网络的 IP 段
calico 是 global 网络,etcd 会将 calico-net1 同步到所有主机
docker network ls #查看docker所有网络
3.3 创建 Calico 网络 IP 池
calicoctl apply -f ipPool.yaml
- apiVersion: v1
kind: ipPool
metadata:
cidr: 10.233.0.0/16
spec:
ipip:
enabled: true
mode: always
nat-outgoing: true
disabled: false
查看 Calico IPAM 配置
calicoctl get ipPool
配置说明:
- cidr:
- IP 地址段,Docker 默认为 192.168.0.0/16。
- ipip:
- IP 地址封装,能实现不同网段的宿主机同 Docker 网络通信,mode 有 always 和 cross-subnet 2 种模式,实测 cross-subnet 模式下容器之间无法 ping 通,GitHub 上有类似的问题,貌似是 BUG。
3.4 创建容器
在 W708-ATMQZLPR-1 创建
docker run --net net1 --name workload-A -tid busybox
docker run --net net2 --name workload-B -tid busybox
在 W708-ATMQZLPR-2 创建
docker run --net net1 --name workload-C -tid busybox
docker run --net net2 --name workload-D -tid busybox
docker run --net net2 --name workload-E -tid busybox
3.5 ping 测试
docker exec workload-A ping -c 4 workload-B
docker exec workload-A ping -c 4 workload-C
docker exec workload-D ping -c 4 workload-E
正常情况下:
同网络下能互相 ping 通,比如 A 和 C(跨宿主)及 D 和 E(同宿主)。
不同网络下无法互相 ping 通,比如 A 和 D(跨宿主)及 C 和 D(同宿主)。
3.6 查看命令
查看 docker 网络
docker network ls
查看容器 IP
docker inspect --format "{{ .NetworkSettings.Networks.net1.IPAddress }}" workload-A
查看容器网络
docker inspect --format "{{ .HostConfig.NetworkMode }}" workload-D
四、排错
4.1 BUG
1)在 docker 容器指定 IP 启动之后,重启 node 或者重启 docker,再次启动容器或者删除容器重新创建容器指定同样的 IP,会报错:
Error response from daemon: IpamDriver.RequestAddress: IP assignment error, data: {IP:10.233.49.100 HandleID: Attrs:map[] Hostname:W708-ATMQZLPR-1}: Address already assigned in block
容器的 IP 地址未释放。
解决方法:
通过 calico 的 ipam 释放 IP 地址
calicoctl ipam release --ip=10.233.49.100
2)如果你需要固定你的容器 IP,需要在创建 calico 网络的时候添加 --subnet,那么 2.6.2 之后的版本会有 BUG,添加 subnet 参数然后启动容器,会报错:
docker: Error response from daemon: IpamDriver.RequestAddress: Unexpected number of assigned IP addresses. A single address should be assigned. Got []
解决方法:
安装 calico 的时候 2.6 版本一定要选择 2.6.2,3.0 版本未尝试测试。
五、参考链接
https://www.cnblogs.com/lkun/p/7857453.html
http://www.cnblogs.com/kevingrace/p/6864804.html
https://blog.csdn.net/mailjoin/article/details/79695463
P.S. 本文是帮朋友代为发表,非博主所写。