【容器云架构】Kubernetes网络解决方案的比较

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 【容器云架构】Kubernetes网络解决方案的比较

Kubernetes要求集群中的每个容器都具有唯一的可路由的IP。Kubernetes本身不分配IP,将任务交给第三方解决方案。


在这项研究中,我们的目标是找到具有最低延迟,最高吞吐量和最低安装成本的解决方案。由于我们的负载对延迟敏感,因此我们的目的是在相对高的网络利用率下测量高百分比的延迟。我们特别关注性能低于最大负载的30-50%,因为我们认为这最好代表了非超载系统的最常见用例。


竞争对手


Docker与--net =主机

这是我们的参考设置。所有其他的竞争对手都与这种设置进行比


-net = host选项意味着容器继承其主机的IP,即不涉及网络容器化。


先验,没有网络集装箱比任何网络容器化表现更好; 这就是为什么我们使用这个设置作为参考。


Flannel


Flannel是由CoreOS项目维护的虚拟网络解决方案。这是一个经过充分测试,生产就绪的解决方案,所以它的安装成本最低。


当您将一台带Flannel的机器添加到集群时,Flannel做三件事情:


使用etcd为新机器分配一个子网


在机器上创建虚拟桥接器(称为docker0桥)


设置数据包转发后端:


AWS-VPC


在Amazon AWS实例表中注册计算机子网。此表中的记录数限制为50,即如果使用aws-vpc Flannel,则集群中的计算机数不能超过50台。而且,这个后端只适用于Amazon的AWS。


主机-GW


通过远程计算机IP创建到子网的IP路由。运行Flannel的主机之间需要直接的二层连接。


VXLAN

创建一个虚拟的VXLAN接口。

由于flannel使用网桥接口来转发数据包,因此每个数据包在从一个容器移动到另一个容器时会通过两个网络堆栈。


IPvlan

在Linux内核中,IPvlan是驱动程序,使您可以创建具有唯一IP的虚拟接口,而无需使用网桥接口。

要将IP分配给具有IPvlan的容器,您必须:

  • 创建一个没有网络接口的容器
  • 在默认网络命名空间中创建一个ipvlan接口
  • 将接口移动到容器的网络名称空间

IPvLAN是一个相对较新的解决方案,所以没有现成的工具来自动化这个过程。这使得用许多机器和容器来部署IPvlan很困难,即安装成本高。


但是,IPvLAN不需要网桥接口,直接将数据包从网卡转发到虚拟接口,所以我们期望它的性能比Flannel更好。


负载测试方案

对于每个竞争对手,我们运行这些步骤:


在两台物理机上建立网络

在一台机器上的一个容器中运行tcpkali,让我们以恒定的速率发送请求

在另一台机器的容器中运行Nginx,让它用固定大小的文件进行响应

捕获系统度量和tcpkali结果

我们以每秒50,000到450,000个请求(RPS)的请求速率运行基准测试。


在每个请求中,Nginx都以一个固定大小的静态文件进行响应:350B(100B内容,250B头)或4KB。

结果

IPvlan显示最低延迟和最高吞吐量。带有host-gw和aws-vpc的法兰绒紧随其后,但是host-gw在最大负荷下显示效果更好。

与vxlan法兰绒显示在所有测试中最差的结果。但是,我们怀疑其99.999%的分数是由于一个错误。

4 KB响应的结果与350 B响应的结果类似,有两个显着的差异:

最大RPS点要低得多,因为4 KB响应只需要约270k RPS即可完全加载10 Gbps NIC

在接近吞吐量限制的情况下,IPvlan更接近--net = host

我们目前的选择是与主机gw法兰绒。它没有太多的依赖关系(例如,不需要AWS或新的Linux版本),与IPvlan相比很容易设置,并且具有足够的性能特征。IPvlan是我们的备份解决方案。如果在某些时候flannel增加了对IPvLAN的支持,我们将切换到它。


尽管aws-vpc比host-gw表现得稍微好一些,但它的50台机器限制和它连接亚马逊AWS的事实对我们来说是一个破坏者。

50,000 RPS, 350 B

每秒5万个请求,所有候选人表现出可接受的性能。您已经可以看到主要趋势:IPVlan表现最好,host-gw和aws-vpc紧随其后,vxlan是最差的。

150,000 RPS, 350 B

IPvLAN稍好于host-gw和aws-vpc,但是它具有最差的99.99个百分点。host-gw比aws-vpc执行略好。


250,000 RPS, 350 B

这种负荷预计在生产中也是常见的,所以这些结果是特别重要的。


IPvLAN再次显示最佳性能,但aws-vpc具有最好的99.99和99.999百分点。host-gw在95和99百分位上胜过aws-vpc。

350,000 RPS, 350 B¶


在大多数情况下,潜伏期接近250,000 RPS,350 B的情况,但在99.5百分位之后迅速增长,这意味着我们已经接近最大RPS。

450,000 RPS, 350 B

This is the maximum RPS that produced sensible results.

IPvlan leads again with latency ≈30% worse than that of --net-host:

Interestingly, host-gw performs much better than aws-vpc:


500,000 RPS, 350 B

Under 500,000 RPS, only IPvlan still works and even outperforms --net=host, but the latency is so high that we think it would be of no use to latency-sensitive applications.

50k RPS, 4 KB

Bigger response results in higher network usage, but the leaderboard looks pretty much the same as with the smaller response:

Latency percentiles at 50k RPS (≈20% of maximum RPS), ms

Setup 95 %ile 99 %ile 99.5 %ile 99.99 %ile 99.999 %ile Max Latency
IPvlan 0.6 0.8 0.9 5.7 9.6 15.8
aws-vpc 0.7 0.9 1 5.6 9.8 403.1
host-gw 0.7 0.9 1 7.4 12 202.5
vxlan 0.8 1.1 1.2 5.7 201.5 402.5
--net=host 0.5 0.7 0.7 6.4 9.9 14.8

150k RPS, 4 KB

Host-gw has a surprisingly poor 99.999 percentile, but it still shows good results for lower percentiles.

Latency percentiles at 150k RPS (≈60% of maximum RPS), ms

Setup 95 %ile 99 %ile 99.5 %ile 99.99 %ile 99.999 %ile Max Latency
IPvlan 1 1.3 1.5 5.3 201.3 405.7
aws-vpc 1.2 1.5 1.7 6 11.1 405.1
host-gw 1.2 1.5 1.7 7 211 405.3
vxlan 1.4 1.7 1.9 6 202.51 406
--net=host 0.9 1.2 1.3 4.2 9.5 404.7

250k RPS, 4 KB

This is the maximum RPS with big response. aws-vpc performs much better than host-gw, unlike the small response case.

Vxlan was excluded from the graph once again.


测试环境

Background

To understand this article and reproduce our test environment, you should be familiar with the basics of high performance.

These articles provide useful insights on the topic:

  • How to receive a million packets per second by CloudFlare
  • How to achieve low latency with 10Gbps Ethernet by CloudFlare
  • Scaling in the Linux Networking Stack from the Linux kernel documentation

Machines

  • We use two c4.8xlarge instances by Amazon AWS EC2 with CentOS 7.
  • Both machines have enhanced networking enabled.
  • Each machine is NUMA with 2 processors; each processor has 9 cores, each core has 2 hyperthreads, which effectively allows to run 36 threads on each machine.
  • Each machine has a 10Gbps network interface card (NIC) and 60 GB memory.
  • To support enhanced networking and IPvlan, we’ve installed Linux kernel 4.3.0 with Intel’s ixgbevf driver.

Setup

Modern NICs offer Receive Side Scaling (RSS) via multiple interrupt request (IRQ) lines. EC2 provides only two interrupt lines in a virtualized environment, so we tested several RSS and Receive Packet Steering (RPS) Receive Packet Steering (RPS) configurations and ended up with following configuration, partly suggested by the Linux kernel documentation:

  • IRQ
  • The first core on each of the two NUMA nodes is configured to receive interrupts from NIC.
    To match a CPU to a NUMA node, use lscpu:

$ lscpu | grep NUMA

NUMA node(s):          2

NUMA node0 CPU(s):     0-8,18-26

NUMA node1 CPU(s):     9-17,27-35

  • This is done by writing 0 and 9 to /proc/irq/<num>/smp_affinity_list, where IRQ numbers are obtained with grep eth0 /proc/interrupts:

$ echo0 > /proc/irq/265/smp_affinity_list

$ echo9 > /proc/irq/266/smp_affinity_list

  • RPS
  • Several combinations for RPS have been tested. To improve latency, we offloaded the IRQ handling processors by using only CPUs 1–8 and 10–17. Unlike IRQ’s smp_affinity, the rps_cpus sysfs file entry doesn’t have a _list counterpart, so we use bitmasks to list the CPUs to which RPS can forward traffic1:

$ echo"00000000,0003fdfe" > /sys/class/net/eth0/queues/rx-0/rps_cpus

$ echo"00000000,0003fdfe" > /sys/class/net/eth0/queues/rx-1/rps_cpus

  • Transmit Packet Steering (XPS)
  • All NUMA 0 processors (including HyperThreading, i.e. CPUs 0-8, 18-26) were set to tx-0 and NUMA 1 (CPUs 9-17, 27-37) to tx-12:

$ echo"00000000,07fc01ff" > /sys/class/net/eth0/queues/tx-0/xps_cpus

$ echo"0000000f,f803fe00" > /sys/class/net/eth0/queues/tx-1/xps_cpus

  • Receive Flow Steering (RFS)
  • We’re planning to use 60k permanent connections, official documentation suggests to round up it to the nearest power of two:

$ echo65536 > /proc/sys/net/core/rps_sock_flow_entries

$ echo32768 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt

$ echo32768 > /sys/class/net/eth0/queues/rx-1/rps_flow_cnt

  • Nginx
  • Nginx uses 18 workers, each worker has it’s own CPU (0-17). This is set by the worker_cpu_affinity option:

workers18;worker_cpu_affinity110100100010000...;

  • Tcpkali
  • Tcpkali doesn’t have built-in CPU affinity support. In order to make use of RFS, we run tcpkali in a taskset and tune the scheduler to make thread migrations happen rarely:

$ echo10000000 > /proc/sys/kernel/sched_migration_cost_ns

$ taskset -ac 0-17 tcpkali --threads 18 ...

This setup allows us to spread interrupt load across the CPU cores more uniformly and achieve better throughput with the same latency compared to the other setups we have tried.

Cores 0 and 9 deal exclusively with NIC interrupts and don’t serve packets, but they still are the most busy ones:


RedHat’s tuned was also used with the network-latency profile on.

To minimize the influence of nf_conntrack, NOTRACK rules were added.

Sysctls was tuned to support large number of tcp connections:

fs.file-max=1024000net.ipv4.ip_local_port_range="2000 65535"net.ipv4.tcp_max_tw_buckets=2000000net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_tw_recycle=1net.ipv4.tcp_fin_timeout=10net.ipv4.tcp_slow_start_after_idle=0net.ipv4.tcp_low_latency=1

Footnotes

[1] Linux kernel documentation: RPS Configuration
[2] Linux kernel documentation: XPS Configuration


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
21天前
|
运维 监控 Cloud Native
自动化运维的魔法书云原生之旅:从容器化到微服务架构的演变
【8月更文挑战第29天】本文将带你领略自动化运维的魅力,从脚本编写到工具应用,我们将一起探索如何通过技术提升效率和稳定性。你将学会如何让服务器自主完成更新、监控和故障修复,仿佛拥有了一本能够自动翻页的魔法书。
|
21天前
|
监控 安全 网络安全
云计算与网络安全:技术、挑战与解决方案
【8月更文挑战第30天】随着云计算技术的飞速发展,越来越多的企业和个人开始将数据和应用迁移到云端。然而,云计算的普及也带来了一系列网络安全问题。本文将探讨云计算中的网络安全挑战,包括数据泄露、恶意软件攻击和服务中断等,并介绍一些常见的网络安全技术和最佳实践,如加密、访问控制和安全监控等。最后,我们将讨论如何制定有效的网络安全策略,以保护云服务免受威胁。
|
22天前
|
Kubernetes 负载均衡 网络安全
Kubernetes 网络模型与实践
【8月更文第29天】Kubernetes(K8s)是当今容器编排领域的佼佼者,它提供了一种高效的方式来管理容器化应用的部署、扩展和运行。Kubernetes 的网络模型是其成功的关键因素之一,它支持服务发现、负载均衡和集群内外通信等功能。本文将深入探讨 Kubernetes 的网络模型,并通过实际代码示例来展示服务发现和服务网格的基本概念及其实现。
37 1
|
22天前
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
48 0
|
1天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
17天前
|
Kubernetes 容器 Perl
Kubernetes网络插件体系及flannel基础
文章主要介绍了Kubernetes网络插件体系,特别是flannel网络模型的工作原理、配置和测试方法。
40 3
Kubernetes网络插件体系及flannel基础
|
17天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
51 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
7天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
18 3
|
7天前
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
11天前
|
Linux 调度 Docker
容器网络概述
【9月更文挑战第9天】容器技术利用如命名空间(namespace)和控制组(cgroup)等技术创建隔离环境,实现资源限制与独立运行。命名空间避免命名冲突,cgroup则能对CPU、内存等资源进行限制。容器状态可通过镜像保存并标准化,确保在任何环境中都能复现相同状态。

热门文章

最新文章