目录
docker的网络通信
kubernetes的网络通信
总结
kubernetes集群搭建完成后,使用docker ps命令,可以看到正在跑的容器,其中一个容器名字叫flannel。这个flannel是一个开源的网络组件,了解flannel之前,先回顾下docker的网络通信吧。
docker version:17.03
kubernetes version:1.90
docker的网络通信
[root@k8s02 ~]# docker network lsNETWORK ID NAME DRIVER SCOPE acd552bcdec2 bridge bridge local3fba01ae965e host host local1f2f59916861 none null local
docker network ls
查看docker 网络。相比较docker旧版本,17.03版本的docker有三种网络类型。
bridge:桥接模式
桥接模式,也是默认的default的网络模式。一个容器一个network的namesapce。
容器与宿主机的通信是通过桥接模式进行的,这个网桥桥,就是docker0。这个网桥工作方式和物理交换机类似,这个宿主机上的所有容器通过docker0连在了同一个二层网络中
通过ip a或者ifconfig指令,可以看到docker0网桥。每生成一个容器,就会产生一对veth。
通信的过程大概就是dockervethdocker0veth宿主机这样。
容器的ip由网桥分配,网桥是容器的默认网关,不写--net的话,默认的用的就是bridge模式,使用这种模式时,实际上实在iptables里做了DNAT规则,实现转发功能docker在iptables里做了DNAT,允许所有的容器可以访问外部网络,但是不允许外部的网络访问容器,如果要访问,只能通过开放端口
host:主机模式。
需要在启动容器时加上参数--net=host。容器和宿主机共享一个network的namespace。容器的ip就是宿主机的ip、容器的端口的就是宿主机的端口。
注意:只是共享network的namesapce,但是其他方面比如文件系统这些还是和宿主机隔离的。
通常用于跨主机的docker通信
none:这个模式docker容器拥有自己的network namespace ,但是不为容器进行网络配置,容器的网卡、ip这些需要自己配置。用的比较少
kubernetes的网络通信
这里主要讲讲我对容器与容器之间通信、pod与pod之间通信的理解
容器与容器之间的通信:
同一个pod中的容器可以直接通信,他们共享一个network 的namespace,共享同一个linux的协议栈。每个容器都可以通过localhost访问对方的端口。简单安全高效,稍微牺牲了点同一个pod中的容器之间的安全隔离性pod与pod之间的通信:
同一个node中,pod与pod之间的通信:类似于上面讲的dokcer的默认通信。pod与pod之间通信也是通过veth对连接docker0网桥进行通信的
不同node中,pod之间的通信:不同node之间pod的通信,必须通过宿主机的ip进行寻址,有什么办法可以解决呢:1、把pod的ip和宿主机的ip关联起来。2、整个集群中pod的ip进行分配,不能有冲突。为了达到这个目的,采用了开源网络组件,flannel。
Flannel的功能:
1、给每个集群内的pod分配不冲突的ip地址
2、在这些ip之间建立overlay网络,进行通信。
ifocnfig
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1400 inet 10.244.1.0 netmask 255.255.255.255 broadcast 0.0.0.0 inet6 fe80::b4ca:f7ff:fe2b:b391 prefixlen 64 scopeid 0x20<link> ether b6:ca:f7:2b:b3:91 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 8 overruns 0 carrier 0 collisions 0
创建了一个flannel的网桥,既然是网桥,连接了哪两部分呢,一段是docker0,用来与容器通信,另一端是flanneld的服务进程。
flanneld的进程作用:
连接到etcd,来管理分配ip,同时在内存中建立pod节点路由表,下连接到docker0和物理网络,利用路由表,从而完成pod之间的通信
flannel工作原理:
通过修改docker的启动参数,将他分配好的ip穿进去
--bip=ip/24
缺点:
有一些网络延时
使用的UDP传输协议,非可靠。
总结
跟openstack一样,docker集群的网络也是一大难题。本文将、讲的比较浅显,是我自己学习的笔记,如果需要深入了解,请参照官网和kubernetes的社区。
作者:OrangeLoveMilan
链接:https://www.jianshu.com/p/d531ef6f437e