ETCD集群部署 和flanne网络插件通信原理介绍

ETCD集群部署

用来保存路由表、信息分配、子网等等。。

1.两台主机:
	192.168.1.4
    192.168.1.102
两台主机分别执行以下操作:
yum install -y etcd flannel
setenforce 0
systemctl stop firewalld && systemctl disable firewalld
或不关闭防火墙,开放以下需要的端口2379,2380:
	firewall-cmd --zone=public --add-port=2379/tcp --permanent
    firewall-cmd --zone=public --add-port=2380/tcp --permanent
    firewall-cmd --reload
    firewall-cmd --list-all
    
iptables -P FORWARD ACCEPT # 开启转发功能
cp /etc/etcd/etcd.conf{,.bak}

2.修改两台主机的etcd.conf文件
# 主机:192.168.1.102
vim /etc/etcd/etcd.conf
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
ETCD_LISTEN_PEER_URLS="http://192.168.1.102:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.102:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.102:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.102:2379"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.1.102:2380,etcd2=http://192.168.1.4:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-test"
ETCD_INITIAL_CLUSTER_STATE="new"


# 主机:192.168.1.4
vim /etc/etcd/etcd.conf
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/etcd2"
ETCD_LISTEN_PEER_URLS="http://192.168.1.4:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.1.4:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd2"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.4:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.4:2379"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.1.102:2380,etcd2=http://192.168.1.4:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-test"
ETCD_INITIAL_CLUSTER_STATE="new"

3.修改两台主机的systemd
vim /usr/lib/systemd/system/etcd.service
在ExecStart=  后添加如下参数:# 这些配置来自于etcd.conf文件
	--listen-client-urls=\"${ETCD_LISTEN_CLINET_URLS}\" --listen-peer-urls=\"${ETCD_LISTEN_PEER_URLS}\" --advertise-client-urls=\"${ETCD_ADVERTISE_CLIENT_URLS}\" --initial-cluster-token=\"${ETCD_INITIAL_CLUSTER_TOKEN}\" --initial-cluster=\"${ETCD_INITIAL_CLUSTER}\" --initial-cluster-state=\"${ETCD_INITIAL_CLUSTER_STATE}\"

scp /usr/lib/systemd/system/etcd.service root@192.168.1.4:/usr/lib/systemd/system/

4.启动两台主机的etcd
systemctl daemon-reload
systemctl start etcd.service

ps aux | grep etcd # 下图1

# 验证集群状态
etcdctl cluster-health # 下图2

# 查看集群中有哪些成员  
etcdctl member list # 下图3,根据isLeader=true,可以看到192.168.1.102被选为主

# etcd进程信息的输出位置:/var/log/messages中 图4
tailf /var/log/messages

图1:

图2:

图3:

图4:

vim etcd.sh # 在flannel启动之前,需要在etcd中添加一条网络配置记录,这个配置将用于flanneld分配给配个docker的虚拟IP地址段
{ "Network":"10.0.0.0/16","SubnetLen":24,"Backend":{"Type":"vxlan"} }

Backend的两种通讯类型:host-gw、vxlan(表示主机[容器]是通过vxlan的方式通讯)
Network中定义了host主机IP地址池是10.0.0.0/16,由于etcd不是动态保存在主机的flannel上的,比如说:当节点被删除之后,etcd当中的关于这个节点的subnet子网并不会被删除,所以使用A类的网段是为了保证有足够的网络可以用,而SubnetLen指定的是一个主机分配到的子网的子网掩码长度是多少,这里24位的子网长度,会得到10.10.x.0/24的backend。

将etcd.sh写入到etcd中:# 这里在192.168.1.102上进行写入,然后去192.168.1.4上查询是否写入。
etcdctl --endpoints=http://192.168.1.102:2379 set /usr/local/bin/network/config < /root/etcd.sh
    endpoint:表示从哪台主机写入
	set:设置一个key

etcdctl get /usr/local/bin/network/config # 查看etcd.sh是否被写入到etcd  下图

跨主机通讯之flannel

overlay网络是在现有的物理层上再建一层网络(在原有的物理网络上再覆盖一层网络),采用两个网卡和两个空间的方式,让两个不同主机(容器)之间可以通信,并且创建好自己的网段。。

flannel网络工作原理图

详细解释可参考《k8s 权威指南》472页

修改flanneld文件配置及启动

两台主机均执行如下操作,修改flannel配置文件:
cd /etc/sysconfig
cp flanneld{,.bak}
vim flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.102:2379" 
FLANNEL_ETCD_PREFIX="/usr/local/bin/network" 

之后启动flannel:
systemctl daemon-reload
systemctl start flanneld.service && systemctl enable flanneld.service

ip a  # 主机会多出一个flannel地址,10.0.15.0/32  10.0.28.0/32  下图1

两台主机重启docker服务:
systemctl restart docker

查看flannel的subnet.env文件,获取当前主机etcd分配的的subnet
cat /run/flannel/subnet.env # 图2

添加subnet到自己主机的docker.service
vim /usr/lib/systemd/system/docker.service
	ExecStart ...  --bip=10.0.15.1/24 --mtu=1450
systemctl daemon-reload
systemctl restart docker.service

# 查看当前主机docker0网卡IP,发现被flannel强制修改了
ip a  # 如下图3

图1:

图2:

图3:

在两台主机分别运行一个busybox的容器:
docker -itd --name bbox1 --restart always busybox
docker exec it bbox1 sh

docker -itd --name bbox2 --restart always busybox
docker exec it bbox2 sh

分别在两个容器内执行以下命令:# 如下图1
ip a 
ping 10.0.28.2 # ping bbox2容器
ping 10.0.15.2 # ping bbox1容器

图1:

host-gw通信类型

{ "Network":"10.0.0.0/16","SubnetLen":24,"Backend":{"Type":"host-gw"} }

etcdctl --endpoints=http://192.168.1.102:2379 set /usr/local/bin/network/config < /root/etcd.sh
    endpoint:表示从哪台主机写入
	set:设置一个key

etcdctl get /usr/local/bin/network/config # 查看etcd.sh是否被写入到etcd 
cat /run/flannel/subnet.env # 下图1

图1:

vim /usr/lib/systemd/system/docker.service  # 下图1
将--mtu=1450 改成--mtu=1500

systemctl daemon-reload && systemctl restart docker.service

分别启动对应机器上的bbox1容器和bbox2容器:
docker start bbox1
docker start bbox2

进入两个容器,查看host-gw和vxlan的区别:
docker exec -it bbox1 sh
docker exec -it bbox2 sh

ip a 
ping 10.0.15.2
traceroute 10.0.15.2 # 追踪到达10.0.15.2通信过程经过的路由

exit
ip r  # 查看本地路由规则 如下图

图1:

图2:

vxlan和host-gw通信的区别总结

1.host-gw把每个主机都配置成网关,主机知道其它主机subnet和转发地址;
2.vxlan模式则是在主机之间建立隧道,通过最长匹配原则进入到flannel.1里通讯,不同的主机都在一个大的网段当中10.0.0.0/16(当然这个是由我们自己定义的),然后在这个大网里面他们进行转发;
3.vxlan和host-gw使用不同的机制建立通讯,但是对于容器我们不需要做任何改变,bbox1和bbox2仍然可以进行通讯,没有太大变化;
4.由于vxlan需要对数据进行额外的打包和拆包,在性能上要稍逊于host-gw
原文地址:https://www.cnblogs.com/zhangchaocoming/p/15531804.html