标签:动态分配 网卡配置 应用 flann 内容 sea col 内核 oca
作者 | 溪恒? 阿里云技术专家
直播完整视频回顾:https://www.bilibili.com/video/BV1nC4y1x7mt/
关注“阿里巴巴云原生”公众号,后台回复?“416”?即可下载 PPT。
4 月 16 日,我们发起了第 2 期 SIG Cloud-Provider-Alibaba 网研会直播。本次直播主要介绍了阿里云在云原生环境中如何设计和构建高性能云原生容器网络。本文汇集了此次直播完整视频回顾及资料下载,并整理了直播过程中收集的问题和解答,希望能够对大家有所帮助~
本文汇集了此次直播完整视频回顾及资料下载,并整理了直播过程中收集的问题和解答,希望能够对大家有所帮助~
首先,给大家介绍一下 Cloud Provider SIG, Cloud Provider SIG?是 Kubernetes 的云厂商兴趣小组,致力于让 Kubernetes 的生态系统往厂商中立的方向演进,他会负责协调不同厂商尽可能以统一的标准来满足开发者的需求。阿里云作为国内首个加入 Cloud Provider SIG 的云厂商也在推动 Kubernetes 的进一步标准化,并进一步和横向云厂商如 AWS、Google、Azure 进行技术协同,优化云和 Kubernetes 连接,并统一不同组件的模块化和标准化协议。非常期待你与我们一同共建。
第 1 期网研会回顾:Kubernetes SIG-Cloud-Provider-Alibaba 首次网研会(含 PPT 下载)
随着云原生计算的普及,越来越多的应用负载都部署在 Kubernetes 之上,Kubernetes 已成为云原生计算的基石,成为用户和云计算新的交互界面。而网络作为应用的最基础的依赖之一,在应用云原生化中是必不可少的基础组件,也是很多开发者在云原生化时最担心的地方,面临很多问题,例如容器网络跟原有机器网络不在一个平面,容器的 Overlay 容器网络带来了封包的性能损失,Kubernetes 的负载均衡和服务发现的可扩展性不足等等。那么怎样才能构建集群容器网络呢?
本次分享将会介绍阿里云在云原生环境中如何设计和构建高性能云原生容器网络。
今天的分享将从 3 个方面进行:
首先我们会介绍下 Kubernetes 容器网络的基础概念,包括:
如下所示是 Kubernetes Pod 网络示意图:
首先我们会介绍 Pod 网络的连通性,这里就是我们常说的 CNI 网络,主要包含了以下内容:
而实现这些网络的能力,需要地址分配和网络打通,通常是由网络插件(CNI)来负责实现的。
CNI 插件即 Container Network Interface,是 K8s 配置容器网络的 API 接口。CNI 插件就是实现了这个 API 的一系列网络插件,例如我们常见的有 Terway,Flannel, Calico 等等。
在我们创建 Pod 时:
通常 Pod 跟宿主机网络不在一个平面,要如何打通 Pod 之间通信呢?一般实现 Pod 之间联通的方案有两种:
为什么需要 Kubernetes Service?原因如下:
云上 IaaS 层网络虚拟化,在容器中再做一层网络虚拟化带来的性能损失比较大。
云原生容器网络是直接使用云上原生云资源配置容器网络:
在 CNI 调用中调用云网络 OpenAPI 完成网络资源分配:
由于容器的网络直接成为了 VPC 中的一等公民,所以使用云原生容器网络会有这些优势:
IaaS 层网络资源(以阿里云为例):
利用弹性网卡或者弹性网卡辅助 IP 分配给 Pod 来实现云原生容器网络:
如何解决云资源跟容器快速扩缩容的差距:
Terway 通过内置资源池来缓冲资源加速启动:
对并行的 Pod 网络配置调用批量申请资源:
除此之外还有很多资源管理策略,例如:如何选择 Pod 要用的虚拟交换机,保证 IP 充裕?如何平衡每个节点上的网卡的队列和中断数,保证争抢最少?
可参考 Terway 文档或代码:https://github.com/AliyunContainerService/terway。
Pod 独占弹性网卡模式:
它的在CNI的实现方式是:
这种方式的特点和优势是:
Pod 共享弹性网卡模式:
它的在CNI的实现方式是:
这种方式的特点和优势是:
默认的 Kubernetes 的 Service 实现 kube-proxy,它是使用了 iptables 去配置 Service IP 和负载均衡:
如上图所示:
NetworkPolicy 是 Kubernetes 控制 Pod 和 Pod 间是否允许通信的规则。目前主流的 NetworkPolicy 实现基于 iptables 实现,同样有 iptables 的扩展性问题:
关于 eBPF 的介绍如下:
如上图所示,使用 tc 工具注入 eBPF 程序到 Pod 的网卡上,可以直接将 Service 和 NetworkPolicy 在网卡中解决,然后直接转发到弹性网卡,大幅降低网络复杂度:
PS:我们使用 Cilium 作为节点上的 BPF-agent 去配置容器网卡的 BPF 规则,已贡献 Terway 相关适配:https://github.com/cilium/cilium/pull/10251
Kubernetes Pod 解析 DNS 域名会 search 很多次,例如上图 Pod 中 DNS 配置,当它请求 aliyun.com,会依次解析:
Coredns 是中心化部署在某一个节点上的,Pod 访问 Coredns 解析经过链路过长,又是 UDP 协议,导致失败率高。
由客户端 Search 变成服务端 Search:
当 Pod 请求 Coredns 时解析域名:
以上就是阿里云的高性能云原生的容器网络设计和构建过程,随着云原生的不断发展,会有越来越多类型的应用负载运行在 K8s 上,同时也会有更多的云服务会融入到容器场景之中。我们相信以后在高性能的云原生容器网络中会孵化出更多的功能和应用场景。
欢迎有兴趣的同学一起参与共建!
Q1:创建 pod netns 的时候, 是使用 veth pair?连接 pod netns 和 host 的吗?
A1:详见下方内容。
共享 ENI 模式:在 3.10 的内核中,为了兼容性,我们使用 veth pair 打通的 namespace,而在 4.x 的内核中,比如阿里云上我们使用的 aliyunlinux2,是 4.19 的内核,我们采用的是 IPVlan 打通的 namespace;
Q2:Pod IP 不固定怎么做安全审计?
A2:详见下方内容。
Pod 在其声明周期中 IP 是不变的,可以在 K8s 的事件中找到这个 IP 地址在某个事件分配给了哪个 Pod 做对照;
在 Terway 的 NetworkPolicy 的实现中,是通过 label 的方式标识 Pod 的,当 Pod 重建后监控到会动态更新 label 对应 Pod 的 IP 地址;
Q3:ipvlan 对内核要求比较高吧?
A3:是的,在阿里云上,我们可以使用 aliyunlinux2 的 4.19 的内核。对于低内核,Terway 也是支持 veth pair+ 策略路由方式来共享 ENI 上的辅助 IP,只是性能会低一些。
Q4:在 pod 内启动 ebpf, 会不会影响 pod 启动的速度? pod 内的 ebpf 部署时间估计是多少?
A4:ebpf 的程序代码不会太大,目前看整个部署时间增加在百毫秒的级别。
Q5:是否支持 IPV6,实现上遇到了什么问题吗?内核或 kube-proxy 代码问题?
A5:目前支持通过 IPV6 的 LoadBalancer 暴露,但实现还是在 LoadBalancer 中做 6to4 转换。目前 Pod 还未支持 IPV6,K8s 从 1.16 中 kube-proxy 等开始支持 IPV6,我们也在积极跟进,计划今年会和阿里云 IaaS 一起实现原生的 Pod IPv4/IPv6 双栈。
Q6:每次请求 coredns 解析,都去根据源 ip 去获取直接访问的服务,是调用 K8s ?api 获取吗?会不会增加 api 的压力?
A6:不会的,那里那样画是为了让结构更易于理解,实际上 Coredns 的 AutoPath 会通过 watch&list 的机制去从 ApiServer 那里监听 Pod 和 Svc 的变化,然后更新本地的缓存。
Q7:K8s 的 Service 请求到一组 pod,这个过程是轮询的吗?请求到每个 pod 的概率是一样的吗?
A7:对,概率是一样的,可以理解为 LB 领域的 roundrobin 算法。
Q8:ipvlan 和 ebpf 好像是高内核才支持的,是不是对宿主机内核有要求?
A8:是的,在阿里云上,我们可以使用 aliyunlinux2 的 4.19 的内核。对于低内核,Terway 也是支持 veth pair + 策略路由方式来共享 ENI 上的辅助 IP,只是性能会低一些。
Q9:cilium 是如何管理 ip 的呢,或者说分配 ip?类似其他的 cni 插件管理 ip pool 吗?
A9:cilium 本身有两种分配 IP 的办法:host-local:就是每个节点分段,然后顺序分配;另外一种是 CRD-backend,可以让 IPAM 插件自己实现分配。Terway 中的?cilium?只会做网络策略和?Service?的劫持和负载,不会做 IP?分配和配置。
Q10:cilium 应该不是注入 bpf 到容器的 veth,而是注入到 host 端的 veth?你们做了什么修改吗?
A10:是的,cilium 是修改的容器对侧的 veth,我们经过测试发现 IPvlan 的性能优于 veth,Terway 中是使用 IPvlan 做的高性能网络,是不存在对侧 veth 的。我们适配的修改请参考:https://github.com/cilium/cilium/pull/10251, 另外 Terway 使用 Cilium 只会做 NetworkPolicy 和 Service 的劫持和负载。
Q11:使用 terway 插件后, pod 是如何访问 service 的 clusterip 的?
A11:使用内置在 Pod 网卡上的 ebpf 程序直接将 serviceIP 负载到后端的 pod。
Q12:能聊下阿里云对 service mesh 这块有什么规划吗?
A12:阿里云目前已经产品化了 ASM 的 Service Mesh 产品,后面的发展会在易用性、性能以及全球跨地域云边端一体化连接等方向。
Q13:和 node 的网络打通后,如果一个 pod 的 ip 被复用,之前的 arp 缓存应该会有影响吧?同时出现节点级别的故障,是否会有 IP 冲突?
A13:首先云上的网络不会存在 arp 的问题,一般 IaaS 层的转发采用 3 层的转发,如果云下自己使用?IPvlan也不存在这个问题,使用 Macvlan 的话会有 arp 缓存的影响,一般来说可以采用 macnat 的方式(ebtables,ebpf 都可以实现哈)。是否存在 IP 冲突是要看 IP 管理策略,在目前的 Terway 方案中 IPAM 直接调用 IaaS 的IPAM,是不存在这个问题的,自己线下搭建得考虑 DHCP 策略或静态分配 IP 地址去规避。
Q14:“通过 eBPF 对链路的简化,性能有明显提升,相对 iptables 提升 32%, 相对 ipvs 提升 62%;”为什么对 ipvs 性能的提升更明显?如果主要是对 iptables 的线性匹配和更新优化的话?
A14:这里的这个对比是针对只有一个 Service 的对比,是主要看链路简化的影响。iptables 模式是 nat 表进行的 DNAT,是只有 forward 流程,而 ipvs 是会经过 INPUT 和 OUTPUT 的,所以在单个服务的情况下 iptables 可能还会更好一些,但是 iptables 的线性匹配会让服务数量很多时性能下降明显。比如 5000 service?时就 ipvs?更好啦 XD:
Q15:如果没有用这套网络方案,又觉得 service 大规模使用影响性能,有什么好的方案吗?
A15:kube-proxy ipvs 模式的性能在大规模中损失还好,但其实整体引入了过长的链路,所以延时会增加一些。
“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”
在生产环境中,阿里云如何构建高性能云原生容器网络?(含 PPT 下载)
标签:动态分配 网卡配置 应用 flann 内容 sea col 内核 oca
原文地址:https://blog.51cto.com/13778063/2488154