基于3月26号,在 Dockone 社区的分享整理的内容,效果还不错,最后的QA环节问题超级多,据说是之前最多一次的两倍。这次只是基本概念的介绍,具体我们的架构实现以及开源的信息会之后放出来。
Kubernetes 网络的局限性
Kubernetes 提出了很多网络概念,很多开源项目都有自己的实现。然而由于各个网络功能都是在不同的项目中实现,功能和性能也各有千秋,缺乏统一的解决方案,在使用过程中经常会陷入到底改用哪个的抉择中。同时 cni, dns, service 的实现又在不同的项目,一旦网络出现问题,排查也会在多个组件间游走是一个十分痛苦的过程。
而且尽管 k8s 提出了很多网络的概念,但是在真实应用中很多人多会有这种感觉,那就是网络这块还是很薄弱,很多功能都没有,很多方案也不够灵活。尤其是和传统基础设施网络的人聊天会发现,在他们眼里,k8s的网络还很初级。我们熟悉的 k8s 网络可能是 cni,service,dns,ingress,networkpolicy这样的模式。而做IaaS的视角完全不同,他们一提就是 vpc, subnet, vnic, floating ip,之上再有dhcp,路由控制,安全组,QoS,负载均衡,域名解析这样的基础网络功能。
可以看到从 IaaS 的视角来看,k8s 的网络功能确实比较单薄。我们经常碰到传统的网络部门challenge我们,诸如子网划分vlan隔离,集群内外网络打通,容器 NAT 设置,带宽动态调节等等,现有的开源网络方案都很难完美支持,最简单的一个例子,比如提及容器的固定IP功能通常就要上升到意识形态斗争的层面去讨论。这本质上还是 k8s 的网络功能不足,模型也不够灵活导致的。从更高层面来说k8s中抽象类一层网络虚拟化的内容,然而网络虚拟化或者 SDN 并不是 k8s 带来的新东西,相关技术已经发展了很久了。尤其是在 IaaS 领域里已经有着比较成熟且完善的一整套网络方案。
后来和网络部门的人聊得熟了,他们都会问我们为什么不用 OVS 来做一个网络方案,很多需求用只要容器网络接入ovs网络,剩下事情网络部门自己就知道怎么去做了,都不用我们实现太多额外的功能。也有很多人向我们推荐了 OVN ,说用这个很方便就能实现这些功能。也正是因为这些原因我们才开始去关注 OVS/OVN 这种之前主要应用于 OpenStack 生态系统的网络工具。下面我就来介绍一下 OVS 和 OVN。
OVS和OVN网络方案的能力
网络的概念比较晦涩一些,但是好在我们大家都对 Docker 和k8s比较熟悉,就可以做个类比。如果说 Docker 是对单机计算资源的一个虚拟化,那么 OVS 就是对单机网络进行虚拟化的一个工具。它最基本的功能是实现了一个虚拟交换机,可以把虚拟网卡和虚拟交换机的端口连接,这样一个交换机下的多个网卡网络就打通了,类似Linux Bridge 的功能。在之上,OVS 很重要的一点就是支持 Openflow,这是一种可编程的流量控制语言,可以方便我们以编程的方式对流量进行控制,例如转发,拒绝,更改包信息,NAT,QoS 等等。此外 OVS 还支持多中网络流量监控的协议,方便我们可视化监控并跟踪整个虚拟网络的流量情况。
但是,OVS 只是一个单机的软件,它并没有集群的信息,自己无法了解整个集群的虚拟网络状况,也就无法只通过自己来构建集群规模的虚拟网络。这就好比是单机的 Docker,而 OVN 就相当于是 OVS 的k8s,它提供了一个集中式的 OVS 控制器。这样我们可以从集群的角度对整个网络设施进行编排。同时 OVN 也是新版 OpenStack 中 Neutron 的后端实现,基本可以认为未来的 OpenStack 网络都是通过OVN 来进行控制的。
上图是一个ovn的架构,从下往上看。
ovs-vswitchd 和 ovsdb-server 可以理解为就是单机的docker 负责单机虚拟网络的真实操作。
ovn-controller 类似于kubelet负责和中心控制节点通信获取整个集群的网络信息,并更新本机的流量规则。
Southbound DB 类似于etcd(不太准确)存储集群视角下的逻辑规则。
Northbound DB 类似 apiserver,提供了一组高层次的网络抽象,这样我们在真正创建网络资源时无需关心负责的逻辑规则,只需要通过 Northoboud DB 的接口创建对应实体即可。
CMS 可以理解为 Openstacke 或者 Kubernetes 这样的云平台,而 cms plugin 是云平台和 OVN 对接的部分。
下面我们具体介绍一下 OVN 提供的网络抽象,这样大家就会有比较清晰的认知了。
Logical_Switch 最基础的分布式虚拟交换机,这样可以将多台机器上的容器组织在一个二层网络下,看上去就好像所有容器接在一台交换机上。之后可以在上面增加诸如 ACL,LB, QoS, DNS, Vlan 等等二层功能。
Logical_Router 虚拟路由器,提供了交换机之间的路由,虚拟网络和外部网络连接,之后可以在路由器层面增加 DHCP,NAT,Gateway 等路由相关的功能。
Loadbalancer, L2和L3 的 Loadbalancer,可以类比公有云上的内部lb和外部lb的功能。
ACL 基于L2到L4的所有控制信息进行管控的一组DSL,可以十分灵活,例如:outport == “port1” && ip4 && tcp && tcp.src >= 10000 && tcp.dst <= 1000
QoS,可以基于和 ACL 同样的 DSL 进行带宽的控制。
NAT,同时提供 DNAT和SNAT的控制方便内外网络通信。
DNS,内置的分布式 DNS,可以在本机直接返回内部 DNS 的请求。
Gateway 控制内部和外部之间的集中式通信。
了解了这些,大家应该就能发现,k8s 目前的网络从功能层面其实只是 OVN 支持的一个子集,基本上所有 k8s 的网络需求都能在 OVN 中找到映射关系,我们简单来看下他们之间的映射。
OVN 和 Kubernetes 的结合
Switch/Router -> k8s基本的东西向互通容器网络。这块 OVN 的能力其实是大大的超出,毕竟 OVN 的这套模型是针对多租户进行设计的,而 k8s 现在只需要一个简单的二层网络。
Loadbalancer → ClusterIP 以及 Loadbalancer 类型的 Service,可以取代 kube-proxy 的功能,OVN 本身也可以实现云上 ELB 的功能。
ACL -> Networkpolicy 本质上更灵活因为可以从 L2 控制到 L4 并且 DSL 也支持更多的语法规则。
DNS -> 可以取代 kube-dns/coredns,同时由于 OVN 实现的是分布式 DNS,整体的健壮性会比现在的 k8s 方案要好。
可以看到 k8s 的 cni, kube-proxy, kube-dns, networkpolicy, service 等等概念 OVN 都有对应的方案,而且在功能或者稳定性上还有增强。更不要说还有 QoS, NAT, Gateway 等等现在 k8s 中没有的概念。可以看到如果能把 IaaS 领域的网络能力往 k8s 平移,我们还有很多的提升空间。
最后就来说说我认为的未来 k8s 网络未来可能的增强方向。
Kubernetes 网络未来增强的方向
1. k8s 网络功能和 IaaS 网络功能打平
现在的 k8s 网络模型很类似之前公有云上的经典网络,所有用户大二层打通,通过安全策略控制访问。我们现在也都知道公有云多租户不能这么做 vpc 肯定是标配。因此未来 k8s 网络可能也会向着多租户方向前进,在 vpc 的基础上有更多的路由控制,nat控制,带宽控制,浮动 IP 等等现在 IaaS 上很常见的功能。
2. 性能
现有的开源方案其实主要还是依赖原有的 linux 网络栈,没有针对性的优化。理论上容器的密度比传统虚拟化高,网络压力会更大。OVS 现在有 DPDK 等 kernel bypass 的 datapath,绕过 Linux 内核栈来实现低延迟和大吞吐网络。未来随着容器的密度越来越大,我认为会出现这种针对容器架构专门优化的网络方案,而不是依旧依赖 linux网络栈。
3. 监控和问题排查
现有的网络问题排查十分困难,如果所有的数据平面都由一个项目完成,比如 OVN,那么学习成本和排障都会容易一些。此外 OVS 社区已经有了很多成熟的监控,追踪,排障方案,随着容器的使用场景变多,我认为外围的工具也需要能够很好的支撑这种模式的网络运维问题。
我的内容基本就这些了,我们灵雀云内部目前使用的基于ovn的kubernetes网络,四月份会开源出来,感兴趣的同学到时候可以关注一下。
同时也希望大家能多去 iaas 社区淘淘宝,经常会发现大宝藏,没必要局限在容器这个社区圈里。
超级多的Q&A
Q1:OVS 方案与基于三层交换机方案对比,各有什么优缺点。谢谢。
A:ovs 最大的有点在于可编程,灵活性比较好(虚拟网络不用手动插网线,而且有openflow的加持,可以实现一些普通交换机无法实现的流量控制。物理交换机的主要有点就是性能好,而且比较稳定,不容易出问题。
Q2:ovn不支持ecmp,貌似现在还是active-standby机制,你们怎么解决gateway瓶颈问题?
A:有几种方式:1. gateway 用 dpdk 这样的高速 datapath 2. 多gateway,用策略路不同的ip段走不同gateway,可以分担流量。3. 不使用 ovn概念的 gateway,自己做一些手脚从每台宿主机直接出去,也是分担流量降低单点的风险
Q3:ovn每次逻辑视图变化都会出发ovn整个进行全量计算,你们怎么解决大规模时候耗费大量cpu问题?
A:这个可能我们还没这么大规模的场景还没碰到过这个问题
Q4:ovn-k8s好像只支持每个部署节点一个虚拟网络网段。如何避免ip池浪费和不均衡?
A:这个其实是这个项目实现的网络模型的一个局限性。在我们的实现里是以 namespace 为粒度划分子网,可以对每个namespace进行控制,情况会好很多
Q5:ovn如果有不同的chassis,但是相同ip就会造成网络异常(比如物理机,vm装上ovn,注册到远端后,被重建,后面又注册到远端,但是chassis已经改变),会导致大量节点geneve网络异常。你们怎么解决这个问题
A:暂时没碰到这个问题,但是我们在实现的一个原则就是尽可能保证所有的操作都是幂等的。向这种可能需要在重连前做一个检查,判断是否有过期的数据需要清理,再连接,或者复用旧的连接信息去连接。
Q6:如何debug ovn逻辑拓扑是否配置有问题?
A:目前debug确实很多情况只能靠眼看,也可以使用 ovn-trace 这个工具可以打印数据包在逻辑流里的链路来排查
Q7:ovs跟calico等有啥区别
A: calico 主要依赖 linux 的路由功能做网络打通,ovs 是在软件交换机层面实现网络打通,并提供了更丰富的网络功能
Q8:ovn 的封包支持有stt 和geneve,你们选用那种,为什么?
A:其实还支持 vxlan,选的geneve。原因其实比较简单就是geneve是第一个ovn支持的封包协议,而且看了一些评测,据说在搞内核开启 udp checksum 的情况下性能会比 vxlan 要好一些
Q9:ovs如何实现固定容器ip?
A:这个其实ovs有对应的设置可以给每个端口设定 ip 和 mac,这样网卡启动时配置相同的信息就可以了,难点其实是如何控制ovn来分配 ip,这个可以再开个分享了
Q10:可以简单介绍下你们准备开源的网络功能吗
A:每个 namespace 和一个 logical_switch绑定,支持子网分配,支持固定 ip,支持 qos,支持 networkpolicy,内置的 lb,内置的 dns,大致就是把 ovn的概念映射到kuberentes
Q11:想了解一下,如果采用OVN,是不是意味着我们使用Openstack平台和k8s网络可以直接互通?完成业务在虚拟机和POD之间的全新负载方式?
A:是这样的,如果涉及的合理可以做到容器和vm使用同一个底层网络基础设施,vm和容器之间可以 ip 直达,所有的acl,lb,都是打通的
Q12:ovs/OVN是如何集成到k8s平台的?是直接以网络插件的方式?类似calico或者OpenShiftSDN那种?
A:网络插件的形式,两个 yaml 就可以部署出来
Q13:直接把openshift ovs直接抽出来做k8s的网络插件和你们这个的区别在哪呐。
A:功能上有很多是相同的,(因为底层都是 ovs。如果关注 roadmap 会发现 openshift 之后也会采用 ovn 的模式。从架构的角度来看,现在openshift-multitenant 的实现很类似neutron之前那一套,各种agent,之后会统一到 ovn。另一方面 openshift的网络插件绑定的太死了,所以我们决定还是自己抽出来,顺便能实现我们的一些特殊功能,比如固定IP,子网共享,以及一些网关控制层面的功能
Q14:抱歉 对这块没有太多太深入的了解,我看提到了去iaas社区淘淘宝,比如可否推荐推荐您觉得比较好的某几个项目呢?多谢
A:其实openstack的计算,存储网络几个大项目都挺好的,我是每次有人部署好了,去界面上点几下,从用户视角看一些功能都会有很多新的启发
Q15:你们的ovn使用版本是多少,集群规模如何?
A:我们目前是2.10.1,我们现在规模还比较小,几十台这个规模,主要是内部的一些环境在使用
Q16:前面说支持vxlan,貌似vxlan携带信息很少,ovn如何解决vxlan携带metadata信息少的问题
A:这个没有具体关注是如何携带这些信息的,如果使用的是 geneve 支持变长的头部,可以多加很多控制信息
Q17:请问geneve和vxlan的区有哪些呢?不是特别了解,谢谢
A: geneve 可以理解为下一代的 vxlan,vxlan 相对 vlan 来说头部更长可以支持更多的vlan,但是由于是固定长度的封装头,不能任意加控制信息。geneve采用变长的封装头,可以加很多自定义的控制信息,方便之后做更复杂的网络管控
Q18:openstack 有个kuryr-kubernetes 项目,它的目的是通过neutron来纳管pod网络的,可以实现namespace对应network,service对应lb,pod对应port等,这个貌似支持的也很好,但不支持多租户,和你们做的ovn的方案有类似和不同吧?!如果你们开源了很想试一试!谢谢!
A: 之前没有细看这个项目,看描述的话我觉得是很可能用到是相同的方案。多租户这块其实有很多的问题,有的是 k8s 本身设计层面的问题,可能还是一个很长期的事情。开源了我会第一时间通知大家的
Q19:如果你们开源的话,会以什么形式呈现呢,是在github上开源,还是如何?我们如何能获取到你们开源的信息??
A: 会在 github上(其实都准备差不多了,被同事给摁住了,(此处有广告,关注灵雀云的公众号会有官方通知)我也会通知 dockone尽可能让大家了解
Q20:openstack现在有个mangrum项目,基本上就是让openstack跟k8s做一些融合,不知道这个跟您讲得这个融合之间有没有类似的地方,以及异同?
A: 早期关注过这个项目,最近关注的不多了,如果是做融合的话我觉得大家的方案可能都是大同小异的,可能我们会增加一些我们比较特色的功能(固定IP,网关控制等等
Q21: 用genve的网络方案有哪些能举几个例子不
A: 我了解的就是ovs,还有一些特殊的交换机也支持,不过相对来说还是个比较新的协议。
Q22:现在很多公司要么是做k8s应用层开发,要么是做IAAS层的云平台,不知道你们公司是具体做什么的,为什么会在这么重的两个地方同时发力?
A:这我得给你问问老板去,我感觉还是需求驱动吧,就比如网络这块,碰到客户成熟了,要求上来了,就不得不从根本的地方去提升我们的能力
Q23:贵公司招人不,办公地在哪?
A: 招,研发在北京,深圳,南京。欢迎跨领域能给我们带来更多启发的小伙伴
Q24:最近有公司在搞AVS,不知道您有没有了解,具体貌似是也是基于ovs的改进,能不能谈谈您的看法。
A: 这个还真不知道,我下去研究研究
Q25 docker CNM也支持固定ip呀,和你说的固定ip是一回事嘛?另外,基于OVS建立的网络是CNI还是CNM的呢
A:基于的是CNI,因为我们依赖k8s的模型。不过话说回来我很喜欢docker cnm 那套模型,比 cni要实用很多。固定IP其实只是个功能,各种模型下都可以实现,效果就是可以给 pod 指定ip启动,workload 下的多个pod实用的是一组固定的地址。
Q26 有对比过openshift-sdn的实现么,他们也是走的ovs网络
A: 可以看一下Q13
Q27 感觉这次介绍还是比较少一点,没有涉及太多最佳实践,不知道还有没有下一集,能更深入ovn?
A:确实还有很多内容,一个是时间有限(我也得留点给别的会议)之后还会有机会的
Q28:我之前做k8s docker,现在openstack研发,听了你的分享,感觉很多想法产生共鸣,可惜你们公司不在武汉,捂脸。。。。
A: 我们可以神交
Q29: 目前你们对企业的解决方案里会默认采用这种网络模式么
A:这个方案是我们这几年需求和碰到坑的一个积累吧,现在还不会直接给企业用,我们还需要一些功能的开发和测试,但是之后overlay的场景这个肯定是主推了,主要是取代原来的 flannel vxlan 网络。
Q30:您了解contiv网络方案吗,和贵公司的实现有哪些区别
A:contiv 是思科做的,也是 ovs 实现的,不过它的实现比较早,自己手动实现了整个控制平面,可以认为自己写了个跟 ovn 类似的东西来控制 ovs。不过看他最近已经很少更新了。用 ovn 能用很少的代码就实现基本相同的功能。contiv 有个比较独特的功能就是支持 bgp 的网络间通信,这个是 ovn 暂时不支持的。