容器服务中多个SLB负载均衡并透传源 IP

1. 前言

    负载均衡 SLB各地域带宽有峰值限制,国内区域一般量为5Gbps,对于超高流量,超高并发的应用单个 SLB 没法满足需求,因而需要前置安全设施,比如 DDOS 高防,web应用防火墙的源服务器地址都支持多个 IP轮询均匀访问,指向多个 SLB,如图:

容器服务中多个SLB负载均衡并透传源 IP

  1. 域名服务,CName 指向 DDOS 高防的 CName;
  2. DDOS 高防源地址配置多个 SLB IP,DDOS 高防访问时会均匀轮询访问 SLB;
  3. SLB 负载均衡配置后端服务器,通过后端服务器指向 K8S集群的 NodePort 服务,每个SLB 平均添加多个集群的后端服务器;
    1. SLB 后端服务器数量有阈值限制;
    2. SLB 通过健康的后端服务器转发请求到 K8S 集群。
  4. 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 接入层服务,

配置流程:

  1. 规划2个集群各200台 Node 设置 Label 为 role.app.a: "true";
  2. 设置应用发布的 Deployment 的 yaml 中的Pod Affinity, 设置其调度到role.app.a: "true" 的 Node 上;
  3. 使用每个 pod 平均调度,将 pod 均匀部署到2个集群的400个 Node 上,方法参考:https://www.atatech.org/articles/147431
  4. 设置8个 SLB,每个 SLB 后设置400/8=50台后端服务器,2个集群的 Node 各25台;
  5. 设置 DDOS 高防的源站 IP 为8个 SLB 的 IP 地址;
  6. 设置2个 k8s 集群的该接入层应用的 Service 为 NodePort,externalTrafficPolicy 为 Local;

这样完成配置和部署成功后,请求通过 DDOS 均匀分发到8个 SLB,每个 SLB 又均匀分发到后端服务器,后端服务器平均部署一个 POD,请求按照 NodePort 的设置,包括真实 IP 分发到每个 POD,实现 POD 请求数均匀。

以上方案是纯人力操作,比较完美的方式是开发一个调度任务,比如 ScheduleX Job,均匀发布应用 POD 到每个 Node 上,并在每次应用重新部署或者其它导致 POD 漂移时候,重新均匀设置 SLB 负载均衡的后端服务器。

 

 

 

 

 

 

上一篇:Java内存模型FAQ(四)重排序意味着什么?


下一篇:Java内存模型FAQ(九)在新的Java内存模型中,final字段是如何工作的