应用集群组件由于其特性,会部署到容器、虚拟机中,那么组件间的通信就会跨多平台。虚拟机是通过ArStack管理维护,K8s则由AKE组件管理维护,两者属于不同的平台。当虚拟机和容器需要相互“交谈”的时候,我们需要以某种方式实现两个独立集群之间的通信。本文将介绍通过ArSDN如何实现容器和虚拟机的互通。
实现思路
单个可用区中部署ArSDN组件,可用区中的AKE、ArStack都接入ArSDN,由ArSDN接管网络平台的控制和数据面流量转发。
当数据面统一由ArSDN接管后,则可以将容器、虚拟机统一到一个平台来管理,可以借助虚拟网络的隔离实现集群间的隔离,通过三层路由器、策略等功能实现跨集群间的通信。
可以自由控制容器、虚拟机和裸机的流量。
容器和虚拟机互通的实现方式
容器集群通过CNI插件实现容器的网络功能。CNI插件的实现有很多种,本文介绍的是华云数据自研的ArSDN CNI。
在容器集群接入ArSDN时,ArSDN CNI会在ArSDN执行一些初始化的操作,比如为每个容器集群创建一个Pod网络和一个Service网络、创建安全策略、网络策略等等,容器的IP地址分配以及安全策略都由ArSDN来管理。
Pod创建流程:
l CNI组件watch到有新的Pod创建,会在Pod网络中创建对应的网卡并分配IP地址
l Pod在调度完成后,kubelet会调用CNI插件创建Pod网卡
l CNI插件调用ArSDN组件获取Pod网卡信息并完成网卡的创建
容器集群内部通信存在几种场景:
l Pod和ApiServer通信:类似coredns这类Pod需要访问k8s apiserver获取对应的资源并生成域名信息
l 容器节点和Pod通信:部分组件会通过域名来访问Service,最终访问pod
l Pod访问外网:Pod部分页面需要访问公网资源,有出外网的需求。可以通过将pod网络加入路由器来实现
l CNI如何获取pod网卡信息:cni插件获取容器网卡信息用来创建虚拟网卡
下面我们通过区分部署模式来具体介绍每个场景的实现方式
嵌套部署
容器集群如果部署到ArStack的虚拟机中我们称为嵌套部署场景。嵌套场景中ArSDN本身会负责虚拟机的流量,还需要负责转发虚拟机内部的容器流量。
在vrouter组件中会为每个容器网卡创建一个独立的子接口(sub interface),对应的父接口是虚拟机的网卡。通过这种实现,我们可以将容器网卡和虚拟机网卡抽象到同一个平面来管理,他们在数据库中都对应一个virtual-machine-interface只是其中的sub-interface属性值不同
Pod和ApiServer通信
Pod访问ApiServer是通过访问K8S对应的Service IP来实现的,Service的后端对应集群的管理节点IP。嵌套场景中虚拟机有两种网络:管理网、数据网,且都是虚拟网络。我们通过networkpolicy或者路由器将这两个虚拟网络打通,实现三层通信。这样Pod在访问k8s service IP时,流量会转发到管理ip,此时由于管理网和pod网络已经三层打通,可以直接通信。
节点和Pod通信
节点访问Pod实际是从管理网访问Pod网络,类似上面的做法,管理网和pod网络都是虚拟网络且已经三层打通,可以直接通信
CNI如何获取Pod网卡信息
由于cni获取Pod网卡信息的时候,Pod已经完成了调度,也就是说CNI可以直接访问当前节点的Vrouter组件获取网卡信息。嵌套场景中CNI是在虚拟机内部的,需要通过某种方式来访问物理节点上的Vrouter服务。
这里我们通过link-local来实现流量转发,在访问某个固定IP和端口的时候,流量在到达物理节点时直接转换成访问当前节点IP+端口。这里也就是直接访问127.0.0.1:9096
非嵌套部署
容器集群部署到ArStack外部虚拟机或者物理裸机中我们称为非嵌套部署场景。非嵌套场景中容器节点类似一个计算节点,会在上面运行Vrouter组件实现跨节点的数据通信。
Pod和ApiServer通信
非嵌套场景中管理网络正常都是物理网络,我们无法通过networkpolicy或者路由器将它和Pod网路打通。在pod访问k8s service ip时,流量转换成访问管理IP,但是由于pod网络是一个私有网络,和物理网络是隔离的。这里通过link-local将访问的数据包执行snat,使得源地址改成Vhost0 IP。此时只需要在物理设备里将数据网络和管理网打通,就可以通过vhost0 IP来访问apiserver了
节点和Pod通信
节点访问pod网络,默认情况下pod网络是私有网络,从节点来访问根据节点上的路由规则,会走默认路由到外部网络中,是无法通信的。这里我们通过将pod网络开启ip-fabric功能,在物理节点上会动态创建访问pod网络的路由规则,使得在访问pod网络时流量转到vhost0中
CNI如何获取Pod网卡信息
由于在裸机上会直接部署Vrouter,所以CNI可以直接访问当前节点的Vrouter。相对于嵌套模式不需要进行流量转发。
K8S有自己的网络模型,有service/ingress实现四层和七层负载均衡功能,通过networkpolicy实现安全功能,还有其他的qos、端口转发等。ArSDN CNI则将K8S资源模型转换成ArSDN资源模型。
容器和ArStack资源模型对比:
总结
ArSDN cni将k8s资源模型和ArSDN资源进行转换,打通了两者之间的架构差异。
虚拟机通过加入Pod虚拟网络可以实现和容器的二层通信。通过路由器可以实现和容器的三层通信。容器集群间也可以通过网络策略或者路由器打通,为多集群网络通信提供支持。
实现思路
单个可用区中部署ArSDN组件,可用区中的AKE、ArStack都接入ArSDN,由ArSDN接管网络平台的控制和数据面流量转发。
当数据面统一由ArSDN接管后,则可以将容器、虚拟机统一到一个平台来管理,可以借助虚拟网络的隔离实现集群间的隔离,通过三层路由器、策略等功能实现跨集群间的通信。
可以自由控制容器、虚拟机和裸机的流量。
容器和虚拟机互通的实现方式
容器集群通过CNI插件实现容器的网络功能。CNI插件的实现有很多种,本文介绍的是华云数据自研的ArSDN CNI。
在容器集群接入ArSDN时,ArSDN CNI会在ArSDN执行一些初始化的操作,比如为每个容器集群创建一个Pod网络和一个Service网络、创建安全策略、网络策略等等,容器的IP地址分配以及安全策略都由ArSDN来管理。
Pod创建流程:
l CNI组件watch到有新的Pod创建,会在Pod网络中创建对应的网卡并分配IP地址
l Pod在调度完成后,kubelet会调用CNI插件创建Pod网卡
l CNI插件调用ArSDN组件获取Pod网卡信息并完成网卡的创建
容器集群内部通信存在几种场景:
l Pod和ApiServer通信:类似coredns这类Pod需要访问k8s apiserver获取对应的资源并生成域名信息
l 容器节点和Pod通信:部分组件会通过域名来访问Service,最终访问pod
l Pod访问外网:Pod部分页面需要访问公网资源,有出外网的需求。可以通过将pod网络加入路由器来实现
l CNI如何获取pod网卡信息:cni插件获取容器网卡信息用来创建虚拟网卡
下面我们通过区分部署模式来具体介绍每个场景的实现方式
嵌套部署
容器集群如果部署到ArStack的虚拟机中我们称为嵌套部署场景。嵌套场景中ArSDN本身会负责虚拟机的流量,还需要负责转发虚拟机内部的容器流量。
在vrouter组件中会为每个容器网卡创建一个独立的子接口(sub interface),对应的父接口是虚拟机的网卡。通过这种实现,我们可以将容器网卡和虚拟机网卡抽象到同一个平面来管理,他们在数据库中都对应一个virtual-machine-interface只是其中的sub-interface属性值不同
Pod和ApiServer通信
Pod访问ApiServer是通过访问K8S对应的Service IP来实现的,Service的后端对应集群的管理节点IP。嵌套场景中虚拟机有两种网络:管理网、数据网,且都是虚拟网络。我们通过networkpolicy或者路由器将这两个虚拟网络打通,实现三层通信。这样Pod在访问k8s service IP时,流量会转发到管理ip,此时由于管理网和pod网络已经三层打通,可以直接通信。
节点和Pod通信
节点访问Pod实际是从管理网访问Pod网络,类似上面的做法,管理网和pod网络都是虚拟网络且已经三层打通,可以直接通信
CNI如何获取Pod网卡信息
由于cni获取Pod网卡信息的时候,Pod已经完成了调度,也就是说CNI可以直接访问当前节点的Vrouter组件获取网卡信息。嵌套场景中CNI是在虚拟机内部的,需要通过某种方式来访问物理节点上的Vrouter服务。
这里我们通过link-local来实现流量转发,在访问某个固定IP和端口的时候,流量在到达物理节点时直接转换成访问当前节点IP+端口。这里也就是直接访问127.0.0.1:9096
非嵌套部署
容器集群部署到ArStack外部虚拟机或者物理裸机中我们称为非嵌套部署场景。非嵌套场景中容器节点类似一个计算节点,会在上面运行Vrouter组件实现跨节点的数据通信。
Pod和ApiServer通信
非嵌套场景中管理网络正常都是物理网络,我们无法通过networkpolicy或者路由器将它和Pod网路打通。在pod访问k8s service ip时,流量转换成访问管理IP,但是由于pod网络是一个私有网络,和物理网络是隔离的。这里通过link-local将访问的数据包执行snat,使得源地址改成Vhost0 IP。此时只需要在物理设备里将数据网络和管理网打通,就可以通过vhost0 IP来访问apiserver了
节点和Pod通信
节点访问pod网络,默认情况下pod网络是私有网络,从节点来访问根据节点上的路由规则,会走默认路由到外部网络中,是无法通信的。这里我们通过将pod网络开启ip-fabric功能,在物理节点上会动态创建访问pod网络的路由规则,使得在访问pod网络时流量转到vhost0中
CNI如何获取Pod网卡信息
由于在裸机上会直接部署Vrouter,所以CNI可以直接访问当前节点的Vrouter。相对于嵌套模式不需要进行流量转发。
K8S有自己的网络模型,有service/ingress实现四层和七层负载均衡功能,通过networkpolicy实现安全功能,还有其他的qos、端口转发等。ArSDN CNI则将K8S资源模型转换成ArSDN资源模型。
容器和ArStack资源模型对比:
总结
ArSDN cni将k8s资源模型和ArSDN资源进行转换,打通了两者之间的架构差异。
虚拟机通过加入Pod虚拟网络可以实现和容器的二层通信。通过路由器可以实现和容器的三层通信。容器集群间也可以通过网络策略或者路由器打通,为多集群网络通信提供支持。