灵雀云Kube-OVN:基于OVN的开源Kubernetes网络实践
目前Kube-OVN项目代码已经在Github 上开源,项目地址为:https://github.com/alauda/kube-ovn。项目使用宽松的Apache 2.0 协议,欢迎更多技术开发者和爱好者前去试用和使用。
网络插件那么多,为什么还需要Kube-OVN?
网络插件千千万,为什么还要开发Kube-OVN?从当前Kubernetes网络现状来看,Kubernetes网络相关的组件非常分散。例如,CNI 负责基础容器网络,它本身只是个接口标准,社区和市场上都有很多各自的实现;集群内的服务发现网络需要依赖 kube-proxy,而 kube-proxy 又有 iptables 和 ipvs 两种实现;集群内的 DNS 需要依赖额外组件kube-dns 或coredns;集群对外访问的负载均衡器服务需要依赖各个云厂商提供的Cloud-Provider;网络策略的 NetworkPolicy 本身只是一个标准接口,社区中也有各自不同的实现。此外还有 ingress,Kubernetes提供的只是一个标准接口,社区中同样有各自的实现。
分散的网络组件导致容器网络流量被分散到了不同的网络组件上,一旦出现问题需要在多个组件间游走逐个排查。在实际运维过程中网络问题通常是最难排查的,需要维护人员掌握全链路上所有组件的使用、原理以及排查方式。因此,如果有一个网络方案能够将所有数据平面统一,那么出现问题时只需要排查一个组件即可。
其次,现有网络插件种类繁多,但是在落地时会发现,每个网络插件由于覆盖的功能集合不同,很难在所有场景使用同一套方案。为了满足不同的客户需求,很多厂商一度同时支持多种网络方案,给自身带来很大负担。在落地过程中,还发现很多传统的网络方案在容器网络中是缺失的。一些高级功能是所有网络插件都无法满足的,比如:子网划分、vlan 绑定、nat、qos、固定 IP、基于acl的网络策略等等。
现有 Kubernetes网络能力是否足够?答案很明显,如果真的已经做够强大落地的时候就不会出现这么多的问题。从更大格局来看,Kubernetes本质上是提供了一层虚拟化网络。而虚拟化网络并不是一个新问题。在OpenStack社区,虚拟网络已经有了长足的发展,方案成熟,OVS 基本已经成为网络虚拟化的标准。于是,灵雀云开始把目光投向OVS 以及 OVS 的控制器OVN。
OVN 简介
OVS 是一个单机的虚拟网络交换机,同时支持 OpenFlow 可以实现复杂的网络流量编程,这也是网络虚拟化的基础。通过OVS 和 OpenFlow 可以实现细粒度的流量控制。如果做个类比,OVS 相当于网络虚拟化里的 Docker。
OVS 只是个单机程序,想生成一个集群规模的虚拟网络就需要一个控制器,这就是 OVN。OVN 和 OVS 的关系就好比 Kubernetes 和 Docker 的关系。OVN 会将高层次的网络抽象转换成具体的网络配置和流表,下发到各个节点的OVS上,实现集群网络的管理。
由于 OVN 最初是为 OpenStack 网络功能设计的,提供了大量 Kubernetes 网络目前不存在的功能:
L2/L3 网络虚拟化包括:
• 分布式交换机,分布式路由器
• L2到L4的ACL
• 内部和外部负载均衡器
• QoS,NAT,分布式DNS
• Gateway
• IPv4/IPv6 支持
此外 OVN 支持多平台,可以在Linux,Windows,KVM,XEN,Hyper-V 以及 DPDK 的环境下运行。
综上可以看出 OVN 可以覆盖 CNI, Kube-Proxy, LoadBalancer, NetworkPolicy, DNS 等在内的所有 Kubernetes 网络功能,并在原有基础上有所增强。将之前在OpenStack领域内成熟的网络功能往 Kubernetes 平移,也就诞生了灵雀云的开源项目 Kube-OVN.
Kube-OVN 重要功能及实现
目前大部分网络插件的网络拓扑都是一个大二层网络,通过防火墙做隔离,这种形式非常类似公有云早期的经典网络。Kube-OVN在设计网络支出时同时把多租户的场景考虑进来,方便之后更好的扩展高级功能,因此采用了不同的网络拓扑。

Kube-OVN 网络拓扑
在Kube-OVN的网络拓扑里,不同 Namespace 对应着不同的子网。子网是其中最为重要的概念,之后的内置负载均衡器,防火墙,路由策略以及DNS的网络功能都是和子网绑定的。我们做到了同一台机器的不同 pod 可以使用不同的子网,多个子网之间使用一个虚拟路由器进行网络的联通。为了满足Kubernetes中主机可以和容器互通的网络要求,Kube-OVN在每个主机新增一块虚拟网卡,并接入一个单独的虚拟交换机和集群的虚拟路由器相连,来实现主机和容器网络的互通。
在容器访问外部网络的策略中,Kube-OVN设计了两种方案:一种是分布式 Gateway,每台主机都可以作为当前主机上 Pod 的出网节点,做到出网的分布式。针对企业需要对流量进行审计,希望使用固定IP出网的场景,还做了和 namespace 绑定的 Gateway,可以做到一个 namespace 下的 Pod 使用一个集中式的主机出网。在整个网络拓扑中,除了集中式网关,交换机,路由器,防火墙,负载均衡器,DNS都是分布在每个节点上的,不存在网络的单点。

Kube-OVN架构图
在实现的过程中,Kube-OVN对组件架构进行了大幅的简化,整个流程中只需要一个全局Controller 和分布在每台机器上的 CNI 插件,就可以组建网络,整体安装十分简单。其中全局Controller 负责监听 APIServer 事件,针对 Namespace,Pod,Service,Endpoint 等和网络相关的资源变化对 OVN 进行操作。同时 Controller 会把操作 OVN 的结果,例如 IP ,Mac,网关,路由等信息回写到对应资源的 annotation 中。而 CNI 插件则根据回写的 annotation 信息操作本机的 OVS 以及主机网络配置。通过这种架构Kube-OVN将 CNI 插件和、Controller 和 OVN 解耦,通过 Apiserver 传递所需的网络信息,方便快速开发迭代。
Kube-OVN选择使用最基础的 annotation ,而不是 CRD、API Aggregation 或者 Operator,也是出于降低复杂度的考虑,使用户和开发者都能够快速上手。
Kube-OVN主要具备五大主要功能:
1. Namespace 和子网的绑定,以及子网间访问控制;
2. 静态IP分配;
3. 动态QoS;
4. 分布式和集中式网关;
5. 内嵌 LoadBalancer;
子网是Kube-OVN中最重要的概念,由于子网和 namespace 关联,因此只需要在 namespace 中设置对应的 annotation 就可以完成子网的功能。Kube-OVN支持子网cidr,gateway,exclude_ips 以及 switch_name 的设置。同时支持基于子网的IP隔离,用户可以轻松实施基本的网络隔离策略。在后台实现上,Kube-OVN会监听 namespace 的变化,并根据变化在 ovn 中创建并设置虚拟交换机,将其和集群路由器关联,设置对应的 acl,dns 和 lb。
静态IP的使用可以直接在 Pod 中加入对应的 annotation,Controller 在发现相关 annotation 时会跳过自动分配阶段,直接使用用户指定的 IP/Mac。对应多 Pod 的工作负载,例如 Deployment、DaemonSet,可以指定一个 ip-pool,工作负载下的 Pod 会自动使用ip-pool中未使用的地址。
在QoS功能中,分别实现了 ingress 和 egress 的带宽限制,用户可以在 Pod 运行时通过动态调整 annotation 来实现 QoS 的动态调整,而无需重启 Pod。在后台的实现中, OVN 自带的 QoS 功能工作在 Tunnel 端口,无法对同主机间 Pod 的互访做 QoS 控制。因此Kube-OVN最终通过操作 OVS 的 ingress_policing_rate 和 port qos 字段来实现 QoS 的控制。
在网关设计中,OVN的网关功能有一些使用限制,需要单独的网卡来做 overlay 和 underlay 的流量交换,使用起来比较复杂,为了能够适应更广泛的网络条件并简化用户使用,Kube-OVN对网关部分进行了调整。使用策略路由的方式根据网络包的源 IP 选择下一跳的机器,通过这种方式将流量导入所希望的边界网关节点,然后在网关节点通过 SNAT 的方式对外进行访问。这种方式用户只需要在 namespace 中配置一个网关节点的 annotation 就可以配置对应的流量规则。此外,Kube-OVN也支持非SNAT将容器IP直接暴露给外网的场景,这种情况下只需要外部添加一条静态路由指向容器网络,就可以实现 Pod IP 直接和外部互通。
内嵌的 LoadBalancer 使用 OVN 内置的 L2 LB,这样集群内部的服务发现功能可以直接在 OVS 层面完成,不需要走到宿主机的 iptable 或者 ipvs 规则,可以将 kube-porxy 的功能整合到 Kube-OVN 中。
开源计划 & RoadMap
目前Kube-OVN已经在 github 上开源。OVN 安装比较繁琐,Kube-OVN特意做了安装的简化,现在只需要两个 yaml 就可以部署一个完整的 Kube-OVN。在使用方面也做了优化,通过直观的 annotation 即可对网络进行配置。此外还针对不使用任何 annotation的情况内置了一套默认配置。用户可以使用默认的子网,默认的IP分配策略,默认的分布式网关以及内嵌的负载均衡器,这些都不需要任何配置就可以默认启用。欢迎大家体验试用,多给我们提供反馈和意见。
关于Kube-OVN,近期灵雀云将主要着力于实现三大目标:第一,集中式网关的高可用,消灭整个架构中最后一个单点;第二,内嵌 DNS,去除 Kube-DNS/CoreDNS 的依赖,将整个数据平面用 OVN 进行统一;第三,NetworkPolicy实现。
长期来看,Kube-OVN未来将实现对DPDK 和 Hardware Offload 的支持,解决 Overlay 网络性能问题;将更多的 OVS 监控和链路追踪工具引入 Kubernetes;将OpenStack社区的网络功能向Kubernetes平移,打造更完整的网络体系。
灵雀云Kube-OVN:基于OVN的开源Kubernetes网络实践的更多相关文章
- 灵雀云率先成为 Linux 基金会/CNCF官方认证培训合作伙伴
近日,灵雀云Alauda成为Linux基金会/CNCF授权培训伙伴项目( Linux Foundation Authorized Training Partner Program,以下简称ATP)在国 ...
- 灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟? 历史进入2019年,放眼望去,今天的整个技术大环境和生态都发生了很大的变化.在己亥猪年春节刚刚过去的早春时节,我们来梳理和展望一下整个 ...
- 灵雀云受邀加入VMware 创新网络,共同助力企业数字化进程
11月15日,在VMware主办的“VMware创新网络”2018高峰论坛上,VMware发布了VMware创新网络(VMwareInnovation Network,VIN)的长期发展规划和 ...
- 从拥抱开源到回馈开源,灵雀云助力CNCF中国区培训业务
6月27日,全球首屈一指的开源盛会 2018 LinuxCon + ContainerCon + CloudOpen China (LC3)在中国北京国家会议中心落下帷幕.二度落地中国的LC3大会热度 ...
- 灵雀云容器PaaS平台助力知名股份制银行金融科技革新
互联网.科技和金融的碰撞给银行业带来巨大影响.IT技术起初是传统金融提升效率的工具和方法,随着新技术的演进,技术成为驱动变革的核心要素.Fintech金融科技以技术和数据为驱动,用创新的方法改变了金融 ...
- K8S的网络接口CNI及灵雀云的实践
K8S的网络模型 我们从底层网络来看,分为三个层面.首先是Pod之间的多个容器的网络互通.我们知道,K8S的Pod可以由多个容器组成,这个层面网络互通是比较简单的,因为所有的容器都是共享一个网卡,可以 ...
- 灵雀云CTO陈恺应邀出席国泰君安信息产业投资峰会,探讨全球科技产业新格局
2019年7月9-10日,国泰君安信息产业投资峰会在上海陆家嘴举办.作为国内容器PaaS领域的龙头公司,灵雀云受邀出席本次大会,在“数字化转型从云做起”的论坛中,CTO陈恺发表了<云原生助力企业 ...
- 灵雀云Istio技术实践专题整理
Istio技术实践专题(1) Service Mesh Istio 基本概念和架构基础 Istio被称作Kubernetes的最佳云原生拍档.从今天起,我们推出"Istio技术实践" ...
- 灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor)
灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor) 近日,国内领先的云原生全栈私有云提供商灵雀云宣布,推出企业版云原生制品仓库Ala ...
随机推荐
- Mysql资料 存储索引
- 车载以太网第二弹|测试之实锤-TC8 TCP/IP协议一致性测试实践
前言 车载以太网测试实践系列,我们还分享了PMA测试实践.IOP测试实践 .本期给大家介绍的是TC8中的TCP/IP协议一致性测试(以下简称TCP/IP测试). TCP/IP测试-设备环境组成 TTw ...
- [BUUCTF]PWN——xdctf2015_pwn200
xdctf2015_pwn200 附件 步骤 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入,习惯性的检索程序里的字符串,没有发现什么铭感的地方,直接看ma ...
- [BUUCTF]PWN6——ciscn_2019_c_1
[BUUCTF]PWN6--ciscn_2019_c_1 题目网址:https://buuoj.cn/challenges#ciscn_2019_c_1 步骤: 例行检查,64位,开启了nx保护 nc ...
- [BUUCTF]PWN3——warmup_csaw_2016
[BUUCTF]PWN3--warmup_csaw_2016 题目网址:https://buuoj.cn/challenges#warmup_csaw_2016 步骤: 例行检查,64位,没有开启任何 ...
- Spring 容器的启动过程 流程图 自己看源码的梳理 如有错错误 请指正
- CF1006B Polycarp's Practice 题解
Content 给定一个长度为 \(n\) 的数列,试将其分成 \(k\) 段,使得每一段中的最大值的和最大. 数据范围:\(1\leqslant k,n,a_i\leqslant 2000\). S ...
- Hystrix 监控可视化页面——Dashboard 流监控
1.什么是Dashboard Hystrix-dashboard 是一款针对 Hystrix 进行实时监控的工具页面,通过 Hystrix Dashboard 我们可以在直观地看到各 Hystrix ...
- 【九度OJ】题目1197:奇偶校验 解题报告
[九度OJ]题目1197:奇偶校验 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1197 题目描述: 输入一个字符串,然后对每个字符 ...
- 【LeetCode】551. Student Attendance Record I 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则表达式 统计 日期 题目地址:https://l ...