zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    笔记-JavaWeb学习之旅13
    笔记-JavaWeb学习之旅12
    笔记-JavaWeb学习之旅11
    笔记-JavaWeb学习之旅10
    EF Core CodeFirst
    C#泛型
    软件工程笔记(二)
    第一章 软件工程概述
    软件工程笔记(一)
    MySql笔记(二)
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/15531804.html
Copyright © 2011-2022 走看看