云开·全站体育app登录 Tengine-Ingress 高性能高可用的云原生网关

发布于:25-01-21 播放次数:

tengine 动态缓存处理_动态缓存技术_缓存是静态还是动态

介绍

统一接入作为阿里巴巴集团七层应用流量的入口网关。其技术基础 Tengine 充当高性能 HTTP 和反向代理 Web 服务器。每日承载千万级QPS流量,保障双11等各类重大促销活动。对外提供不间断的HTTP(S)访问服务。

尽管Tengine以高性能和高可用性而闻名,但统一接入的一些局限性也受到了诟病。最典型的是新的应用域名和更新不能动态生效;新证书和签名域名无法动态生效;用户侧HTTP(S)流量可配置性和可观测性较弱; HTTP(S)路由能力较弱;不支持应用域名灰度变化;接入层集群变化影响太大kaiyun.ccm,其他问题也一直困扰着我们。

随着云原生Ingress网关规范事实上的标准化以及ASI Group的大规模落地,新的统一接入应用AServer-Ingress实现了基于云原生Ingress标准的统一接入层的架构升级。其技术基础Tengine-Ingress在kubernetes/ingress-nginx上进行了深度优化,并集成了Tengine-Proxy,不断提升其性能和可用性,彻底根除上述痛点和问题,并已反馈给开源社区,持续保持Tengine在行业中的领先地位。

天擎官方网站:

Tengine-Ingress开源仓库:

Tengine开源仓库:

期限

AServer-Ingress:基于K8s云原生Ingress标准,是实现阿里巴巴统一接入层架构升级的新应用。旗下拥有淘宝、天猫、高德、阿里妈妈、国际化、菜鸟、UC、钉钉、考拉等BU。提供稳定的七层应用流量入口网关。

Tengine-Ingress:应用AServer-Ingress的技术基础,在深度优化kubernetes/ingress-nginx的基础上集成Tengine-Proxy。

K8s:Kubernetes简称K8s。 K8s 是一个用于自动部署、扩展和管理容器化应用程序的分布式系统。

ASI:阿里云Serverless基础设施的缩写,是云原生应用的统一基础设施,提供全托管和半托管的K8s集群运维服务。

ingress:K8s集群向外界提供HTTP(S)七层负载均衡、TLS卸载、路由转发等系统原生资源,用于访问集群内部服务。

注释:注释。 Ingress 使用注释来扩展与第 7 层负载均衡、TLS 卸载和路由转发相关的配置信息。

etcd:持久化、轻量级、分布式键值数据存储组件,用于存储 K8s 集群中的配置数据。

API服务器:API服务器是K8s集群的关键组件,通过K8s API和JSON over HTTP提供K8s内部和外部接口。 API 服务器处理和验证 REST 请求并更新 etcd 中 API 对象的状态,从而允许客户端在工作节点之间配置工作负载和容器。

CRD:CustomResourceDefinition 的缩写,用于定义 API 服务器上可公开访问的用户定义资源。

MD5:Message-Digest Algorithm 的缩写,一种广泛使用的加密哈希函数,可以产生 128 位(16 字节)的哈希值,以保证信息传输的完整一致。

建筑学

AServer-Ingress作为七层应用流量的入口网关。公网HTTPS请求首先路由到四层负载均衡SLB。 SLB将HTTPS报文转发到四层的七层网关AServer-Ingress。AServer-Ingress基于动态入口域名和秘密证书在本地卸载TLS,并根据单元化和路由策略将HTTP请求转发到后端应用程序。

tengine 动态缓存处理_动态缓存技术_缓存是静态还是动态

图1 应用AServer-Ingress系统架构图

Tengine-Ingress是应用AServer-Ingress的技术基础,由Tengine-Ingress控制器和Tengine-Proxy两部分组成。 Tengine-Ingress控制器是基于Tengine-Proxy的入口控制器。它基于与云原生入口标准规范的兼容性扩展了服务器、后端、TLS、位置和金丝雀。 Tengine-Ingress控制器订阅并处理入口域名资源和密证书资源,并根据tengine入口模板将其转换为动态配置并写入共享内存。 Tengine-Proxy 订阅共享内存更改并将其写入内部运行时共享内存,将最终用户外部流量路由到 K8s 集群中的应用程序服务。

缓存是静态还是动态_tengine 动态缓存处理_动态缓存技术

图2 Tengine-Ingress网关架构图

Tengine-Ingress在Tengine的基础上增加了许多新的特性和功能。最显着的变化是配置动态无损生效。无论是添加应用域名和路由变更,还是添加证书和签名域名,都不需要tengine重新加载和配置。无损实时效果,长连接不变,成功率不受影响,应用变更效率成倍提升,集群稳定性进一步增强。支持域名和单证书批量、级别独立生效。用户可以根据需要中断并继续更改。应用侧风险可控,变更影响较小。 TLS加密和解密允许同时加载ECC、RSA和国家加密证书。应用域名灰度方面,支持基于请求头、头值、头值正则匹配、cookie、权重进行流量切分,满足应用在灰度发布、蓝绿部署、A/B测试等不同场景的需求。可观测性方面,支持通过域名对应用程序进行独立监控。用户可以实时查看单个域名的QPS、成功率、RT、包大小等相关监控信息。 tengine-Ingress复用了k8s ingress注解(高级配置)规范,基于内部运行时共享内存,通过tengine ingress模板构造HTTP(S)高级功能,支持动态无损实时效果,满足用户的HTTP( S) 根据不同应用场景的要求。 )高级配置需求,例如用户可以配置应用域名是否允许网络爬虫以及应用域名CORS(跨域资源共享)。综上所述,Tengine-Ingress在应用配置更新模型、系统稳定性、TLS加解密、灰度路由、可观测性、HTTP(S)高级配置等多方面都得到了显着提升。

云原生

Tengine-Ingress完全兼容K8s ingress标准,并在此基础上不断扩展和改进。与原生的 Kubernetes Ingress 和 NGINX Ingress 相比,主要有以下优势和增强:

支持域名、证书访问无损动态实时效果。 Tengine-Ingress控制器实时监控ASI入口存储集群中的入口域名和密证资源对象。当入口域名和密证书配置发生变化时,会验证域名和证书配置。合法性和全局一致性,以及符合ingress标准和X509证书规范的配置信息将完全写入系统共享内存中。 Tengine-Proxy感知系统共享内存变化,策略进程运行时刷新共享内存,双缓存切换,工作进程运行时读取配置动态生效。

tengine 动态缓存处理_动态缓存技术_缓存是静态还是动态

图 3. 配置动态验证模型

Tengine-Ingress 支持使用 ECC 和 RSA 双证书的域名。默认情况下,本机系统只能使用单个证书。 Tengine-Ingress扩展了标准入口规范,兼容单证书场景,满足ECC和RSA双证书同时动态生效的应用。场景,并可继续扩展到ECC、RSA、国密三种证书的复杂场景。

  tls:  - hosts:    - {host1}    secretName: {secret name1}  - hosts:    - {host1}    secretName: {secret name2}

Tengine-Ingress基于云原生ASI,使用标准化的k8s资源ingress和secret分别存储域名路由配置和TLS证书密钥信息。在此基础上,分批次、分层次提出单一入口域名和单一密证。验证机制,既满足用户侧添加、修改应用域名和证书的灰度需求,又保证了接入层集群整体运行的稳定性和可靠性。添加以下入口和秘密注释,逐步识别域名和证书的灰度范围。

1. ingress灰度开关● annotation: nginx.ingress.kubernetes.io/ingress-rollout注释:是否灰度ingress值类型:bool默认值:false
2. ingress当前版本● annotation: nginx.ingress.kubernetes.io/ingress-rollout-current-revision注释:ingress当前运行版本号值类型:string默认值:""
3. ingress升级版本● annotation: nginx.ingress.kubernetes.io/ingress-rollout-update-revision注释:ingress升级版本号值类型:string默认值:""
4. ingress灰度范围● annotation: nginx.ingress.kubernetes.io/ingress-rollout-index-id注释:只有Pod序号小于ingress-rollout-index-id的Pod才会更新ingress。○ 0..N-1为Pod所在的序号,从0开始到N-1。○ For a StatefulSet with N replicas, each Pod in the StatefulSet will be assigned an integer ordinal, from 0 up through N-1, that is unique over the Set.值类型:number默认值:-1

Tengine-Ingress采用全局一致性验证机制来保证内存中运行状态下保存的用户侧入口域名和秘密证书的有效性和正确性。秒级验证10万+域名、1000+泛证书。在域名配置和证书信息不符合标准化的k8s资源入口和秘密规范以及相关RFC标准时,将不再更新本地缓存,并提供实时报警通知,确保运行国家始终可以对外提供七层转发服务。新增CRD IngressCheckSum和SecretCheckSum用于定义全局一致性检查信息。

type IngressCheckSum struct {  metav1.ObjectMeta  Spec IngressCheckSumSpec}
type IngressCheckSumList struct { metav1.TypeMeta metav1.ListMeta Items []IngressCheckSum}
type IngressCheckSumSpec struct { // `Timestamp` is the time when the md5 of all the ingress was calculated. Timestamp metav1.Time // `Checksum` is the md5 of all the ingress. Checksum string // `ids` describes which id will match this ingress. Ids []string}

tengine-Ingress 复用了 k8s Ingress 注解(高级配置)规范,基于内部运行时共享内存,通过 tengine Ingress 模板构造 HTTP(S) 高级功能,支持 Ingress 注解实时动态生效,满足基于HTTP(S)的用户在不同应用场景下的需求。 S) 高级配置要求。

Tengine-Ingress兼容ingress canary注解,支持基于请求头、头值、头值正则匹配、cookie和权重进行流量分段,无需tengine重新加载。所有应用域名的入口金丝雀规则实时动态生效,无损。 。

缓存是静态还是动态_tengine 动态缓存处理_动态缓存技术

图4 基于“头值”和“服务权重”的灰度路由组合

入口标准:

X509证书规格:

入口金丝雀注释:#canary

高可用性

Tengine-Ingress作为七层流量入口网关应用AServer-Ingress的技术基础,对高可用性有着严格的要求。任何变更操作都必须是灰度的、可监控的、可滚动的。但K8s原生的资源对象包括入口域名、密证书、configmap配置、service服务等,写入etcd后,所有监听控制器都会默认处理资源对象的配置更新,即同一命名空间下的所有Pod会同时更新资源对象。加载新的配置对象。如果配置出现错误和脏数据,变更的影响将引发全局风险,导致线上事故。统一接入中,每天大约有数百个应用域名的增删改查。每周都会有数十次证书添加和签名域名更改操作。任何应用程序的域名和证书在接入层的配置变化都是至关重要的。 Tengine-Ingress作为云原生网关,必须通过K8s API处理和验证资源对象。这就需要我们扩展支持入口应用域名和密证书的灰度能力,保证变更操作可以灰度、中断、回滚。

以Ingress应用域名变更为例,根据同一命名空间下Tengine-Ingress Pod的数量,通过新增的Ingress灰度标注来确定每批Ingress资源对象的动态有效Pod范围。配置变更 Pod 范围内的 Tengine-Ingress 监听 Ingress 资源对象的更新事件,验证域名配置的合法性和全局一致性,并将所有符合 Ingress 标准的配置信息写入系统共享内存。在入口域名批量生效的变更过程中,用户可以根据申请域名成功率等监控指标,随时主动终止并回滚本次配置变更,将风险降低到可控范围,保证应用的可靠性。申请域名变更。灰度,可监控、可回滚。

缓存是静态还是动态_tengine 动态缓存处理_动态缓存技术

图5 入口域名和Secret证书配置批量生效模型

Tengine-Ingress采用高可靠方案,将ASI核心集群与ASI入口存储集群隔离,实现运行状态与存储状态分离。独立的ASI ingress集群可以保证自身API服务器和etcd的性能稳定,核心集群的核心组件API即使在服务器和etcd不可用的高风险场景下也能正常提供七层转发服务。基于ASI入口存储集群标准3实例API服务器(16C64G、100G ESSD)和3实例etcd(8C32G、100G ESSD)资源规范,以20000个入口域名资源对象(1KB大小)作为后台数据,更新在 10 QPS 的 ingress 资源对象上,随着 Tengine-Ingress pod 数量的增加,监控 ingress 配置的延迟更新内容也会相应增加。即使在数万级别的超大型集群中,资源监视和列表的延迟也在可控范围内。

tengine 动态缓存处理_动态缓存技术_缓存是静态还是动态

表 1. 入口存储集群性能基准

K8s分布式系统本身可以保证单个入口资源的一致性,但分布式环境无法保证用户在etcd中存储的入口域名配置的全局正确性和全局完整性,并且当API服务器和etcd不可用时,无法保证入口域名配置的可用性。因此,Tengine-Ingress提出了分布式环境下ingress的全局一致性解决方案。在添加和更新域名时,Tengine-Ingress根据ingress全局一致性检查算法计算全局MD5值,与CRD一致。如果ingresschecksums资源对象中的MD5值匹配,则说明更新后的ingress资源对象全局一致。可以将入口资源对象更新到本地缓存并写入共享内存,并可以使用最新的入口域名配置来对外提供服务。 HTTP(S)七层负载平衡、TLS卸载和路由转发功能;否则,说明更新后的入口资源对象全局不一致,系统中存在脏数据。本地缓存和共享内存将不再更新,仍使用现有的入口域名配置对外提供HTTP(S)访问服务。保证域名访问和路由服务运行的正确性和可靠性。

缓存是静态还是动态_tengine 动态缓存处理_动态缓存技术

图6 Ingress域名配置全局一致性验证模型

分布式系统K8s的核心组件是API服务器和etcd。 etcd作为K8s集群中配置数据的存储组件。 API服务器向外界提供标准接口来处理客户端请求并更新etcd中资源对象的状态,从而允许客户端在worker节点之间配置各种流量负载和容器。因此,当API服务器和etcd由于内部或外部原因无法正常提供服务时,客户端必然会出现各种服务异常。对于ingress资源对象,客户端将无法正常通过API server接口获取ingress的更新配置,并且在API server或etcd异常删除等特殊场景下,系统会错误触发ingress删除事件,客户端会清除域名配置。 ,这将导致客户端无法再向外界提供HTTP(S)访问服务。基于分布式环境下的ingress全局一致性解决方案,当Tengine-Ingress的全局MD5值无法正常匹配或匹配失败时,默认的系统数据不再可信可靠,Tengine-Ingress进入自我保护状态状态并不再更新本地缓存。缓存中存储的入口域名配置仍将用于继续向外界提供HTTP(S)访问服务。 Secret证书资源对象采用类似的全局一致性方案。

综上所述,基于分布式环境中ingress和secret的全局一致性方案,Tengine-Ingress保证了用户在etcd和K8s核心组件中存储的ingress域名和secret证书配置的全局正确性和全局完整性分布式系统的特点 当API服务器或etcd不可用时,仍然可以保证入口域名和密证书配置的可用性,并且可以向外界提供不间断的HTTPS访问服务。

动态缓存技术_缓存是静态还是动态_tengine 动态缓存处理

图7 Ingress全局一致性检查流程图

高性能

阿里巴巴集团Web端标准接入网关基于远程Keyless服务获取TLS私钥。新架构AServer-Ingress采用本地TLS加解密。对比新旧架构在HTTPS短链路场景下的性能差异。压测模型采用HTTPS短连接、TLS 1.2协议ECDHE-RSA-AES128-GCM-SHA256算法,后端应用返回22KB响应消息,压测Pod使用32核、96G内存。

动态缓存技术_tengine 动态缓存处理_缓存是静态还是动态

表2 压力环境

表3. 压力测试模型

RT:由于Tengine-Ingress减少了TLS握手过程中与远程Keyless服务的交互过程,因此在HTTPS 1.1短链路场景下,Tengine-Ingress的平均请求响应时间(RT)相比Tengine可以减少约9ms。

缓存是静态还是动态_动态缓存技术_tengine 动态缓存处理

图8. RT性能对比数据

缓存是静态还是动态_tengine 动态缓存处理_动态缓存技术

表 4. TLS 握手延迟细分比较

CPU:Tengine 在 HTTPS 链路建立过程中消耗的 CPU 由远程 Keyless 服务和本地 Tengine-Proxy 组成。 Tengine-Ingress在本地完成所有TLS加解密。对比相同QPS消耗的CPU,换算成CPU消耗比例,Tengine-Ingress消耗了67.3%的CPU,而Tengine消耗了81.9%的CPU。 Tengine-Ingress在HTTPS短链接场景下性能提升约20.7%。

缓存是静态还是动态_tengine 动态缓存处理_动态缓存技术

图 9. CPU 开销比较数据

Mem:由于Tengine在实际运行时会加载大量的应用域名和路由的静态配置信息,因此32个工作进程各需要申请一块内存,整个进程树会占用较多的内存;而Tengine-Ingress采用动态配置,所有32个工作进程共享一个应用域名和路由配置信息,内存占用显着降低,从20.4%降低到8.8%。

tengine 动态缓存处理_动态缓存技术_缓存是静态还是动态

图 10. 内存消耗比较数据

现状与前景

Tengine-Ingress已经覆盖了阿里巴巴集团线上、预发布和日常互联网、VPN办公网、办公网和内网的所有应用场景。 Tengine-Ingress已托管数十万个应用域名,内存消耗降低57%。在HTTPS短链接场景下kaiyun全站网页版登录,性能提升约20.7%,请求RT平均下降36%。作为一款高性能、高可用的云原生网关,Tengine-Ingress已经获得了初步的测试。

确定开源Tengine 3.0的功能特性范围:升级nginx核心稳定版本;支持基于XQUIC的QUIC和HTTP3协议;基于k8s Ingress标准规范,支持域名和证书的无损动态验证、入口域名和秘钥配置的灰度批量验证、入口和秘钥的全局一致性验证、ECC和RSA双证书、分布式环境下的动态服务发现、应用程序域名。灰度发布、蓝绿部署、A/B测试;基于XUDP的用户态高性能UDP转发,支持绕过内核。

展望未来,Tengine将不断进化,朝着通用API网关的方向发展。基于HTTP应用流量入口网关,将逐步支持4/7层TLS、TCP、UDP和GRPC多协议路由能力,以适应不同终端、不同应用。开yun体育app官网网页登录入口,打造全场景通用网关,持续保持Tengine行业领先地位。

天擎官方网站:

Tengine-Ingress开源仓库:

Tengine开源仓库:

XQUIC开源仓库:

XUDP开源存储库:

动态缓存技术_缓存是静态还是动态_tengine 动态缓存处理

动态缓存技术_缓存是静态还是动态_tengine 动态缓存处理