k8s 网络模型( 三 )


38
||
39
+--------------------+
40
|

k8s 网络模型

文章插图
41
|
42

是工作在那一层?
4.2
是运行在用户态的用户程序,其基于表来管理规则,用于定义使用框架操作和转换数据包的规则 。根据rule的作用分成了好几个表,比如用来过滤数据包的rule就会放到表中,用于处理地址转换的rule就会放到nat表中,其中rule就是应用在钩子上的函数,用来修改数据包的内容或过滤数据包 。目前支持的表有下面这些:
在k8s中,规则由kube-proxy控制器配置,该控制器监视K8s API服务器的更改 。当对或Pod的虚拟IP地址进行修改时,规则也会更新以便让能够正确的把数据包路由到后端Pod 。
规则监视发往虚拟IP的流量,并且在匹配时,从可用Pod集合中选择随机Pod IP地址,规则将数据包的目标IP地址从的虚拟IP更改为选定的Pod的ip 。总的来说已在机器上完成负载平衡,并将指向的虚拟IP的流量转移到实际的pod的IP 。
在从到pod的路径上,IP地址来自目标Pod 。在这种情况下,再次重写IP头以将Pod IP替换为的IP,以便Pod认为它一直与的虚拟IP通信 。
4.3 IPVS
k8s的最新版本(1.11)包括了用于集群内负载平衡的第二个选项:IPVS 。IPVS(IP)也构建在之上,并实现传输层负载平衡(属于Linux内核的一部分) 。IPVS包含在LVS(Linux虚拟服务器)中,它在主机上运行,并在真实服务器集群前充当负载均衡器 。IPVS可以将对基于TCP和UDP的服务的请求定向到真实服务器,并使真实服务器的服务在单个IP地址上显示为虚拟服务 。这使得IPVS非常适合服务 。
声明服务时,您可以指定是否要使用或IPVS完成群集内负载平衡 。IPVS专门用于负载平衡,并使用更高效的数据结构(哈希表),与相比,允许几乎无限的规模 。在创建IPVS负载时,会发生以下事情:在Node上创建虚拟IPVS接口,将的IP地址绑定到虚拟IPVS接口,并为每个额IP地址创建IPVS服务器 。将来,期望IPVS成为集群内负载平衡的默认方法 。
4.4 Pod到的一个包的流转
image
4.5 到Pod的一个包的流转
image
5.与之间的网络
到目前为止,我们已经了解了如何在集群中路由流量 。下面我们希望将服务暴露给外部使用(互联网) 。这需要强调两个相关的问题:(1)从k8s的访问,以及(2)从访问k8s的.
5.1 k8s流量到
从Node到公共的路由流量是特定于网络的,实际上取决于网络配置 。为了使本节更具体,下面使用AWS VPC讨论具体细节 。
在AWS中,k8s集群在VPC内运行,其中每个Node都分配了一个可从k8s集群内访问的私有IP地址 。要使群集外部的流量可访问,需要将网关连接到VPC 。网关有两个目的:在VPC路由表中提供可以路由到的流量的目标,以及为已分配公共IP地址的任何实例执行网络地址转换(NAT) 。NAT转换负责将群集专用的节点内部IP地址更改为公共中可用的外部IP地址 。
通过网关,Node可以将流量路由到 。不幸的是,有一个小问题 。Pod具有自己的IP地址,该IP地址与承载Pod的Node的IP地址不同,并且网关上的NAT转换仅适用于Node的 IP地址,因为它不知道Node上正在运行那些Pod – 网关不是容器感知的 。让我们再次看看k8s如何使用解决这个问题 。
本质都是使用NAT来做
5.1.1 Node到
image
5.2 到k8s
image.png
让流量进入k8s集群,这特定于配置的网络,可以在网络堆栈的不同层来实现:
5.2.1 第四层流量入口:
让外网访问k8s内部的服务的第一个方法是创建一个类型的,