036.集群网络-K8S网络模型及Linux基础网络
2020-03-22 16:01:11来源:博客园 阅读 ()
036.集群网络-K8S网络模型及Linux基础网络
一 Kubernetes网络模型概述
1.1 Kubernetes网络模型
Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则的原因是,用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑如何将容器端口映射到主机端口等问题。 实际上,在Kubernetes的集群里,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。按照这个网络原则抽象出来的为每个Pod都设置一个IP地址的模型也被称作IP-per-Pod模型。 由于Kubernetes的网络模型假设Pod之间访问时使用的是对方Pod的实际地址,所以一个Pod内部的应用程序看到的自己的IP地址和端口与集群内其他Pod看到的一样。它们都是Pod实际分配的IP地址。将IP地址和端口在Pod内部和外部都保持一致,也就不需要使用NAT来进行地址转换了。 Kubernetes的网络之所以这么设计,主要原因就是可以兼容过去的应用。当然,我们使用Linux命令“ipaddrshow”也能看到这些地址,和程序看到的没有什么区别。所以这种IP-per-Pod的方案很好地利用了现有的各种域名解析和发现机制。 为每个Pod都设置一个IP地址的模型还有另外一层含义,那就是同一个Pod内的不同容器会共享同一个网络命名空间,也就是同一个Linux网络协议栈。这就意味着同一个Pod内的容器可以通过localhost来连接对方的端口。这种关系和同一个VM内的进程之间的关系是一样的,看起来Pod内容器之间的隔离性减小了,而且Pod内不同容器之间的端口是共享的,就没有所谓的私有端口的概念了。如果应用必须要使用一些特定的端口范围,那么也可以为这些应用单独创建一些Pod。反之,对那些没有特殊需要的应用,由于Pod内的容器是共享部分资源的,所以可以通过共享资源互相通信,这显然更加容易和高效。针对这些应用,虽然损失了可接受范围内的部分隔离性,却也是值得的。 IP-per-Pod模式和Docker原生的通过动态端口映射方式实现的多节点访问模式有如下差别:- 主要区别是后者的动态端口映射会引入端口管理的复杂性,而且访问者看到的IP地址和端口与服务提供者实际绑定的不同(因为NAT的缘故,它们都被映射成新的地址或端口了),这也会引起应用配置的复杂化。
- 同时,标准的DNS等名字解析服务也不适用了,甚至服务注册和发现机制都比较复杂,因为在端口映射情况下,服务自身很难知道自己对外暴露的真实的服务IP和端口,外部应用也无法通过服务所在容器的私有IP地址和端口来访问服务。
- 所有容器都可以在不用NAT的方式下同别的容器通信。
- 所有节点都可以在不用NAT的方式下同所有容器通信,反之亦然。
- 容器的地址和别人看到的地址是同一个地址。
二 Docker网络基础
Docker本身的技术依赖于近年来Linux内核虚拟化技术的发展,所以Docker对Linux内核的特性有很强的依赖。Docker通常使用到的与Linux网络有关的主要技术有:网络命名空间(Network Namespace)、Veth设备对、网桥、ipatables和路由。2.1 网络命名空间
为了支持网络协议栈的多个实例,Linux在网络栈中引入了网络命名空间,这些独立的协议栈被隔离到不同的命名空间中。 处于不同命名空间中的网络栈是完全隔离的,彼此之间无法通信。通过对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境。Docker正是利用了网络的命名空间特性,实现了不同容器之间的网络隔离。在Linux的网络命名空间中可以有自己独立的路由表及独立的iptables设置来提供包转发、NAT及IP包过滤等功能。 为了隔离出独立的协议栈,需要纳入命名空间的元素有进程、套接字、网络设备等。进程创建的套接字必须属于某个命名空间,套接字的操作也必须在命名空间中进行。同样,网络设备也必须属于某个命名空间。因为网络设备属于公共资源,所以可以通过修改属性实现在命名空间之间移动。- 网络命名空间的实现
- 网络命名空间操作
1 [root@k8smaster01 ~]# ip netns add mytestns #创建命名空间 2 [root@k8smaster01 ~]# ip netns exec mytestns <command> #进入命名空间bash 3 [root@k8smaster01 ~]# ip netns exec mytestns bash #进入命名空间bash 4 [root@k8smaster01 ~]# exit #退出命名空间 5 [root@k8smaster01 ~]# ip link set <device> netns mytestns #转移设备注意:因为一个设备只能属于一个命名空间,所以转移后在这个命名空间中就看不到这个设备了。在设备里面有一个重要的属性:NETIF_F_ETNS_LOCAL,如果这个属性为on,就不能被转移到其他命名空间中。Veth设备属于可以转移的设备,而很多其他设备如lo设备、vxlan设备、ppp设备、bridge设备等都是不可以转移的。
2.2 Veth设备对
引入Veth设备对是为了在不同的网络命名空间之间通信,利用它可以直接将两个网络命名空间连接起来。由于要连接两个网络命名空间,所以Veth设备都是成对出现的,很像一对以太网卡,并且中间有一根直连的网线。通常将其中一端称为另一端的peer。 在Veth设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。Veth设备对的示意图如下:- veth pair操作
1 [root@k8smaster01 ~]# ip link add veth0 type veth peer name veth1 #创建veth设备对 2 [root@k8smaster01 ~]# ip link show | grep veth #当前查看veth 3 [root@k8smaster01 ~]# ip netns add ns0 4 [root@k8smaster01 ~]# ip netns add ns1 #创建命名空间 5 [root@k8smaster01 ~]# ip link set veth0 netns ns0 6 [root@k8smaster01 ~]# ip link set veth1 netns ns1 #veth移入命名空间 7 [root@k8smaster01 ~]# ip netns exec ns0 ip link show #进入命名空间查看veth 8 [root@k8smaster01 ~]# ip netns exec ns0 ip addr add local 192.168.10.1/24 dev veth0 9 [root@k8smaster01 ~]# ip netns exec ns1 ip addr add local 192.168.10.2/24 dev veth1 #设置对应的IP 10 [root@k8smaster01 ~]# ip netns exec ns0 ifconfig veth0 up 11 [root@k8smaster01 ~]# ip netns exec ns1 ifconfig veth1 up #开启设备 12 [root@k8smaster01 ~]# ip netns exec ns0 ping 192.168.10.2 #连通性测试提示:在Docker内部,Veth设备对也是连通容器与宿主机的主要网络设备。
1 [root@k8smaster01 ~]# ip netns exec ns0 ethtool -S veth0 2 NIC statistics: 3 peer_ifindex: 9 4 [root@k8smaster01 ~]# ip netns exec ns1 ip link | grep 9
2.3 网桥
Linux可以支持多个不同的网络,它们之间能够相互通信,可通过网桥将这些网络连接起来并实现各网络中主机的相互通信。 网桥是一个二层的虚拟网络设备,把若干个网络接口“连接”起来,以使得网络接口之间的报文能够互相转发。网桥能够解析收发的报文,读取目标MAC地址的信息,和自己记录的MAC表结合,来决策报文的转发目标网络接口。 为了实现转发功能,网桥学习源MAC地址(二层网桥转发的依据就是MAC地址)。在转发报文时,网桥只需要向特定的网口进行转发,来避免不必要的网络交互。如果接受到未学习到的地址,就无法知道这个报文应该向哪个网络接口转发,就将报文广播给所有的网络接口(报文来源的网络接口除外)。 在实际的网络中,网络拓扑若出现改变,如设备被移动到另一个端口上,却没有发送任何数据,网桥设备就无法感知到这个变化,网桥还是向原来的端口转发数据包,在这种情况下数据就会丢失。所以网桥还要对学习到的MAC地址表加上超时时间(默认为5min)。如果网桥收到了对应端口MAC地址回发的包,则重置超时时间,否则过了超时时间后,就认为设备已经不在那个端口上了,它就会重新广播发送。 对于多网卡、多虚拟的设备,Linux的网桥提供了在这些设备之间互相转发数据的二层设备。Linux内核支持网口的桥接(目前只支持以太网接口)。但是与单纯的交换机不同,交换机只是一个二层设备,对于接收到的报文,要么转发,要么丢弃。运行着Linux内核的机器本身就是一台主机,有可能是网络报文的目的地,其收到的报文除了转发和丢弃,还可能被送到网络协议栈的上层(网络层),从而被自己(这台主机本身的协议栈)消化,所以既可以把网桥看作一个二层设备,也可以把它看作一个三层设备。- Linux网桥的实现
- 网桥的常用操作命令
1 [root@k8smaster01 ~]# ip link add tap1 type veth peer name tap1_peer 2 [root@k8smaster01 ~]# ip link add tap2 type veth peer name tap2_peer 3 [root@k8smaster01 ~]# ip link add tap3 type veth peer name tap3_peer 4 [root@k8smaster01 ~]# ip link add tap4 type veth peer name tap4_peer 5 #创建veth pair 6 [root@k8smaster01 ~]# ip netns add ns1 7 [root@k8smaster01 ~]# ip netns add ns2 8 [root@k8smaster01 ~]# ip netns add ns3 9 [root@k8smaster01 ~]# ip netns add ns4 10 #创建namespace 11 [root@k8smaster01 ~]# ip link set tap1 netns ns1 12 [root@k8smaster01 ~]# ip link set tap2 netns ns2 13 [root@k8smaster01 ~]# ip link set tap3 netns ns3 14 [root@k8smaster01 ~]# ip link set tap4 netns ns4 15 #tap和namespace关联 16 [root@k8smaster01 ~]# brctl addbr br1 #创建桥 17 [root@k8smaster01 ~]# brctl addif br1 tap1_peer 18 [root@k8smaster01 ~]# brctl addif br1 tap2_peer 19 [root@k8smaster01 ~]# brctl addif br1 tap3_peer 20 [root@k8smaster01 ~]# brctl addif br1 tap4_peer 21 #把相应的tap添加至bright中 22 [root@k8smaster01 ~]# ip netns exec ns1 ip addr add local 192.168.20.1/24 dev tap1 23 [root@k8smaster01 ~]# ip netns exec ns2 ip addr add local 192.168.20.2/24 dev tap2 24 [root@k8smaster01 ~]# ip netns exec ns3 ip addr add local 192.168.20.3/24 dev tap3 25 [root@k8smaster01 ~]# ip netns exec ns4 ip addr add local 192.168.20.4/24 dev tap4 26 #配置相应IP地址 27 [root@k8smaster01 ~]# ip link set br1 up 28 [root@k8smaster01 ~]# ip link set tap1_peer up 29 [root@k8smaster01 ~]# ip link set tap2_peer up 30 [root@k8smaster01 ~]# ip link set tap3_peer up 31 [root@k8smaster01 ~]# ip link set tap4_peer up 32 [root@k8smaster01 ~]# ip netns exec ns1 ip link set tap1 up 33 [root@k8smaster01 ~]# ip netns exec ns2 ip link set tap2 up 34 [root@k8smaster01 ~]# ip netns exec ns3 ip link set tap3 up 35 [root@k8smaster01 ~]# ip netns exec ns4 ip link set tap4 up 36 #将bright和tap设置为up 37 [root@k8smaster01 ~]# ip netns exec ns1 ping 192.168.20.2 #互ping提示:若物理网卡作为网桥的一个网口,则此物理网卡将在链路层工作(是一个纯链路层设备),就不再需要IP地址了,可以取消物理网卡的IP,给网桥配置一个IP地址。
2.4 iptables和Netfilter
Linux提供了一套机制来为用户实现自定义的数据包处理过程。在Linux网络协议栈中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux网络栈处理数据包的过程中对数据包进行一些操作,例如过滤、修改、丢弃等。 整个挂接点技术叫作Netfilter和iptables。Netfilter负责在内核中执行各种挂接的规则,运行在内核模式中;而iptables是在用户模式下运行的进程,负责协助和维护内核中Netfilter的各种规则表。二者互相配合来实现整个Linux网络协议栈中灵活的数据包处理机制。- iptables规则
- filter:实现防火墙功能;
- nat:实现NAT功能;
- mangle:实现流量整形。
- iptables-save: 按照命令的方式打印iptables的内容。
- iptables-vnL: 以另一种格式显示Netfilter表的内容。
- Netfilter规则
- PREROUTING:报文进入网络接口尚未进入路由之前的时刻;
- INPUT:路由判断是本机接收的报文,准备从内核空间进入到用户空间的时刻;
- FORWARD:路由判断不是本机接收的报文,需要路由转发,路由转发的那个时刻;
- OUTPUT:本机报文需要发出去 经过路由判断选择好端口以后,准备发送的那一刻 ;
- POSTROUTING:FORWARD/OUTPUT 已经完成,报文即将出网络接口的那一刻 。
2.5 路由
Linux系统包含一个完整的路由功能。当IP层在处理数据发送或者转发时,会使用路由表来决定发往哪里。在通常情况下,如果主机与目的主机直接相连,那么主机可以直接发送IP报文到目的主机,这个过程比较简单。例如,通过点对点的链接或网络共享。如果主机与目的主机没有直接相连,那么主机会将IP报文发送给默认的路由器,然后由路由器来决定往哪里发送IP报文。 路由功能由IP层维护的一张路由表来实现。当主机收到数据报文时,它用此表来决策接下来应该做什么操作。当从网络侧接收到数据报文时,IP层首先会检查报文的IP地址是否与主机自身的地址相同。如果数据报文中的IP地址是主机自身的地址,那么报文将被发送到传输层相应的协议中。如果报文中的IP地址不是主机自身的地址,并且主机配置了路由功能,那么报文将被转发,否则,报文将被丢弃。 路由表中的数据一般是以条目形式存在的。一个典型的路由表条目通常包含以下主要的条目项。- 目的IP地址:此字段表示目标的IP地址。这个IP地址可以是某主机的地址,也可以是一个网络地址。如果这个条目包含的是一个主机地址,那么它的主机ID将被标记为非零;如果这个条目包含的是一个网络地址,那么它的主机ID将被标记为零。
- 下一跳路由器的IP地址:若并非最终目的的路由器,则该条目给出的下一个路由器的地址用来转发在相应接口接收到的IP数据报文。
- 标志:这个字段提供了另一组重要信息,例如,目的IP地址是一个主机地址还是一个网络地址。此外,从标志中可以得知下一个路由器是一个真实路由器还是一个直接相连的接口。
- 网络接口规范:为一些数据报文的网络接口规范,该规范将与报文一起被转发。
在通过路由表转发时,如果任何条目的第1个字段完全匹配目的IP地址(主机)或部分匹配条目的IP地址(网络),它将指示下一个路由器的IP地址。条目中的所有其他字段将提供更多的辅助信息来为路由转发做决定。 如果没有找到一个完全匹配的IP,就接着搜索相匹配的网络ID。如果找到,那么该数据报文会被转发到指定的路由器上。可以看出,网络上的所有主机都通过这个路由表中的单个(这个)条目进行管理。 如果上述两个条件都不匹配,那么该数据报文将被转发到一个默认的路由器上。 如果上述步骤都失败,默认路由器也不存在,那么该数据报文最终无法被转发。任何无法投递的数据报文都将产生一个ICMP主机不可达或ICMP网络不可达的错误,并将此错误返回给生成此数据报文的应用程序。
- 路由表的创建
- 路由表的查看
原文链接:https://www.cnblogs.com/itzgr/p/12544350.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:搭建属于自己的服务器
- keepalived 实现LVS负载均衡高可用集群(一) 2020-06-04
- 树莓派命令行配置无线网络 2020-05-29
- corosync v1 + pacemaker高可用集群部署(二)资源配置(VIP+ 2020-05-28
- 容器技术之Docker网络 2020-05-24
- Linux VMware centOS7 网络配置 2020-05-21
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash