微服务之跨主机集群

一、Flannel

Flannel 实质上是一种覆盖网络 (overlay network), 即表示运行在一个网上的网 ( 应用层网络 ), 并不依靠 ip 地址来传递消息 ,
而是采用一种映射机制 , ip 地址和 identifiers 做映射来资源定位。
也就是将 TCP 数据包装在另一种网络包里面进行路由转发和通信 ,
目前已经支持 UDP VxLAN AWS VPC GCE 路由等数据转发方式
Flannel实现的容器的跨主机通信通过如下过程实现:
每个主机上安装并运行 etcd flannel
etcd 中规划配置所有主机的 docker0 子网范围;
每个主机上的 flannel 根据 etcd 中的配置 , 为本主机的 docker0 分配子网 , 保证所有主机上的 docker0 网段不重复 , 并将结果 ( 即本主机上的 docker0 子网信息和本主机 IP 的对应关系 ) 存入
etcd 库中 , 这样 etcd 库中就保存了所有主机上的 docker 子网信息和本主机 IP 的对应关系;
当需要与其他主机上的容器进行通信时 , 查找 etcd 数据库 , 找到目的容器的子网所对应的 outip( 目的宿主机的 IP)
将原始数据包封装在 VXLAN UDP 数据包中 ,IP 层以 outip 为目的 IP 进行封装;
由于目的 IP 是宿主机 IP, 因此路由是可达的;
VXLAN UDP 数据包到达目的宿主机解封装 , 解出原始数据包 , 最终到达目的容器。

 

Flannel特点:

1. 使集群中的不同 Node 主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。
2. 建立一个覆盖网络 (overlay network), 通过这个覆盖网络 , 将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将
一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后 , 将其解封装。
3. 创建一个新的虚拟网卡 flannel0 接收 docker 网桥的数据 , 通过维护路由表 , 对接收到的数据进行封包和转发 (vxlan)
4. etcd 保证了所有 node flanned 所看到的配置是一致的。同时每个 node 上的 flanned 监听 etcd 上的数据变化 , 实时感知集群中 node 的变化。

二、环境搭建

环境要求:etcd、docker、flannel

ETCD版本问题:
ETCD3.4 版本中 ,ETCDCTL_API=3 etcd --enable-v2=false 成为了默认配置
flannel 操作 etcd 使用的是 v2 API, kubernetes 操作 etcd 使用的 v3 API
为了兼容 flannel, 将默认开启 v2 版本 , 故配置文件中还要设置 :
vi / etc / profile

1.在最后添加,指定使用v2

export ETCDCTL_API=2 # 指定etcdctl命令的版本为v2  

 

2.更新配置文件

source /etc/profile  

3. 使用api2

etcdctl2 etcdctl3 是不兼容的 , 两者的 api 参数也不一样 , 最关键的是 “v2/v3 的数据是不互通的
api 2 使用方法
ETCDCTL_API = 2 etcdctl set key value
ETCDCTL_API = 2 etcdctl ls /
ETCDCTL_API = 2 etcdctl del / -- prefix

api 3 使用方法

ETCDCTL_API = 3 etcdctl put key value
ETCDCTL_API = 3 etcdctl get /
ETCDCTL_API = 3 etcdctl del / -- prefix

4.ETCD中保存网络信息

下面两个ip为不同主机对应的ip

ETCDCTL_API = 2 etcdctl \
-- endpoints "http://192.168.95.110:2379,http://192.168.95.120:2379" \
set / coreos . com / network / config \
'{"NetWork":"10.0.0.0/16","SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0","Backend": {"Type": "vxlan"}}'

 

Network: 用于指定 Flannel 地址池 , 整个 overlay( 覆盖 ) 网络为 10.0.0.0/16 网段 .
SubnetLen: 用于指定分配给单个宿主机的 docker0 ip 段的子网掩码的长度 , 默认值也是 24
SubnetMin: 用于指定最小能够分配的 ip
SudbnetMax: 用于指定最大能够分配的 ip , 在上面的示例中 , 表示每个宿主机可以分配一个 24 位掩码长度的子网 , 可以分配的子网从 10.0.1.0/24 10.0.20.0/24, 也就意味着在这个网
段中 , 最多只能有 20 台宿主机
Backend: 用于指定数据包以什么方式转发 , 默认为 udp 模式 , 这里使用的是 vxlan 模式 . 因为为 vxlan 比起预设的 udp 性能相对好一些

 

三、flannel安装与配置

1.下载或上传flannel安装包

2.创建flannel安装目录

mkdir -p /opt/flannel

3.解压到安装目录

tar xzf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel

4.查看解压后文件

cd /opt/flannel && ls

5.flannel创建一个systemd服务,用于后台启动

vim /etc/systemd/system/flanneld.service  

 flanneld.service  文件

[Unit]
Description=Flanneld
After=network.target
After=network-online.target
Wants=network-online.target
##1.flannel服务需要先于Docker启动,后于etcd启动
After=etcd.service
Before=docker.service


[Service]
User=root
##2.ExecStart即flanneld启动程序位置
##3.--etcd-endpoints参数为ectd集群客户端地址
##4.--iface参数为要绑定的网卡的IP地址,或是网卡名(ifconfig查看获得)请根据实际情况修改
ExecStart=/opt/flannel/flanneld \
--etcd-endpoints=http://192.168.95.110:2379,http://192.168.95.120:2379 \
--etcd-prefix=/coreos.com/network \
--iface=ens33 \
--ip-masq
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target

注意:ip要对应 

6.刷新并重启

systemctl daemon-reload && systemctl restart flanneld

7.验证ip

ifconfig 

四、docker配置

在各个节点安装好Docker,然后更改Docker的启动参数,使其能够使用flannel进行IP分配,以及网络通讯

1.查看 flannel 分配的网络参数 ( Flannel 运行之后 , 会生成一个环境变量文件 , 包含了当前主机要使用 flannel 通讯的相关参数 )
cat / run / flannel / subnet . env

2.创建Docker运行参数(使用flannel提供的脚本将subnet.env转写成Docker启动参数)

/opt/flannel/mk-docker-opts.sh -d /run/flannel/docker_opts.env -c 

3.修改Docker启动参数

vim /lib/systemd/system/docker.service  

 

 4.重新加载systemd配置,并重启Docker

systemctl daemon-reload && systemctl restart docker && systemctl status docker

5.查看是否应用成功

ifconfig 

五、测试flannel

1.下载centos镜像,因为此镜像中其它软件及命令均有安装

docker run -it --name=centos centos bash

2.依次查看集群内容器的flannel.1网络IP

cat /etc/hosts

docker inspect bridge

3.从不同宿主机容器到其他宿主机容器

ping -c3 10.0.14.2

4.解决flannel下容器无法跨主机互通问题

iptables - P INPUT ACCEPT
iptables - P FORWARD ACCEPT
iptables - F
iptables - L - n

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值