自建Nginx Ingress迁移到ELB Ingress
本文介绍如何从自建Nginx Ingress迁移至ELB Ingress。
ELB Ingress是基于华为云弹性负载均衡(Elastic Load Balance)实现的Ingress服务。相比于自建Nginx Ingress,ELB Ingress提供更为强大的Ingress流量管理功能,具有以下优势:
- 全托管免运维:ELB属于全托管免运维的云服务,不占用工作节点。
- 高可用性:ELB支持多可用区的同城双活容灾,无缝实时切换。完善的健康检查机制,保障业务实时在线。
- 自动弹性:ELB支持自动弹性规格,处理能力随业务峰值自动伸缩。
- 超强性能:单个ELB实例最大支持100万QPS、千万级并发连接。
- 云产品生态集成:ELB支持与WAF等多种云产品结合使用。
- 配置变更热更新:配置变更完全热更新,不需要Reload进程,对长连接无损。
场景示例
某企业在华为云使用CCE集群,并通过自建Nginx Ingress Controller配置Ingress转发规则,配置域名和路径的转发策略,且对外通过DNS域名提供服务。客户端访问域名example.com时,Nginx Ingress接收到请求会根据对应的转发策略将流量转发至对应Service的Pod上。
由于业务发展需要,该企业需要将自建Nginx Ingress迁移到ELB Ingress上。为了保持业务稳定,希望不改变对外提供服务的DNS域名及后端服务器的IP地址。您可以通过在CCE集群上配置ELB Ingress规则,使ELB提供的转发策略与之前一致,然后利用DNS域名解析的权重设置完成流量的迁移。
- 建议在业务低谷期进行流量的切换。
- 使用ELB会产生计费信息,具体计费详情请参见计费概述。
配置待迁移的ELB Ingress
- 创建待迁移的Ingress,并指向原有的后端服务。
本例中使用已有ELB创建Ingress,创建elbingress.yaml文件示例如下。您还可以选择自动创建Ingress关联的ELB,更多指导请参见通过Kubectl命令行创建ELB Ingress。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/elb.id: <your_elb_id> #替换为您已有的ELB ID kubernetes.io/elb.ip: <your_elb_ip> #替换为您已有的ELB IP kubernetes.io/elb.class: performance #ELB类型: 独享型为performance kubernetes.io/elb.port: '80' spec: rules: - host: 'example.com' #替换为您的域名 http: paths: - path: '/' backend: service: name: <your_service_name> #替换为您的目标服务名称,与原Nginx Ingress关联的服务一致 port: number: 8080 #替换为您的目标服务端口 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce
- 执行下面命令创建Ingress。
kubectl apply -f elbingress.yaml
切流至ELB Ingress
流量切换前,假设您已将业务域名通过A记录解析的方式指向了自建Nginx Ingress的公网地址。您可以使用DNS的流量权重分配,逐步将访问原Nginx Ingress的流量切换至新的ELB Ingress。
您可以通过以下步骤完成流量的切换。
- 进入公网域名列表页面。
- 在“公网域名”页面的域名列表中,单击域名example.com的名称。
- 进入“解析记录”页面。此时已存在一个A记录,对应Nginx Ingress的公网IP。修改Nginx Ingress的A记录的权重为9。
- 单击“添加记录集”,添加A记录,地址为待迁移的ELB公网IP,并将权重设置为1。
图2 添加DNS记录集
- 在观察业务没有影响的情况下,逐步调整ELB实例解析记录的权重值至100%。
删除冗余资源
当Nginx Ingress长连接全部处理完成,且Nginx Ingress没有新增流量时,您可以根据业务场景静默观察一段时间后释放冗余资源,删除Nginx Ingress实例、controller控制器、webhook等。