1、概述

组件:
51 部署etcd,flannel,docker   hostname:lyc-80-25  主控端 通过etcd
52 部署flannel,docker       hostname:lyc-80-26
53 部署flannel,docker       hostname:lyc-80-27
  • 1.
  • 2.
  • 3.
  • 4.

flannel 能够让不通的容器上的docker容器都拥有唯一的IP地址,不像之前的docker0分配虚拟地址,这样不同的容器可能会出现同样的ip地址。


----underlay 物理网络

----overlay 虚拟网络


flannel 是一种overlay 网络,表示运行在一个网上的网(应用层网络)并不依靠ip地址传递信息,而是采用映射机制,把IP地址和identifiers做映射来资源定位,即把tcp数据包装在另一种网络包里进行理由转发和通信。


flannel使用etcd存储配置数据和子网分配信息


flannel启动之后,后台进程首先检索配置和正在使用的子网列表,选择一个可用的子网,去注册它,etcd也存储每个主机对应的IP


flannel使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表,为提高性能,flannel优化了universal TAP/TUN设备。

第十一节  Docker网络之flannel_vim

属于二层网络,基于网关的三层网络宣告

2、打开中继路由

打开中继路由
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
三台机器全部执行
cat /etc/sysctl.conf
  • 1.
  • 2.
  • 3.
  • 4.

第十一节  Docker网络之flannel_vim_02

3、防火墙

# 防火墙规则----三台全部执行以下命令
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

第十一节  Docker网络之flannel_docker_03

4、机器25部署etcd

机器25部署etcd
yum -y install etcd

vim /etc/etcd/etcd.conf
修改以下内容
---------------------------------------------------------------------
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.80.25:2379,http://192.168.80.25:4001"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

第十一节  Docker网络之flannel_vim_04

客户端网络要注入到flannel地址里面去,把路由放到etcd里面去,上面是监听,下面是访问地址


service etcd start

systemctl status etcd.service  /开启服务

chkconfig etcd on

ps -ef | grep etcd


【单机版的etcd安装完成】

第十一节  Docker网络之flannel_docker_05

测试端口是否正常

etcdctl -C http://192.168.80.25:4001 cluster-health

etcdctl -C http://192.168.80.25:2379 cluster-health

第十一节  Docker网络之flannel_vim_06

查看etcd 成员   etcdctl member list

第十一节  Docker网络之flannel_IP_07

5、所有机器部署flannel

yum -y install flannel
  • 1.

第十一节  Docker网络之flannel_docker_08

备份系统flanneld初始数据
cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak

编辑flanneld文件配置---3台机器都配置下
vim /etc/sysconfig/flanneld

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://192.168.80.25:2379"
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

第十一节  Docker网络之flannel_vim_09

6、定义网络

# 【注意!!!!!!!!!!!!!!!!!!!!!!!!!!】
这里这个网段不能和宿主机网段相同 不然会出现flanneld无法启动的情况
我们设置的网段和宿主机是一个网段,所以会报错,flannel无法启动

将内容
etcdctl mk /atomic.io/network/config '{"Network:"192.123.0.0/16","SubnetMin":"192.123.1.0","SubnetMax":"192.123.254.0"}'


更改为
etcdctl mk /atomic.io/network/config '{"Network":"172.27.0.0/16", "SubnetMin": "172.27.1.0", "SubnetMax": "172.27.254.0"}'
{"Network":"172.27.0.0/16", "SubnetMin": "172.27.1.0", "SubnetMax": "172.27.254.0"}

------------------------------------------------------------------
启动flanneld
service flanneld start
etcdctl get /atomic.io/network/config
chkconfig flanneld on
【启动不起来,说明是key的问题,删除重新生成 etcdctl rm /atomic.io/network/config 】
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

第十一节  Docker网络之flannel_vim_10

查看生成的网络cat  /run/flannel/subnet.env


第十一节  Docker网络之flannel_docker_11

查看网络ifconfig,会多生成一个flannel网卡

第十一节  Docker网络之flannel_IP_12

修改docker的启动文件

vim  /usr/lib/systemd/system/docker.service

--------------------------------------------

ExecStart=/usr/bin/dockerd  --bip=172.27.68.1/24  --mtu=1472

------------------------------------------------

要与cat   /run/flannel/docker查看到的IP一致

第十一节  Docker网络之flannel_IP_13

之后重新启动docker

systemctl daemon-reload

service docker restart

chkconfig docker on

第十一节  Docker网络之flannel_docker_14

7、机器26、27重启flanneld

systemctl start flanneld
systemctl enable flanneld
ps -ef |grep flannel
  • 1.
  • 2.
  • 3.

第十一节  Docker网络之flannel_vim_15

8、给机器26添加Docker配置

cat /run/flannel/subnet.env

vim  /usr/lib/systemd/system/docker.service

修改docker的启动文件

要与cat   /run/flannel/docker查看到的IP一致

------------------------------------------------

ExecStart=/usr/bin/dockerd  --bip=172.27.71.1/24  --mtu=1472

--------------------------------------------

# 完成之后docker进行重启

systemctl daemon-reload

systemctl restart docker

--------------------------------------

查看网卡ifconfig

第十一节  Docker网络之flannel_vim_16


9、给机器27添加Docker配置

cat /run/flannel/subnet.env

vim  /usr/lib/systemd/system/docker.service

修改docker的启动文件

要与cat   /run/flannel/docker查看到的IP一致

------------------------------------------------

ExecStart=/usr/bin/dockerd  --bip=172.27.13.1/24  --mtu=1472

--------------------------------------------

# 完成之后docker进行重启

systemctl daemon-reload


systemctl restart docker

-----------------------------------------

查看网卡ifconfig

第十一节  Docker网络之flannel_IP_17

10、测试是否通信成功

分别对3台启动一个容器进行测试

docker run -itd --name by1 busybox   //25

docker run -itd --name by2 busybox  //26

docker run -itd --name by3 busybox  //27

第十一节  Docker网络之flannel_vim_18

docker exec -it by1  ifconfig

docker exec -it by2  ifconfig

docker exec -it by3  ifconfig

第十一节  Docker网络之flannel_docker_19

----测试by1----ping  by2--------->>>

----测试by1----ping  by3--------->>>>

第十一节  Docker网络之flannel_docker_20

测试网络通信正常,实验成功!

【扩展】 如果后期有一台新的机器,要加入集群如何操作?

1、 打开中继路由
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

2、# 防火墙规则
iptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTiptables -Fiptables -L -n

3、 yum -y install flannel

4、 更改配置文件 
vim /etc/sysconfig/flanneld  改为etcd地址

5、启动flannel systemctl start flanneld
systemctl enable flanneld

6、cat /run/flannel/subnet.env
cat /run/flannel/docker

7、vim /usr/lib/systemd/system/docker.service
把启动后加入  /run/flannel/docker 后面的bip 

8、重启docker

9、ifconfig
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

11、补充

物理网---------underlay network

虚拟网络------flannel  overlay network



思考: k8s - 三个网络 :1、物理网络    2、svc网络    3、pod网络

这三个网络我全弄成物理网络那个IP可以嘛? 就不用走那么多规则,是不是更加高效呢?

两个集群之间的Pod不就直接可以相互通信了嘛?

答案是:可以的

那安全怎么解决?

-> 安全加固,低运行时 runc!  kata + gvisor  + 扫描器

-->资源限制, 限制cpu 限制内存

---------------------------------------------------------------

可以一个集群有状态服务 , 一个集群无状态服务