Calico 搭建配置

介绍

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:<nil> 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://docs.projectcalico.org/v2.6/getting-started/docker/installation/manual
https://docs.projectcalico.org/v2.6/usage/configuration/ip-in-ip
https://www.cnblogs.com/lkun/p/7857453.html
http://www.cnblogs.com/kevingrace/p/6864804.html
https://kevinguo.me/2017/09/22/manual-deploy-kubernetes/#准备依赖包和文件
https://blog.csdn.net/mailjoin/article/details/79695463

 

 

P.S. 本文是帮朋友代为发表,非博主所写。

发表评论

发表评论

*

沙发空缺中,还不快抢~