应用集群组件由于其特性,会部署到容器、虚拟机中,那么组件间的通信就会跨多平台。虚拟机是通过ArStack管理维护,K8s则由AKE组件管理维护,两者属于不同的平台。当虚拟机和容器需要相互“交谈”的时候,我们需要以某种方式实现两个独立集群之间的通信。本文将介绍通过ArSDN如何实现容器和虚拟机的互通。
实现思路
单个可用区中部署ArSDN组件,可用区中的AKE、ArStack都接入ArSDN,由ArSDN接管网络平台的控制和数据面流量转发。
当数据面统一由ArSDN接管后,则可以将容器、虚拟机统一到一个平台来管理,可以借助虚拟网络的隔离实现集群间的隔离,通过三层路由器、策略等功能实现跨集群间的通信。
可以自由控制容器、虚拟机和裸机的流量。
容器和虚拟机互通的实现方式
容器集群通过CNI插件实现容器的网络功能。CNI插件的实现有很多种,本文介绍的是华云数据自研的ArSDN CNI。
在容器集群接入ArSDN时,ArSDN CNI会在ArSDN执行一些初始化的操作,比如为每个容器集群创建一个Pod网络和一个Service网络、创建安全策略、网络策略等等,容器的IP地址分配以及安全策略都由ArSDN来管理。
Pod创建流程:
CNI组件watch到有新的Pod创建,会在Pod网络中创建对应的网卡并分配IP地址
Pod在调度完成后,kubelet会调用CNI插件创建Pod网卡
CNI插件调用ArSDN组件获取Pod网卡信息并完成网卡的创建
容器集群内部通信存在几种场景:
Pod和ApiServer通信:类似coredns这类Pod需要访问k8s apiserver获取对应的资源并生成域名信息
容器节点和Pod通信:部分组件会通过域名来访问Service,最终访问