1. 前言
负载均衡 SLB各地域带宽有峰值限制,国内区域一般量为5Gbps,对于超高流量,超高并发的应用单个 SLB 没法满足需求,因而需要前置安全设施,比如 DDOS 高防,web应用防火墙的源服务器地址都支持多个 IP轮询均匀访问,指向多个 SLB,如图:
- 域名服务,CName 指向 DDOS 高防的 CName;
- DDOS 高防源地址配置多个 SLB IP,DDOS 高防访问时会均匀轮询访问 SLB;
- SLB 负载均衡配置后端服务器,通过后端服务器指向 K8S集群的 NodePort 服务,每个SLB 平均添加多个集群的后端服务器;
- SLB 后端服务器数量有阈值限制;
- SLB 通过健康的后端服务器转发请求到 K8S 集群。
- K8S 集群的 Service NodePort externalTrafficPolicy 配置 Local 模式,透传实际访问 IP 到K8S 应用。
2. 透传实际 IP
- DDOS 防护 获取客户端真实 IP: https://help.aliyun.com/knowledge_detail/40535.html?spm=5176.11065259.1996646101.searchclickresult.25cf41a8ADwJgw
- SLB 获取客户端真实 IP:https://help.aliyun.com/document_detail/54007.html?spm=5176.11065259.1996646101.searchclickresult.22542e49qVwaU9
- K8S 集群: Service 的 NodePort 或者 SLB 将externalTrafficPolicy 设置为 Local,该方式需要按照一定规则设置后端服务器,不然可能导致负载不均衡。
说明:Service.spec.externalTrafficPolicy - 如果这个服务需要将外部流量路由到 本地节点或者集群级别的端点,那么需要指明该参数。存在两种选项:”Cluster”(默认)和 “Local”。 “Cluster” 隐藏源 IP 地址,可能会导致第二跳(second hop)到其他节点,但是全局负载效果较好。”Local” 保留客户端源 IP 地址,避免 LoadBalancer 和 NodePort 类型服务的第二跳,但是可能会导致负载不平衡。
3. 负载均衡请求
透传 IP 后,需要合理设置后端服务器,并控制应用的 POD 均匀分布到后端服务器,才可以保持负载均衡,具体策略如下:
假设配置接入层应用A,域名为 a.xxx.com, 高并发高流量,需要8个 SLB 负载均衡接入,SLB 负载均衡指向 K8S 集群的 NodePort Service;
DDOS 高防 --> 8个 SLB-->2个 K8S 集群(共800台 worker 机器) NodePort service --> 400台 POD 接入层服务,
配置流程:
- 规划2个集群各200台 Node 设置 Label 为 role.app.a: "true";
- 设置应用发布的 Deployment 的 yaml 中的Pod Affinity, 设置其调度到role.app.a: "true" 的 Node 上;
- 使用每个 pod 平均调度,将 pod 均匀部署到2个集群的400个 Node 上,方法参考:https://www.atatech.org/articles/147431
- 设置8个 SLB,每个 SLB 后设置400/8=50台后端服务器,2个集群的 Node 各25台;
- 设置 DDOS 高防的源站 IP 为8个 SLB 的 IP 地址;
- 设置2个 k8s 集群的该接入层应用的 Service 为 NodePort,externalTrafficPolicy 为 Local;
这样完成配置和部署成功后,请求通过 DDOS 均匀分发到8个 SLB,每个 SLB 又均匀分发到后端服务器,后端服务器平均部署一个 POD,请求按照 NodePort 的设置,包括真实 IP 分发到每个 POD,实现 POD 请求数均匀。
以上方案是纯人力操作,比较完美的方式是开发一个调度任务,比如 ScheduleX Job,均匀发布应用 POD 到每个 Node 上,并在每次应用重新部署或者其它导致 POD 漂移时候,重新均匀设置 SLB 负载均衡的后端服务器。