【Kubernetes】K8S 网络隔离 方案

参考资料:

K8S-网络隔离参考

OpenContrail is an open source network virtualization platform for the cloud. – Kube-O-Contrail – get your hands dirty with Kubernetes and OpenContrail
OpenContrail is an open source network virtualization platform for the cloud.
OpenContrail 体系架构文档 - 飞翔的鹰的日志 - 网易博客
opencontrail学习(一) - wanjia19870902的专栏 - 博客频道 - CSDN.NET
Calico - Project Calico Documentation
Make the Most from Kubernetes‘ New Network Policy API - The New Stack
Project Calico | A Pure Layer 3 Approach to Virtual Networking
Kubernetes集群中的高性能网络策略 - 好雨云帮 - SegmentFault
romana/romana: The Romana Project - Installation scripts, documentation, issue tracker and wiki. Start here.

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

网络策略

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

分段流量

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

长期以来,深度防御被建议作为最佳实践。在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 网络程序本身不能应用网络策略。

今天Kubernetes只有几个具有政策功能的网络组件:RomanaCalicoCanal;与Weave在不久的将来指示支持。 Red Hat的OpenShift还包括网络策略功能。

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

测试网络策略的性能影响

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

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

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

测试步骤:

硬件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

总结

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

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

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

后续我会针对calico与k8s结合的方式来完成网络互通和网络的隔离控制并对性能的损耗进行测试分析,在以后的文章中我会把测试的情况跟大家分享和讨论。

原文链接:http://blog.kubernetes.io/2016/09/high-performance-network-policies-kubernetes.html

时间: 2024-10-12 12:05:57

【Kubernetes】K8S 网络隔离 方案的相关文章

虚拟桌面安全策略:网络隔离方案

在传统的桌面方案中网络隔离方面大多使用物理隔离(如隔离卡方案.双PC模式)以及逻辑隔离(如基于ACL/VLAN的网络策略)来实现网络的隔离. 此外也可以借此如网络准入操作简称NAC的方式来实现网络的逻辑隔离NAC的方式支持多种模式 基于802.1x(与网络交换机联动当发现用户终端不符合安全策略时将用户终端隔离到特定VLAN). 基于网关模式的NAC(如VPN模式当NAC设备放在用户需要访问的服务器的前端如公司内网门户用户访问后端服务时客户的流量因为需要经过NAC设备所以可以强制用户的设备做安全检

《两地书》--Kubernetes(K8s)基础知识(docker容器技术)

大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相决绝”,寄来给家乡留守的妻子一封<两地书>,上面只有一行数字:“一二三四五六七八九十百千万.”意义是:无亿,我已经无意于你啦. 卓文君看了这封信也不示弱,回了一首<怨郎诗>,司马相如看了发现虽然我是靠写诗吃饭的.要说写诗还是我媳妇厉害,于是亲自将卓文君迎回长安. 卓文君其实是个二婚.头

k8s网络之设计与实现

k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 K8s网络设计与实现是在学习k8s网络过程中总结的内容.在学习k8s网络各种插件之前我觉得有必要先搞清楚其设计思路是怎样的,在知道其规范的情况下肯定能跟深刻理解k8s网络的各种插件.就像拥有指南针的船,才不会跑偏. 一.K8s网络设计 1.每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间 2.集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问

k8s网络之Flannel网络

k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址. 在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配.这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址.并使这些容器之间能够之间通过IP地址相互找

Kubernetes K8s架构师实战集训营

Kubernetes K8s架构师实战集训营 https://pan.baidu.com/s/1ZSHbOurKhvVLu15Q_fNI9Q Kubernetes K8s架构师实战集训营 https://pan.baidu.com/s/1ZSHbOurKhvVLu15Q_fNI9Q ├─第 1 章:Ansible 自动化部署 K8S 集群 01-Ansible 概述,基本使用.mp4 02-7个常用模块基本使用.mp4 03-Playbook 基本使用-A.mp4 03-Playbook 基本使

虚拟机的网络配置方案

宿主机(windows)和客户机(虚拟机)网络连接 推荐使用第一种. 1.host-only(仅主机模式):宿主机与客户机单独组网(用的是网络连接中的VMnet1,所以宿主机的vm1要开启) 好处:和真实网络隔离 坏处:虚拟机与其他服务器之间不能通信 可以设置虚拟机成静态ip,这样ip就永远不会变了,网关要用vm1的ip地址:vm1的ip也是静态的不会变:我做编程虚拟机不上网用这个很实用,ip永远不会变,连虚拟机方便,我通常是将不常用的大软件安装到虚拟机,外部通过ip访问,如oracle.mss

Neutron总结-OpenStack中的网络隔离 ----转载

前言 最近,关于xx公有云的用户网络,由于隔离问题引发安全讨论,大家顿时对啥"经典网络"."VPC"等概念兴趣大增,大家的热议中多次提到AWS的VPC,亚马逊的AWS怎么搞的,我们不得而知,但是我们可以聊聊OpenStack的,毕竟它一直在模仿AWS嘛. "隔离"啥 首先,我们先搞清楚,所谓"隔离",到底是在"隔"什么. 我们知道,计算机网络,是分层实现的,不同协议工作在不同层,这些层的设计.制定都有国际标

kubernetes(k8s)-介绍2

kubernetes(k8s)-安装(二) 什么是Kubernetes Kubernetes是一个开源平台,用于跨主机群集自动部署,扩展和操作应用程序容器,提供以容器为中心的基础架构. 使用Kubernetes,您可以快速高效地响应客户需求: 快速,可预测地部署应用程序. 在运行中扩展应用程序. 无缝推出新功能. 仅使用您需要的资源来优化硬件的使用. 我们的目标是建立一个组件和工具的生态系统,以减轻在公共云和私有云中运行应用程序的负担. Kubernetes是: Kubernetes是Googl

Kubernetes(K8S)集群在centos7.4下创建

自己在搭Kubernetes(K8S)集群下遇到的坑写一点随笔. 本次采用192.168.60.21,192.168.60.22,192.168.60.23作为需要装的服务器. master需要安装etcd, flannel,docker, kubernetes   192.168.60.21 yum –y install etcd yum –y install flannel yum –y install docker yum –y install kubernetes 分支上安装flanne