Kubernetes集群中的高性能网络策略

简介: 自从7月份发布Kubernetes 1.3以来,用户已经能够在其集群中定义和实施网络策略。这些策略是防火墙规则,用于指定允许流入和流出的数据类型。如果需要,Kubernetes可以阻止所有未明确允许的流量。

自从7月份发布Kubernetes 1.3以来,用户已经能够在其集群中定义和实 施网络策略。这些策略是防火墙规则,用于指定允许流入和流出的数据类型。如果需要,Kubernetes可以阻止所有未明确允许的流量。本文针对K8s的网络策略进行介绍并对网络性能进行测试。

网络策略

K8s的网络策略应用于通过常用标签标识的pod组。然后,可以使用标签来模拟传统的分段网络,这些网络通常用于在多层应用程序中隔离层:例如,您可以通过特定的“段”标签来标识前端和后端pod。策略控制这些段之间的流量,甚至控制来自外部源的流量。

分段流量

这对于应用程序开发人员意味着什么?最后,Kubernetes获得了提供 [深度防御](https://en.wikipedia.org/wiki/Defense_in_depth_(computing)) 的必要能力。流量可以分段,应用程序的不同部分可以独立保护。例如,您可以通过特定的网络策略非常轻松地保护每个服务:由服务器后的[Replication Controller](http://kubernetes.io/docs/user-guide/replication-controller/)标识的所有窗格都已由特定标签标识。因此,您可以使用同一标签将策略应用于这些pod。

长期以来,深度防御被建议作为[最佳实践](http://blog.kubernetes.io/2016/08/security-best-practices-kubernetes-deployment.html)。在AWS和OpenStack上,通过将安全组应用于VM,可以轻松实现应用程序的不同部分或层之间的这种隔离。

然而,在网络策略之前,这种对容器的隔离是不可能的。VXLAN覆盖可以提供简单的网络隔离,但是应用程序开发人员需要对流量访问pod进行更细粒度的控制。从这个简单的例子可以看出,Kubernetes网络策略可以根据源和源头,协议和端口来管理流量。

apiVersion: extensions/v1beta1
 kind: NetworkPolicy
 metadata:
 name: pol1
 spec:
 podSelector:
 matchLabels:
 role: backend
 ingress: - from: - podSelector:
 matchLabels:
 role: frontend
 ports: - protocol: tcp
 port: 80

并非所有的网络后端都支持策略

网络策略是一个令人兴奋的功能,Kubernetes社区已经工作了很长时间。但是,它需要一个能够应用策略的网络后端。例如,简单路由网络或常用的 [flannel](https://github.com/coreos/flannel) 网络程序本身不能应用网络策略。

今天Kubernetes只有几个具有政策功能的网络组件:[Romana](http://romana.io/),[Calico](http://projectcalico.org/)和[Canal](https://github.com/tigera/canal);与[Weave](http://www.weave.works/)在不久的将来指示支持。 Red Hat的OpenShift还包括网络策略功能。

我们选择Romana作为这些测试的后端,因为它将pod配置为在完整L3配置中使用本地可路由的IP地址。因此,网络策略可以直接由Linux内核中的主机使用iptables规则应用。这个结果是一个高性能,易于管理的网络。

测试网络策略的性能影响

在应用网络策略之后,需要根据这些策略来检查网络分组,以验证这种类型的业务是允许的。但是,对每个数据包应用网络策略的性能损失是多少?我们可以使用所有的策略功能,而不会影响应用程序性能?我们决定通过运行一些测试来找出。

在深入研究这些测试之前,值得一提的是,“性能”是一个棘手的测量,网络性能尤其如此。吞吐量(即以Gpbs测量的数据传输速度)和延迟(完成请求的时间)是网络性能的常用度量。文章:[K8s网络延迟](https://smana.kubespray.io/index.php/posts/kubernetes-net-bench)和[比较k8s的网络方案](http://machinezone.github.io/research/networking-solutions-for-kubernetes/)已经检查了运行覆盖网络对吞吐量和延迟的性能影响。我们从这些测试中学到的是Kubernetes网络通常相当快,服务器没有麻烦使1G链路饱和,有或没有覆盖。只有当你有10G网络,你需要开始思考封装的开销。

这是因为在典型的网络性能基准测试期间,没有用于主机CPU执行的应用逻辑,使得它可用于任何需要的网络处理。**为此,我们在不使链路或CPU饱和的操作范围内运行我们的测试。这具有隔离处理网络策略规则对主机的影响的效果。**对于这些测试,我们决定测量由在一系列响应大小范围内完成HTTP请求所需的平均时间来衡量的延迟。

测试步骤:

**硬件**

两台服务器采用IntelCore i5-5250U CPU(2核,每核2个线程),运行速度1.60GHz,16GBRAM和512GB SSD。

– NIC:Intel以太网连接I218-V(rev 03)
– Ubuntu14.04.5
– Kubernetes 1.3([v1.4.0-beta.5](http://v1.4.0-beta.5/)上的验证样本)
– [Romana v0.9.3.1](https://github.com/romana/romana)
– 客户端和服务器[负载测试软件](https://github.com/paninetworks/testing-tools)。

对于测试,我们有一个客户端pod向服务器pod发送2,000个HTTP请求。 HTTP请求由客户端pod以确保服务器和网络均未饱和的速率发送。我们还确保每个请求通过禁用持久连接(如 HTTP 的[Keep-alive](https://en.wikipedia.org/wiki/HTTP_persistent_connection))启动一个新的TCP会话。我们使用不同的响应大小运行每个测试,并测量平均请求持续时间(完成该大小的请求需要多长时间)。最后,我们用不同的策略配置重复每组测量。

Romana检测Kubernetes网络策略创建时,将其转换为Romana自己的策略格式,然后将其应用于所有主机。目前,Kubernetes网络策略仅适用于入口流量。这意味着传出的流量不受影响。

首先,我们进行了没有任何政策的测试来建立基线。然后,我们再次运行测试,增加测试网段的策略数量。策略是常见的“允许给定协议和端口的流量”格式。为了确保数据包必须遍历所有策略,我们创建了一些不匹配数据包的策略,最后是一个将导致接受数据包的策略。

下表显示不同请求大小和策略数量的结果(以毫秒为单位):

qq%e6%88%aa%e5%9b%be20161208123902

我们在这里看到的是,随着策略数量的增加,即使在应用200个策略之后,处理网络策略也会引入非常小的延迟,绝不会超过0.2ms。为了所有实际目的,当应用网络策略时不引入有意义的延迟。还值得注意的是,响应大小从0.5k增加到1.0k几乎没有效果。这是因为对于非常小的响应,创建新连接的固定开销支配整体响应时间(即传送相同数量的分组)。

qq%e6%88%aa%e5%9b%be20161208123907

**注意:** 0.5k和1k线在上图中的〜.8ms重叠

即使作为基准性能的一个百分比,影响仍然很小。下表显示,对于最小响应大小,最差情况下的延迟保持在7%或更小,最多200个策略。对于较大的响应大小,延迟下降到约1%。

qq%e6%88%aa%e5%9b%be20161208123914

在这些结果中还感兴趣的是,随着策略数量的增加,我们注意到较大的请求经历较小的相对(即百分比)性能降级。

这是因为当Romana安装iptables规则时,它确保首先评估属于已建立连接的数据包。仅需要遍历连接的第一个数据包的完整策略列表。之后,连接被认为“建立”,并且连接的状态被存储在快速查找表中。因此,对于较大的请求,连接的大多数数据包都将在“已建立”表中进行快速查找,而不是对所有规则进行完全遍历。这个iptables优化结果的性能在很大程度上独立于网络策略的数量。

这样的“流表”是网络设备中的常见优化,似乎iptables使用相同的技术相当有效。

它还值得注意的是,在实践中,一个相当复杂的应用程序可以为每个段配置几打规则。同样的,诸如Websockets和持久连接之类的公共网络优化技术甚至会进一步提高网络策略的性能(特别是对于小请求大小),因为连接保持打开时间更长,因此可以从已建立的连接优化中受益。

这些测试是使用Romana作为后端策略提供程序执行的,其他网络策略实现可能会产生不同的结果。但是,这些测试显示,对于几乎每个应用程序部署情形,可以使用Romana作为网络后端应用网络策略,而不会对性能产生任何负面影响。

如果你想自己尝试,我们建议使用[Romana](http://romana.io/)。在我们的[GitHub代码仓库](https://github.com/romana/romana)中,您可以找到一个易于使用的安装程序,它与AWS,Vagrant VM或任何其他服务器配合使用。

总结

通过以上的功能介绍和测试分析,k8s可以对应用之间流量以更小的颗粒度进行控制。网络性能损耗在可以接受的范围之内。

好雨云帮目前的生产环境使用的是k8s 1.2.x版本,我们在使用个版本的时候k8s还没有网络策略控制的功能,因此我们是基于网络插件的方式来实现访问控制的。

我们正在进行k8s 1.3.x版本生产环境的性能及兼容性测试,随后会将所有的企业版本中进行升级,社区版会在企业版升级后的当月25日进行升级。

本文转自中文社区-Kubernetes集群中的高性能网络策略

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
14天前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
1天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
3天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
18 2
|
7天前
|
数据采集 监控 安全
公司网络监控软件:Zig 语言底层优化保障系统高性能运行
在数字化时代,Zig 语言凭借出色的底层控制能力和高性能特性,为公司网络监控软件的优化提供了有力支持。从数据采集、连接管理到数据分析,Zig 语言确保系统高效稳定运行,精准处理海量网络数据,保障企业信息安全与业务连续性。
29 4
|
15天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
1月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
73 1
|
10天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
47 17
|
20天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
21天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
43 10

热门文章

最新文章