在过去半年中,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 云原生网关(下)