相较于Nginx Ingress,ALB Ingress属于全托管服务,免去了运维成本,并提供了更强大的弹性。从Nginx Ingress迁移至ALB Ingress时,ACK提供的迁移工具可自动将Nginx Ingress配置转换为ALB Ingress的配置,免去了您手动转换配置的过程。本文提供了一个迁移示例:在将Nginx Ingress的配置转换到ALB Ingress后,通过使用DNS解析,将流量逐渐转移至ALB Ingress,完成对客户端无感的迁移。
迁移流程
通过将一个域名同时解析到Nginx Ingress和ALB Ingress并逐渐调整权重,可以实现对客户端无感的迁移。下图展示了通过DNS解析完成无感迁移的大致流程,各个步骤在下方的迁移示例场景有更具体的示例展示。
通过DNS解析迁移并非是无感迁移的唯一方式,本文中的示例仅供您参考。
迁移示例场景
通过以下示例,您可了解迁移流程中的具体操作细节和工作原理。
某企业在ACK集群中安装了Nginx Ingress Controller,并为Controller的Service选择了公网LoadBalancer
类型,使Controller自动关联了一个公网类型CLB实例。该企业同时配置了DNS解析,客户端访问www.example.net
时,客户端请求将被解析到CLB,并经由CLB转发后到达后端Pod。
步骤一:配置ALB Ingress
随着业务逐步上量,Nginx Ingress的性能已无法满足业务需求,并且产生了较为高昂的运维成本。该企业决定从Nginx Ingress迁移至ALB Ingress。迁移过程中,该企业通过ACK提供的迁移工具将Nginx Ingress的配置转换到了ALB Ingress中,并将ALB Ingress加入到了DNS解析中,给予了更低的权重。
DNS协议不允许同一域名被同时解析到A记录与CNAME记录。CLB实例通过IP接收请求,而ALB实例对外提供默认域名(详见什么是应用型负载均衡ALB)。因此需要为CLB配置一个临时域名,以达到将客户请求按权重同时分配到Nginx Ingress与ALB Ingress的效果。
步骤二:将流量逐渐转移至ALB Ingress
经过一段时间的测试后,ALB Ingress工作正常,该企业随即提高了ALB Ingress的DNS解析权重,使更多流量经由ALB Ingress转发。
步骤三:删除Nginx Ingress相关资源
在将流量完全转移至ALB Ingress后,该企业删除了DNS解析中的Nginx Ingress相关条目,移除了Nginx Ingress相关资源,并卸载了Nginx Ingress Controller组件。至此,该企业已经完成了从Nginx Ingress迁移至ALB Ingress的过程,且全流程对客户端无感。
前提条件
已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
步骤一:配置ALB Ingress
登录容器服务管理控制台,在需要执行迁移的集群中,安装ALB Ingress Controller组件。具体操作,请参见管理ALB Ingress Controller组件。迁移工具会自动转换
AlbConfig
、IngressClass
、Ingress
资源,因此在安装组件时请为ALB云原生网关实例来源选择暂不创建。重要如需在ACK专有集群中通过ALB Ingress访问服务,在部署服务前需要为ALB Ingress Controller授权。具体操作,请参见为ACK专有集群授予ALB Ingress Controller访问权限。
创建并复制下方YAML文件至ingress2albconfig.yaml中。
apiVersion: batch/v1 kind: Job metadata: name: ingress2albconfig namespace: default spec: template: spec: containers: - name: ingress2albconfig image: registry.cn-hangzhou.aliyuncs.com/acs/ingress2albconfig:latest command: ["/bin/ingress2albconfig", "print"] restartPolicy: Never serviceAccount: ingress2albconfig serviceAccountName: ingress2albconfig backoffLimit: 4 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:ingress2albconfig rules: - apiGroups: - networking.k8s.io resources: - ingresses - ingressclasses verbs: - get - list - watch - update - create - patch --- apiVersion: v1 kind: ServiceAccount metadata: name: ingress2albconfig namespace: default --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:ingress2albconfig roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:ingress2albconfig subjects: - kind: ServiceAccount name: ingress2albconfig namespace: default
执行以下命令,运行Job任务。该任务将会依据现有的Nginx Ingress Controller配置,自动转化到
AlbConfig
、IngressClass
、Ingress
等资源并输出,后续可通过Log查看。kubectl apply -f ingress2albconfig.yaml
预期输出:
job.batch/ingress2albconfig created clusterrole.rbac.authorization.k8s.io/system:ingress2albconfig created serviceaccount/ingress2albconfig created clusterrolebinding.rbac.authorization.k8s.io/system:ingress2albconfig created
查看Job所属的Pod。
kubectl get pod -l job-name=ingress2albconfig
预期输出:
NAME READY STATUS RESTARTS AGE ingress2albconfig-vw*** 0/1 Completed 0 16m
查看Pod日志。
kubectl logs ingress2albconfig-vw*** # 替换为上一步中得到的Pod名称
预期输出如下,通过kubectl将下列资源部署到集群中后,就完成了ALB Ingress的配置。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: creationTimestamp: null name: from_nginx spec: config: accessLogConfig: {} edition: Standard name: from_nginx tags: - key: converted/ingress2albconfig value: "true" zoneMappings: - vSwitchId: vsw-xxx #替换为VPC中的虚拟交换机ID - vSwitchId: vsw-xxx #替换为VPC中的虚拟交换机ID listeners: - port: 80 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: creationTimestamp: null name: from_nginx spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: from_nginx scope: null --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]' creationTimestamp: null name: from_ingress1 namespace: default spec: ingressClassName: from_nginx rules: - http: paths: - backend: service: name: nginx-svc-g1msr port: number: 80 path: / pathType: Prefix status: loadBalancer: {}
自动转换的Annotation列表
迁移工具会将下表中的Nginx Ingress Annotation自动转换为ALB Ingress中的Annotation。
不在下表中的Nginx Ingress Annotation在转换过程中会被忽略,请您在转换完成后确认ALB Ingress的配置,以避免功能与预期不符。
步骤二:将流量逐渐转移至ALB Ingress
流量切换前,请比对您的Nginx Ingress和ALB Ingress的转发策略,并进行测试以确保二者的功能完全一致,以免在切换过程中对您的业务产生非预期的影响。
建议在业务低谷期进行流量的切换。
为CLB实例配置临时域名
因为DNS协议并不支持将一个域名同时解析到A记录与CNAME记录,且ALB实例对外提供默认域名,因此您需要为CLB配置临时域名。
登录域名解析控制台。
在域名解析页面,找到指向待迁移CLB实例的DNS域名
www.example.net
,单击该域名。在解析设置页面,单击添加记录,在添加记录面板,完成以下参数的配置,然后单击确认。
配置
说明
记录类型
在下拉列表中选择CNAME。
主机记录
域名的前缀,在本示例中输入
www
。解析请求来源
选择默认。
记录值
输入临时域名,在本示例中输入
web0.example.net
。TTL
全称Time To Live,表示DNS记录在DNS服务器上的缓存时间,保持默认。
在解析设置页面,找到由
www.example.net
指向CLB实例IP的A记录,在操作列单击修改。在弹出的修改记录面板,修改主机记录,然后单击确认。本文修改主机记录为web0,其余参数保持不变。
说明完成配置后,
www.example.net
将被CNAME条目解析到web0.example.net
,而web0.example.net
将被A条目解析到CLB实例的IP地址。
为ALB实例添加CNAME解析
执行以下命令,找到ALB实例的域名。
kubectl get albconfig
预期输出如下,其中的
alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com
即为ALB实例的域名。NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE from_nginx alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 20m
在解析设置页面,单击添加记录,在添加记录面板,完成以下参数的配置,然后单击确认。
配置
说明
记录类型
在下拉列表中选择CNAME。
主机记录
域名的前缀,在本示例中输入
www
。解析请求来源
选择默认。
记录值
输入ALB实例的域名。
TTL
全称Time To Live,表示DNS记录在DNS服务器上的缓存时间,保持默认。
设置流量权重
在解析设置页面, 单击左侧导航栏的权重配置。
在权重配置页面,在操作列单击开启权重,然后单击设置权重。
在设置权重面板,分别为CLB和ALB实例的解析记录设置权重。将CLB实例对应的解析记录的权重置为100,同时将ALB实例对应的解析记录的权重设置为0。
在观察业务没有影响的情况下,逐步减少CLB实例解析记录的权重值,同时逐步增加ALB实例解析记录的权重值。
登录对应Service的后端Pod所在Worker节点上,多次执行
dig
命令,验证流量切换效果。根据流量切换的验证结果,逐步将CLB实例解析记录的权重值减小至0,同时逐步增加ALB实例解析记录的权重值至100。
步骤三:删除Nginx Ingress相关资源
当Nginx Ingress长连接全部处理完成,且Nginx Ingress没有新增流量时,您可以根据业务场景静默观察一段时间后释放冗余资源。
相关文档
ALB实例支持多种配置,更多信息,请参见通过AlbConfig配置ALB实例。
在ALB Ingress中使用HTTPS协议的操作,请参见配置HTTPS证书以实现加密通信。
ALB Ingress支持的Annotation列表,请参见ALB Ingress配置词典。