极致的稳定性和高可用,揭秘 ALB Ingress 云原生网关(上)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
转发路由器TR,750小时连接 100GB跨地域
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 极致的稳定性和高可用,揭秘 ALB Ingress 云原生网关(上)

在过去半年中,ALB Ingress Controller 立足稳定、安全和用户体验,推出了一系列高级产品特性,通过打造全方位的容灾部署、组件稳定性和安全能力,在更好地满足用户需求的同时,持续为用户业务保驾护航:


  • 在容灾部署方面,通过多个版本迭代以及和多种云网络产品深度集成,提供了全方位的容灾部署方案;
  • 在组件稳定性保障方面,通过支持升级预检、资源哈希等功能,追求极致的 Controller 组件稳定性;
  • 在安全能力方面,通过完善证书和 ACL 的配置方式、支持双向认证,为用户构建更加安全可靠的网络环境;
  • 在产品功能和用户体验方面,在进一步丰富 ALB Ingress 功能矩阵的同时,提供了更加精准有效的问题排查方式;



容灾部署


在现代化的互联网应用系统中,多集群、多服务、跨地域容灾,及云上与本地 IDC  同步容灾等容灾部署措施是保障系统高可用性和稳定性的重要手段。如果没有考虑到这些容灾场景,会为系统引入风险,一旦发生故障会导致大规模的服务中断,进而影响用户使用体验,给企业带来不可挽回的损失。




新版本 ALB Ingress Controller 在容灾部署领域重点发力,通过支持直接调和 Service 到后端服务器组,实现多集群容灾;通过自定义 action 支持多服务器组特性,可以在 ALB 实例上挂载多个 Service,实现多服务容灾,同时通过挂载服务器组时指定服务器组 ID 并与其他网络组件组合配置,实现在 ALB 实例上混挂 POD/ECS、挂载跨地域节点及本地 IDC 节点,提供丰富的转发模式和容灾方案。详细的多种挂载模式实践案例,可以参考文档:https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/use-alb-ingresses-to-configure-hybrid-backend-server-groups?spm=a2c4g.11186623.0.0.a521407ei5L7x4


多集群容灾


多集群容灾主要针对整个集群发生故障场景。当单个集群发生故障,导致集群部分业务中断时,如果采取多集群容灾措施,可以由多个集群同时提供服务,减少单集群故障对用户业务影响。


Controller 调谐时通常只能为当前 ACK 集群 service 创建对应的服务器组并将请求转发至该服务器组,而不能调谐其他集群 service。新版本 ALB Ingress Controller 对于控制台创建的 ALB 实例,支持使用 server-group-id 注解项将后端服务器组与 service 通过服务器组 ID 关联,通过转发规则关联多后端服务器组进行多集群转发。




如上述场景,集群 B 中的 ALB Ingress Controller 调谐 service 时,会将 service 与特定服务器组关联。ALB 上的请求不仅会转发至集群 A Service 对应服务器组 1 上,还可以通过 ALB 控制台配置转发规则将请求转发至集群 B service 关联的后端服务器组 2 上,实现多集群容灾。要完成这样的功能,需要在调谐 service 资源时配置如下的 yaml 文件:


apiVersion: v1kind: Servicemetadata:
annotations:
alb.ingress.kubernetes.io/server-group-id: sgp-xxxname: cloud-nodeport-graynamespace: defaultspec:
ports:
-nodePort: 30018port: 80protocol: TCPtargetPort: 8080selector:
app: openrestytype: NodePort


多服务容灾


多服务容灾面向系统单个服务出现问题场景。当业务只部署在单个 Service 时,很可能因为服务器意外宕机导致平台停止服务,为企业带来损失。新版本 ALB Ingress Controller 多服务器组转发功能支持通过配置 serviceName + ServicePort 创建/挂载多个后端服务器组,将流量转发至多个 service 服务上,并为每个服务器组分配权重。不仅实现了多服务容灾,也提供了 canary 以外一种更加灵活的灰度发布方式。




如上场景,对于 Listener2 监听的同一条转发规则 rule1,需要将 80% 流量转发至服务器组 1,将 20% 流量转发至服务器组 2,从而按权重转发流量,实现新旧版本服务平滑迁移及多服务容灾。ALB Ingress 多服务器组支持多服务转发一个较为完整的配置如下:


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: tea-ingressannotations:
alb.ingress.kubernetes.io/actions.forward: |       [{
"type": "ForwardGroup",
"ForwardConfig": {
"ServerGroups" : [{
"ServiceName": "tea-svc",
"Weight": 80,
"ServicePort": 80             },
             {
"ServiceName": "coffee-svc",
"Weight": 20,
"ServicePort": 80             }]
           }           
       }]
spec:
ingressClassName: albrules:
-host: demo.domain.ingress.tophttp:
paths:
-path: /pathType: Prefixbackend:
service:
name: forwardport:
name: use-annotation


需要注意的是,多服务器组转发作为一种终结型的自定义转发动作,需要设置 rule 字段 servicePort 名称为 use-annotation 字段,且在同一条转发规则中多服务器组转发不能与重定向/固定响应等终结型的转发动作同时使用。


 混合挂载


ALB Ingress 不仅需要将请求转发至 service 对应的 POD 节点上,有时还需要将请求转发至集群外 ECS 实例上,对流量进行测试验证,并作为迁移云原生场景的一种过渡方案。



如上图案例,对于 Listener2 监听的同一条转发规则 rule1,需要将部分流量转发至 service 对应的后端服务器组上,将剩余流量转发至 ECS 节点。Controller 通过多服务器组转发动作能够实现该功能,具体配置步骤如下:


用户通过 ALB 控制台或 OpenAPI 创建服务器组后,将当前 VPC 网络中的 ECS 实例挂载在服务器组中,获取服务器组 ID 并在多服务器组转发动作上指定,ALB Ingress 网关可以将请求同时转发至集群内 service 对应服务器组中的 Pod,和集群外服务器组中的 ECS 节点,实现 POD/ECS 混挂。值得注意的是 ECS 实例中需要提前部署 Web 服务。


跨地域挂载

多集群/多节点容灾可以避免某地域内的系统故障导致的服务中断,但当整个地域网络中断时,仍然无法避免对业务的影响。例如,美国加州的一家电力供应商将所有服务器都部署在单一地域,在 2020 年因为热浪和风暴造成该地域数据中心全部发生故障时,由于其他地域缺少备用数据中心,造成服务不可用,影响了超过 200 万用户。如果该公司采取了跨地域容灾部署方案,就可以将业务切换到其他地域备用数据中心,避免业务中断。



新版本 ALB Ingress Controller 通过多服务器组转发功能,能够将 ALB 与 CEN 等产品组合配置,将访问请求转发至跨 VPC 的 ECS 实例上,从而保证单 VPC 流量不通/后端节点挂掉后可以将请求转发至跨地域备用 VPC 上的后端节点。


以上图场景为例,用户集群在阿里云西南 1(成都)地域 VPC1 专有网络中,通过 Albconfig 在该专有网络中创建了 ALB 实例。用户可以通过 ALB 控制台/OpenAPI 在当前 VPC1 创建服务器组,在两个 VPC 中创建转发路由器实例及跨地域连接;为 VPC1 添加系统路由条目指向转发路由器,并为 VPC1 关联的转发路由器和 VPC2 的系统路由表分别添加 ALB 的回源路由。在 Ingress 多服务器组转发动作中指定服务器组 ID 后,可以在转发动作中挂载指定服务器组,将访问请求同时转发至当前 VPC 内的 Pod 和跨地域(华东 1(杭州))线下 VPC2 内的 ECS 实例上,实现跨地域容灾。详细的跨地域挂载实践可以参考文档:https://help.aliyun.com/document_detail/383456.html#section-8py-sw5-h54


挂载本地 IDC

对于拥有本地 IDC 的用户,请求需要同时访问云上资源和云下本地 IDC。当云上系统出现故障或性能问题时,能够将服务切换到本地 IDC 上的备用数据库继续提供服务,并在故障导致数据丢失时通过本地 IDC 上的备份数据进行快速恢复。当前 ALB 支持与 CEN/VBR/物理专线等网络产品组合配置,并通过 ALB Ingress 多服务器组转发动作挂载本地 IDC 节点。



以上图场景为例,用户集群在阿里云西南 1(成都)地域 VPC1 专有网络中,通过albconfig 在该专有网络中创建 ALB 实例后,将请求通过 CEN 转发路由器- VBR-物理专线转发至该地域线下 IDC 服务器中。用户通过控制台或 OpenAPI 创建服务器组并在 ALB Ingress 多服务器组转发动作上挂载,在云企业网管理控制台创建转发路由器实例及 VPC 连接/VBR 连接后,可以将 ALB 实例所在 VPC1 和 VBR 连接至转发路由器;本地 IDC 通过 VBR 接入阿里云网络,从而实现云上云下容灾部署。详细的挂载本地 IDC 节点实践可以参考文档:https://help.aliyun.com/document_detail/391173.html


对于混合挂载/跨VPC挂载/挂载本地 IDC 容灾场景,ALB Ingress 都通过alb.ingress.kubernetes.io/actions.<服务名称> 注解配置转发动作,并挂载已创建好的指定服务器组实现。多服务器组转发动作属于终结型动作,需要设置对应的service.port.name 为 use-annotation。实际配置可以参考下面的配置文件:


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: tea-ingressannotations:
alb.ingress.kubernetes.io/actions.forward: |       [{
"type": "ForwardGroup",
"ForwardConfig": {
"ServerGroups" : [{
"ServiceName": "tea-svc",
"Weight": 30,
"ServicePort": 80             },
             {
"ServiceName": "coffee-svc",
"Weight": 20,
"ServicePort": 80             },
             {
"ServerGroupID": "sgp-71aexb9y93ypo*****",
"Weight": 30             },
             {
"ServerGroupID": "sgp-slygpbvm2cydo*****",
"Weight": 20             }]
           }
       }]
spec:
ingressClassName: albrules:
-host: demo.domain.ingress.tophttp:
paths:
-path: /pathpathType: Prefixbackend:
service:
name: forwardport:
name: use-annotation


组件稳定性


ALB Ingress Controller 组件通过调谐为用户更新 ALB 配置,Controller 组件稳定性对于保障 ALB 正确下配,护航客户业务持续稳定运行至关重要。新版本 ALB Ingress Controller 在版本升级/非预期变更场景重点发力,分别通过升级预检、资源哈希功能保证组件稳定性。



升级预检

ALB Ingress Controller 演进过程中存在多种版本,ACK 控制台支持用户对 Controller 版本进行自助升级。同时,为减少低版本 Controller 存在的问题,推广 Controller 新特性,后台会定期对组件版本进行升级及全网拉齐。容器用户配置ALB 标准方式为在 ACK 集群通过 Controller 调谐配置,但是也存在部分用户非标使用了 ALB 控制台/Open API 方式进行配置的情况。当用户通过 ALB 控制台这一非标方式配置 ALB 后,AlbConfig/Ingress 与 ALB 控制台上配置不一致,版本升级引起的 Controller Pod 重启会触发调谐事件,覆盖 ALB 控制台上不一致的配置,可能造成用户流损。



ALB Ingress 新推出的 Dryrun 预检功能通过接入容器智能运维平台(CIS),支持通过旁路形式对 ACK 集群的 Albconfig/Ingress 资源进行预检,在升级 Controller 版本前及时发现与 ALB 控制台不一致的配置,减少升级版本可能触发的配置覆盖问题。组件接入预检后每次版本升级前会按照 Dryrun 模式自动执行组件检查,不需要用户手动触发。预检通过后会自动进入组件升级流程;预检失败后会阻塞升级流程,并提示配置不一致的实例 ID 及预检失败原因。详细的预检失败原因及恢复方法,可以参考文档:https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/alb-ingress-controller-component-upgrade-pre-check-failed?spm=a2c4g.11186623.0.0.28e848a8rX5inf


同时,容器智能运维平台(CIS)支持直接对组件进行预检检查,并查看之前组件预检结果。用户在容器控制台选择集群检查,即可进入 CIS 页面。



在 CIS 界面点击组件检查并选择 ALBIngressController,即可对当前集群  Albconfig/Ingress 资源进行 Dryrun 预检,并查看检查结果



资源哈希

升级预检功能只能在自助升级/版本推平时进行校验并阻塞版本升级触发的调谐动作,对于 Controller Pod 重启、Controller Pod 与 Kube-apiserver  组件建连失败、选主切换等预期外原因触发的调谐无法规避。当 Albconfig/Ingress 与 ALB 控制台配置不一致时,会产生客户预期外的变更,覆盖 ALB 控制台配置。


新版本 ALB Ingress Controller 支持资源哈希功能,调谐成功时会为用户 ACK 集群中的 Albconfig / Ingress 资源添加 hash label。Pod 重启,选主切换等造成 ALB Ingress Controller 预期外场景会检测相关资源 Hash label,并在调谐时跳过已添加 hash label 的资源,避免预期外变更。下图分别为 albconfig/ingress 调谐时添加 Hash label 流程及添加 Hash label 后示意图。


Albconfig 添加 hash label





Ingress 添加 hash label




更多精彩内容,欢迎观看:

极致的稳定性和高可用,揭秘 ALB Ingress 云原生网关(下)

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
存储 弹性计算 缓存
云存储网关-高可用文件网关基本介绍
本文介绍云存储网关新推出的高可用文件网关使用方法及其架构原理。通过选择“高可用”选项,用户可在不同可用区部署网关,避免单点故障。文章详细描述了创建网关、配置虚拟挂载IP及缓存盘、创建共享等步骤,并解释了高可用架构如何通过数据复制和故障切换确保服务连续性和低延迟访问。
51 4
|
6月前
|
Kubernetes 负载均衡 应用服务中间件
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
995 1
|
3月前
|
负载均衡 应用服务中间件 nginx
搭建域名访问环境二(负载均衡到网关)
这篇文章讲述了如何配置Nginx实现域名访问环境,通过负载均衡将请求从Nginx反向代理到服务网关,并提供了详细的配置步骤和测试验证方法。
搭建域名访问环境二(负载均衡到网关)
|
2月前
|
存储 对象存储
radosgw高可用对象存储网关实战指南
关于radosgw高可用对象存储网关的实战指南,涵盖了从基本概念到具体操作案例,再到架构设计和使用技巧的全面介绍。
59 6
|
3月前
|
Java 应用服务中间件 测试技术
阿里云云效产品使用合集之云效流水线如何使用alb ingress的脚本
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
负载均衡 NoSQL 应用服务中间件
搭建高可用及负载均衡的Redis
【7月更文挑战第10天】
128 1
|
4月前
|
负载均衡 安全 Cloud Native
云上负载均衡:构建高可用、高性能的网络应用架构
与云原生技术深度融合:随着云原生技术的普及和发展未来的云上负载均衡将更加紧密地与云原生技术相结合。例如与Kubernetes等容器编排平台集成实现自动化的服务发现和路由管理;与Serverless架构结合提供无缝的流量接入和请求处理能力。 安全性能提升:面对日益严峻的网络安全威胁云上负载均衡将更加注重安全性能的提升。通过引入加密传输、访问控制、DDoS防护等安全措施确保网络流量的安全性和隐私性;同时还将建立完善的安全监控和应急响应机制以应对各种安全事件和突发事件。 支持多协议和多场景:未来的云上负载均衡将支持更多种类的网络协议和应用场景以满足不同用户和业务的需求。例如支持HTTP/2、
219 0
|
4月前
|
负载均衡 算法 Java
实现高可用和可扩展的负载均衡系统的Java方法
实现高可用和可扩展的负载均衡系统的Java方法
|
5月前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用
|
6月前
|
运维 负载均衡 Cloud Native
Serverless 应用引擎产品使用之在Serverless 应用引擎中,使用云原生网关的情况下,SLB(负载均衡器)和证书配置如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。