一 环境准备
1.1 Flannel 概述
Flannel 是一种基于 overlay 网络的跨主机容器网络解决方案, 即将 TCP 数据包封装在另一种网络包里面进行路由转发和通信, Flannel 是 CoreOS 开发, 专门用于 docker 多机互联的一个工具, 让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟 ip 地址
1.2 原理说明
Flannel 为每个 host 分配一个 subnet, 容器从 subnet 中分配 IP, 这些 IP 可以在 host 间路由, 容器间无需使用 nat 和端口映射即可实现跨主机通信. 每个 subnet 都是从一个更大的 IP 池中划分的, flannel 会在每个主机上运 flanneld 的 agent, 负责从池子中分配 subnet.
Flannel 使用 etcd 存放网络配置, 已分配的 subnet,host 的 IP 等信息, Flannel 数据包在主机间转发是由 backend 实现的, 目前已经支持 UDP,VxLAN,host-gw,AWS VPC 和 GCE 路由等多种 backend.
1.3 基础环境
ntp 配置: 略 #建议配置 ntp 服务, 保证时间一致性
etcd 版本: v3.3.9
docker 版本: 18.06.1-ce
防火墙及 SELinux: 关闭防火墙和 SELinux
名称 | 地址 | 主机名 | 备注 |
docker01 | 172.24.8.111 | docker01.example.com | |
docker02 | 172.24.8.112 | docker02.example.com | |
etcd1 | 172.24.8.113 | etcd1.example.com | 用于保存相关 IP 信息 |
docker01 中容器网段 | 10.1.15.2/24 | container01 | 网段 10.1.15.0/24 |
docker02 中容器网段 | 10.1.20.2/24 | container03 | 网段 10.1.20.0/24 |
- # hostnamectl set-hostname docker01.example.com
- # hostnamectl set-hostname docker02.example.com
- # hostnamectl set-hostname etcd1.example.com
提示: 主机名非必须.
1.4 架构示意图
数据转发流程
容器直接使用目标容器的 ip 访问, 默认通过容器内部的 eth0 发送出去.
报文通过 veth pair 被发送到 vethXXX.
vethXXX 直接连接到虚拟交换机 docker0 的, 报文通过虚拟 bridge docker0 发送出去.
查找路由表, 外部容器 ip 的报文都会转发到 flannel0 虚拟网卡, 这是一个 P2P 的虚拟网卡, 然后报文就被转发到监听在另一端的 flanneld.
flanneld 通过 etcd 维护了各个节点之间的路由表, 把原来的报文 UDP 封装一层, 通过配置的 iface 发送出去.
报文通过主机之间的网络找到目标主机.
报文继续往上, 到传输层, 交给监听在 8285 端口的 flanneld 程序处理.
数据被解包, 然后发送给 flannel0 虚拟网卡.
查找路由表, 发现对应容器的报文要交给 docker0.
docker0 找到连到自己的容器, 把报文发送过去.
1.5 相关顺序
部署顺序建议为: etcd---->flannel---->docker, 也可独立分开部署, 可能需要重启相关服务, 才能使 flannel 从 etcd 获取网络信息, docker 才能从 flannel 获取相关 IP.
启动顺序必须为: etcd---->flannel---->docker, 必须保证 etcd 启动正常, 才能使 flannel 获取正确地址段, docker 容器才能从 flannel 获取唯一地址.
二 etcd 节点部署
2.1 单节点部署 etcd
- root@etcd1:~# mkdir -p /var/log/etcd/ # 建议创建 etcd 日志保存目录
- root@etcd1:~# mkdir -p /data/etcd #建议创建单独的 etcd 数据目录
- root@etcd1:~# ETCD_VER=v3.3.10
- root@etcd1:~# GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
- root@etcd1:~# DOWNLOAD_URL=${GITHUB_URL}
- root@etcd1:~# curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-Linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-Linux-amd64.tar.gz
- root@etcd1:~# tar xzvf /tmp/etcd-${ETCD_VER}-Linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
- root@etcd1:~# rm -f /tmp/etcd-${ETCD_VER}-Linux-amd64.tar.gz
- root@etcd1:~# cp /tmp/etcd-download-test/etcd*/usr/local/bin/
- root@etcd1:~# etcd --version
2.2 采用 systemd 管理
- root@etcd1:~# vi /lib/systemd/system/etcd.service # 创建用于 systemd 管理的文件
- [Unit]
- Description=etcd
- Documentation=https://github.com/coreos/etcd
- Conflicts=etcd.service
- [Service]
- Type=notify
- Restart=always
- RestartSec=5s
- LimitNOFILE=40000
- TimeoutStartSec=0
- ExecStart=/usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \
- --listen-client-urls http://172.24.8.113:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://172.24.8.113:2379
- [Install]
- WantedBy=multi-user.target
提示: 使用 yum 安装 etcd 则 etcd.service 会自动创建, 且引用 / etc/etcd/etcd.conf 中的配置文件参数启动.
2.4 Etcd 中添加相应网段
按照 1.3 基础环境规划网段, 添加 etcd 键值.
root@etcd1:~# etcdctl --endpoints http://172.24.8.113:2379 set /flannel/network/config '{"Network":"10.1.0.0/16","SubnetLen": 24,"SubnetMin":"10.1.15.0","SubnetMax":"10.1.20.0","Backend": {"Type":"vxlan"}}'
Network(字符串):CIDR 格式的 IPv4 网络, 用于整个 flannel 网络.(这是唯一的强制密钥.)
SubnetLen(整数): 分配给每个主机的子网大小, 除非 Network 小于 24, 否则默认为 24(即 / 24).
SubnetMin(字符串): 子网分配应从哪个 IP 范围开始, 默认为第一个子网 Network.
SubnetMax(字符串): 子网分配应结束的 IP 范围的结尾, 默认为最后一个子网 Network.
Backend(后端): 要使用的后端类型和该后端的特定配置.
- root@etcd1:~# etcdctl get /flannel/network/config
- {"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.1.15.0","SubnetMax": "10.1.20.0", "Backend": {"Type": "vxlan"}}
三 flannel 节点部署
3.1 安装 flannel
- root@etcd1:~# mkdir /tmp/flannel-download-test
- root@etcd1:~# FLANNEL_VER=v0.10.0
- root@etcd1:~# GITHUB_URL=https://github.com/coreos/flannel/releases/download
- root@etcd1:~# DOWNLOAD_URL=${GITHUB_URL}
- root@etcd1:~# curl -L ${DOWNLOAD_URL}/${FLANNEL_VER}/flannel-${FLANNEL_VER}-Linux-amd64.tar.gz -o /tmp/flannel-${FLANNEL_VER}-Linux-amd64.tar.gz
- root@etcd1:~# tar xzvf /tmp/flannel-${FLANNEL_VER}-Linux-amd64.tar.gz -C /tmp/flannel-download-test
- root@etcd1:~# rm -f /tmp/flannel-${FLANNEL_VER}-Linux-amd64.tar.gz
- root@etcd1:~# cp /tmp/flannel-download-test/flanneld /usr/local/bin/
- root@etcd1:~# cp /tmp/flannel-download-test/mk-docker-opts.sh /usr/local/bin/
3.2 采用 systemd 管理
- root@etcd1:~# vi /lib/systemd/system/flanneld.service # 创建用于 systemd 管理的文件
- [Unit]
- Description=Flanneld overlay address etcd agent
- Documentation=https://github.com/coreos/flannel
- After=network.target
- After=network-online.target
- Wants=network-online.target
- After=etcd.service #指定 flannel 在 etcd 之后, docker 之前启动
- Before=docker.service
- [Service]
- User=root
- Type=notify
- LimitNOFILE=65536
- EnvironmentFile=/etc/flannel/flanneld.conf #指定 flannel 配置文件
- ExecStart=/usr/local/bin/flanneld \
- -etcd-endpoints=${FLANNEL_ETCD_ENDPOINTS} \
- -etcd-prefix=${FLANNEL_ETCD_PREFIX} $FLANNEL_OPTIONS
- #使用引用 flannel 配置文件中的参数形式
- ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker #见解读部分
- Restart=on-failure
- [Install]
- WantedBy=multi-user.target
3.3 创建 flannel 配置文件
- root@docker01:~# mkdir /etc/flannel
- root@docker01:~# vi /etc/flannel/flanneld.conf
- # Flanneld configuration options
- # etcd url location. Point this to the server where etcd runs
- FLANNEL_ETCD_ENDPOINTS="http://172.24.8.113:2379" #指定 etcd 服务器的监听地址
- # etcd config key. This is the configuration key that flannel queries
- # For address range assignment
- FLANNEL_ETCD_PREFIX="/flannel/network" #指定 etcd 网络参数所存储键值的 key
- # Any additional options that you want to pass
- FLANNEL_OPTIONS="-iface=eth0" #指定用于主机间通信的接口, 参数值也可为 IP 地址
提示: 使用 yum 安装 etcd 则 flannel.service 会自动创建, 若通过 yum 安装, 所有相关 systemd 管理文件会自动创建, 可参考:
- https://www.cnblogs.com/kevingrace/p/6859114.html
- https://www.cnblogs.com/devilwind/p/8880677.html
进行配置和修改.
docker02 节点参考以上配置即可.
解读:
/etc/sysconfig/flanneld: 配置相关 flannel 启动参数, 用于 flannel 从 etcd 获取唯一地址段;
mk-docker-opts.sh:mk-docker-opts.sh 运行后会讲 flannel 获取的网络参数写入 / run/flannel/subnet.env 文件;
-k DOCKER_NETWORK_OPTIONS:-k 会将默认组合键, 即 DOCKER_OPTS = 转换为 DOCKER_NETWORK_OPTIONS, 主要方便于 yum 安装的 docker 直接引用 (即 docker.service 中的 Service 字段 ExecStart 行为已经包括 $DOCKER_NETWORK_OPTIONS, 从而不需要再次添加 $DOCKER_OPTS);
-d /run/flannel/docker: 将 / run/flannel/subnet.env 文件转换为 docker 能识别的格式后保存为 / run/flannel/docker.
四 配置 docker
4.1 docker 环境
docker01 和 docker02 节点均需要安装 docker, 具体方式见《002.docker 版本及安装》.
4.2 修改 docker 启动参数
- root@docker01:~# vi /lib/systemd/system/docker.service
- #......
- EnvironmentFile=/run/flannel/docker # 添加 flannel 转换后的 docker 能识别的配置文件
- ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS
- #......
提示: 需要将 docker 修改为采用 flannel 网络.
docker02 节点参考以上配置即可.
五 启动相关服务
5.1 启动 etcd 服务
- root@etcd1:~# systemctl daemon-reload # 只需要在 etcd 节点
- root@etcd1:~# systemctl restart etcd.service
- root@etcd1:~# systemctl enable etcd.service
- root@etcd1:~# ps -ef | grep etcd #验证是否启动正常
5.2 启动 flannel 服务
- root@docker01:~# systemctl daemon-reload #docker01 和 docker02 节点
- root@docker01:~# systemctl restart flanneld.service
- root@docker01:~# systemctl enable flanneld.service
- root@docker01:~# ps -ef | grep flanneld # 验证是否启动正常
5.3 启动 docker 服务
- root@docker01:~# systemctl daemon-reload
- root@docker01:~# systemctl restart docker.service
- root@docker01:~# systemctl enable docker.service
提示: docker02 节点参考以上配置即可.
六 验证确认
6.1 验证 flannel 获取网络参数
- root@docker01:~# cat /run/flannel/docker # 检查 flannel 获取网络参数情况
- DOCKER_OPT_BIP="--bip=10.1.19.1/24"
- DOCKER_OPT_IPMASQ="--ip-masq=true"
- DOCKER_OPT_MTU="--mtu=1450"
- DOCKER_NETWORK_OPTIONS="--bip=10.1.19.1/24 --ip-masq=true --mtu=1450"
- root@docker01:~# ifconfig | grep -A6 docker
- root@docker01:~# ifconfig | grep -A6 flannel
七 测试确认
7.1 创建测试容器
- root@docker01:~# docker run -id --name Container01 busybox
- root@docker02:~# docker run -id --name Container01 busybox
提示: flannel 为动态分配 IP, 因此实际 IP 可能和实例架构图不一致, 请根据实际情况规划相关业务 IP.
来源: https://www.cnblogs.com/itzgr/p/10172004.html