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

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 极致的稳定性和高可用,揭秘 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 云原生网关(下)

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
负载均衡 网络安全
|
6月前
|
负载均衡
Pgpool-II实现高可用+读写分离+负载均衡(七)---- recovery_1st_stage分析
recovery_1st_stage是Pgpool online recovery的第一阶段,位于PG_DATA目录下,主要功能就是使用pg_basebackup恢复(recovery)从节点。
204 0
|
4月前
|
负载均衡 算法 应用服务中间件
这些负载均衡都解决哪些问题?服务、网关、NGINX?
这些负载均衡都解决哪些问题?服务、网关、NGINX?
107 1
|
1月前
|
容器
在容器服务ACK中,如果你想更改ALB Ingress的域名和端口
【2月更文挑战第15天】在容器服务ACK中,如果你想更改ALB Ingress的域名和端口
15 3
|
2月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
164 0
|
3月前
|
Cloud Native 安全 应用服务中间件
云原生网关哪家强:Sealos 网关血泪史
云原生网关哪家强:Sealos 网关血泪史
|
3月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
4月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习-CKA真题-七层负载均衡Ingress
k8s学习-CKA真题-七层负载均衡Ingress
51 0
|
4月前
|
tengine Kubernetes Cloud Native
Tengine-Ingress 高性能高可用的云原生网关
Tengine-Ingress 高性能高可用的云原生网关
|
5月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
185 1