本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文介绍如何从Nginx Ingress迁移至ALB Ingress。
背景信息
ALB Ingress是基于阿里云应用型负载均衡ALB(Application Load Balancer)实现的Ingress服务。相比于Nginx Ingress,ALB Ingress提供更为强大的Ingress流量管理功能,具有以下优势:
全托管免运维:ALB属于全托管免运维的云服务。
自动弹性:ALB基于CyberStar自研平台,支持高性能自动弹性,处理能力随业务峰值自动伸缩。
超强性能:单个ALB实例最大支持100万QPS、千万级并发连接,默认使用SSL硬件加速。
云产品生态集成:ALB支持与多种云产品结合,如WAF、FC、PrivateLink、TR、EDAS、SAE、ASM等。
配置变更热更新:配置变更完全热更新,不需要Reload进程,对长连接无损。
场景示例
本文以下图场景为例。某企业在阿里云华东1(杭州)地域创建了一个公网CLB实例,并通过Nginx Ingress Controller配置Ingress转发规则,配置流量重定向、域名和路径的转发策略,且对外通过DNS域名提供服务。客户端访问域名www.example.net
时,DNS解析会根据A记录配置将流量指向CLB实例,CLB实例根据Ingress规则对应的转发策略将流量转发至对应Service的Pod上。
由于业务发展需要,该企业需要将后端Nginx Ingress迁移到ALB Ingress上。为了保持业务稳定,希望不改变对外提供服务的DNS域名及后端服务器的IP地址。企业可以通过在ACK集群或ACK Serverless集群上安装ALB Ingress Controller,并在ALB Ingress Controller上配置相关Ingress规则,使ALB提供的转发策略与Nginx Ingress一致,然后利用DNS域名解析的权重设置完成流量的迁移。
注意事项
您已通过kubectl工具连接ACK集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
CLB的计费方式为包年包月和按量付费,ALB的计费方式为按量付费,CLB和ALB的计费项、定价等存在差异,CLB实例的业务迁移ALB实例后,会产生计费变更。具体计费规则,请参见:
迁移步骤
步骤一:创建ALB Ingress
登录容器服务管理控制台安装ALB Ingress Controller组件。具体操作,请参见管理ALB Ingress Controller组件。
说明ALB Ingress Controller组件需安装在待迁移Nginx Ingress所在的ACK集群或ACK Serverless集群上。
如需在ACK专有集群中通过ALB Ingress访问服务,在部署服务前需要为ALB Ingress Controller授权。具体操作,请参见为ACK专有集群授予ALB Ingress Controller访问权限。
通过kubectl工具登录Nginx Ingress所在的ACK/ACK Serverless集群,创建ALBConfig。
说明如果您在安装ALB Ingress Controller时,为ALB云原生网关实例来源选择了新建或使用已有选项,controller会自动创建一个名为“alb”的AlbConfig和名为“alb”的IngressClass资源,您可忽略此步骤。
使用以下内容,创建albconfig.yaml。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-wz9e2usil7e5an1xi**** - vSwitchId: vsw-wz92lvykqj1siwvif**** listeners: - port: 80 protocol: HTTP
zoneMappings:设置ALB Ingress交换机ID,您需要至少指定两个不同可用区交换机ID,且交换机必须与集群属于同一VPC。
说明若待迁移Nginx Ingress处理的是IPv6的客户端流量,您可以在ALBConfig中通过addressIpVersion字段指定DualStack。更多信息,请参见通过AlbConfig配置ALB实例。
执行以下命令,创建ALBConfig。
kubectl apply -f albconfig.yaml
执行以下命令,查看ALB实例是否创建成功。
kubectl get albconfig
预期输出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 27s
创建IngressClass。
说明如果您在安装ALB Ingress Controller时,为ALB云原生网关实例来源选择了新建或使用已有选项,controller会自动创建一个名为“alb”的AlbConfig和名为“alb”的IngressClass资源,您可忽略此步骤。
使用以下内容,创建ingressclass.yaml。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo
parameters.name:ALBConfig名称,用于绑定ALBConfig。
执行以下命令,创建IngressClass。
kubectl apply -f ingressclass.yaml
创建ALB Ingress。
重要如果原Nginx Ingress存在其他高级转发规则,可以利用ALB Ingress服务高级用法,将来自不同域名或URL路径的请求转发给不同的后端服务器组、将HTTP访问重定向至HTTPS及实现灰度发布等功能。更多信息,请参见ALB Ingress高级用法。
使用以下内容,创建albingress.yaml。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress-alb namespace: default spec: ingressClassName: alb rules: - host: www.example.net http: paths: - backend: service: name: nginx port: number: 80 path: / pathType: Prefix
name:Ingress名称。在相同的namespace下,ALB Ingress名称与原Nginx Ingress的名称不能相同。
ingressClassName:IngressClass的名称。
执行以下命令,创建ALB Ingress。
kubectl apply -f albingress.yaml
执行以下命令,获取ALB Ingress资源。
kubectl get ing
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE demo-ingress-alb alb www.example.net alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 80 10m 46s
从返回结果中获取ALB Ingress的端点,例如本文为alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 。
执行以下命令,通过ALB Ingress访问后端服务来测试流量。
curl -H "Host: www.example.net" http://alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com
如果返回信息正常,则说明ALB Ingress可以正常访问后端服务。
步骤二:切流至ALB Ingress
流量切换前,请比对您的Nginx Ingress生成的转发策略和ALB Ingress生成的ALB转发策略,确保二者提供的能力完全一致,且所有配置经过完备的测试验收,以免在切换过程中对您的业务产生非预期的影响。
建议在业务低谷期进行流量的切换。
流量切换前,待迁移的CLB实例已配置域名解析,您已将业务域名通过A记录解析的方式指向CLB实例的服务地址。
安装ALB Ingress Controller组件并通过ALB Ingress配置相同的转发策略,完成ALB Ingress流量测试后,本文以阿里云云解析DNS为例,介绍流量由CLB切换至ALB的操作步骤。您可以通过以下步骤完成流量的切换。关于阿里云云解析DNS的介绍,请参见公网权威解析。
第一步:CLB实例配置临时域名
ALB实例推荐使用CNAME解析,为满足域名权重配置的启用条件,您需要为临时域名添加一条CNAME解析记录,同时将该临时域名指向待迁移CLB实例的服务地址。
权重配置的启用条件是域名下存在相同的主机记录、相同解析线路的多条A记录、CNAME记录、AAAA记录。
登录域名解析控制台。
在域名解析页面,找到指向待迁移CLB实例的DNS域名
www.example.net
,单击该域名。在解析设置页面,单击添加记录,在添加记录面板,完成以下参数的配置,然后单击确认。
配置
说明
记录类型
在下拉列表中选择CNAME。
主机记录
您的域名的前缀。本文输入www。
解析请求来源
选择默认。
记录值
输入临时域名,本文输入web0.example.net。
TTL
全称Time To Live,表示DNS记录在DNS服务器上的缓存时间。本文设置为5秒。
本文使用的是企业旗舰版云解析DNS,为方便验证将TTL设置为5秒。您可以根据实际情况进行设置,更多信息,请参见版本对比。
在解析设置页面,找到指向待迁移CLB实例服务地址的A记录,在操作列单击修改。
在弹出的修改记录面板,修改主机记录,然后单击确认。本文修改主机记录为web0,其余参数保持不变。
第二步:ALB实例添加CNAME解析
执行以下命令,找到ALB实例对应的DNS名称。
kubectl get albconfig
预期输出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 27s
说明您也可以登录应用型负载均衡ALB控制台查看ALB实例的DNS名称。ALB控制台仅为查看实例配置,配置变更操作需要以下发的YAML文件为准。
完成以下步骤添加CNAME解析记录。
登录域名解析控制台。
在域名解析页面单击添加域名。
在添加域名对话框中输入您的域名,然后单击确认。
警告这里添加的域名为CLB实例绑定的域名。
您的域名需已完成TXT记录验证。
在目标域名的操作列单击解析设置。
在解析设置页面单击添加记录。
在添加记录面板配置以下信息完成CNAME解析配置,然后单击确认。
第三步:设置权重,开始流量灰度
在域名解析页面,单击目标域名,在解析设置页面, 单击左侧导航栏的权重配置。
在权重配置页面,在操作列单击开启权重,然后单击设置权重。
权重配置的启用条件是域名下存在相同的主机记录、相同解析线路的多条A记录、CNAME记录、AAAA记录。
在设置权重面板,分别为CLB和ALB实例的解析记录设置权重。将CLB实例对应的解析记录的权重设置为100,同时将ALB实例对应的解析记录的权重设置为0。
在观察业务没有影响的情况下,逐步减小CLB实例解析记录的权重值,同时逐步增加ALB实例解析记录的权重值。
登录对应service的后端Pod所在ECS上,多次执行
dig
命令,验证流量切换效果。dig www.example.net
运行结果如下图所示。您可以通过多次运行结果观察到,请求会根据权重分配至ALB或CLB处理。
根据流量切换的验证结果,逐步将CLB实例解析记录的权重值减小至0,同时逐步增加ALB实例解析记录的权重值至100。
步骤三:删除冗余资源
当Nginx Ingress长连接全部处理完成,且Nginx Ingress没有新增流量时,您可以根据业务场景静默观察一段时间后释放冗余资源。