本文介绍Nginx Ingress迁移MSE Ingress的方式以及原理。
什么是MSE Ingress
MSE Ingress是在MSE云原生网关之上提供更为强大的Ingress流量管理方式。MSE Ingress将流量网关、微服务网关和安全网关三合一,兼容K8s Ingress标准API,解决了三层网关架构独立设计和独立运维导致的资源消耗大、性能损耗大、稳定性难控、安全防护复杂等难题。
MSE Ingress优势
相较于传统网关,MSE Ingress在资源成本、性能、安全性和易用性上具有如下优势:
遵循标准:MSE Ingress严格遵循K8s Ingress标准API,支持
networking.k8s.io/v1beta1
和networking.k8s.io/v1
。兼容性强:兼容Nginx Ingress注解90%以上的使用场景,Nginx Ingress配置无需修改即可在MSE Ingress生效。关于MSE Ingress支持的注解汇总信息,请参见MSE Ingress支持的Annotation。
扩展丰富:相较于Nginx Ingress原生注解,MSE提供功能更丰富的扩展注解,例如认证鉴权、Header控制、限流和安全防护等。更多关于MSE Ingress增强的扩展注解,请参见MSE Ingress高级用法。
架构安全:采用数据面和控制面分离部署,实现资源隔离,架构设计更安全。
性能强劲:支持HTTPS硬件加速、QPS性能提升。
迁移Nginx Ingress至MSE Ingress的必要性
Nginx Ingress目前存在的主要问题:
重大安全漏洞:Nginx Ingress在安全领域出现了高危安全漏洞CVE-2021-25745、CVE-2021-25746和CVE-2021-25748。
与Ingress APIVersion和K8s集群版本耦合严重,影响升级K8s集群的进程。ACK Kubernetes 1.24版本中彻底弃用了v1beta1版本的Ingress资源,同时Nginx Ingress Controller在1.0.0及以上版本才支持v1的Ingress资源,导致升级ACK Kubernetes 1.24版本必须提前升级Nginx Ingress Controller。
升级Nginx Ingress Controller的流程复杂且容易出现流量损失。
需要额外部署一套新版本的Nginx Ingress Controller。
需要手动修改模板参数以完成应用版本的升级。
只支持基于DNS方式进行老网关迁移流量到新网关,时效性差,出现问题时无法快速回滚。
将Nginx Ingress网关迁移至MSE Ingress后,可将Ingress网关与Ingress APIVersion、K8s集群版本解耦,解决后续K8s集群升级依赖Nginx Ingress Controller版本的困扰。此外,MSE Ingress提供了迁移场景的产品化工具,可以采用复用SLB的方式做细粒度切流,提高迁移过程中的时效性和稳定性。
迁移方式
MSE Ingress提供了如下两种迁移方式:
复用Nginx Ingress SLB
原理:在MSE Ingress中复用ACK集群中Nginx Ingress Controller的Service创建的SLB,MSE Ingress的节点自动添加到原SLB的已有监听的虚拟服务器组中,最终通过设置流量权重完成流量迁移。
在保留原有流量链路可用的前提下完成MSE Ingress复用已有SLB,以及自动同步原有的Nginx Ingress规则。最后在验证无误后,逐步切流到MSE Ingress,整个过程可保留原有流量入口SLB不变,不需要变更DNS切流。
基于DNS解析
原理:在DNS服务器中对于所有Nginx Ingress中关联的业务域名添加MSE SLB的解析结果,部分DNS服务商提供权重方式控制Nginx SLB和MSE SLB的流量比。
方式对比
迁移方式 | 时效性 | 切流级别 | 权重切流 | 操作复杂度 |
复用Nginx Ingress SLB | 快 | SLB级别 | 支持 | 简单 |
基于DNS解析 | 慢 | 域名级别 | 依赖DNS服务商 | 与域名数量成正比 |