DockOne技术分享(一二五):深信服容器云的负载均衡实现


【编者的话】此次重点讲的是在深信服容器云项目中的负载均衡方案的原理与实现。同时,因为我们投入的人力有限,人员的水平也有不足,但是借助Docker与Kubernetes等开源技术的发展,我们基本上达到了容器云平台中应用服务的负载均衡。

【3 天烧脑式 Docker 训练营 | 上海站】随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛。本次培训我们理论结合实践,从Docker应该场景、持续部署与交付、如何提升测试效率、存储、网络、监控、安全等角度进行。

首先介绍下背景,我们此次的重点讲的是在我们容器云项目中的负载均衡方案的原理与实现。

先说一下我们的云平台的基本情况,我们云平台基于Kubernetes,在Kubernetes集群上做了深度优化,形成超融合容器云一体化方案。能做到一键部署、与超融合无缝融合。今天我们主要讲我们容器云平台中,应用的负载均衡原理与实现。

1 . 容器云负载均衡的功能介绍

负载均衡的原理,我相信在这里不需要详述了。我们直接介绍我们在容器云平台上实现的负载均衡有哪些功能,解决哪些客户问题。
  1. 支持4层/7层应用负载
  2. 支持会话保持
  3. 配置简单,无需关注k8s应用细节
  4. 高可用、高自愈能力


2 . Kubernetes负载均衡方案介绍

1)通过service实现负载

Services是Kubernetes的基本操作单元,是真实应用服务的抽象,每一个服务后面都有很多对应的容器来支持,通过Proxy的port和服务selector决定服务请求传递给后端提供服务的容器,对外表现为一个单一访问接口,外部不需要了解后端如何运行,这给扩展或维护后端带来很大的好处。
图片1.png

2)通过ingress实现负载

Service和Pod的IP地址只能在集群内部网络中路由,所有到达“边界路由器”(Edge Router)的网络流量要么被丢弃,要么被转发到别处
Ingress是对外(公网)服务到集群内的Service之间规则的集合:允许进入集群的请求被转发至集群内。
图片2.png

3 . 深信服容器云的负载均衡方案

我们的负载方案是基于HAProxy实现的负载, 以容器的形式部署在集群中:
  1. 解耦DNS-server配置,静态配置DNS,动态绑定业务IP,支持故障迁移,IP高效利用率;
  2. 容器化多节点部署Haproxy,高可靠多节点进行负载均衡;
  3. 域名访问支持会话保持,路径分发等功能。


部署图:
图片3.png


流程图:
图片4.png


该方案的特点如下:
  1. 负载均衡器根据集群内API Server获得服务信息,并生成balancer的配置。
  2. 外部路由以及外部负载与vip方案实现可以同时兼容存在。
  3. 可选HAProxy与Nginx,两者都能实现4层&7层负载(HAProxy不支持4层UDP),两者都支持cookie做会话保持,都支持SSL。
  4. HAProxy与Nginx实现方案基本一致,不同的只是配置模板,可以互相切换,目前暂定了HAProxy。


4 . 端口映射的原理与实现

  1. 容器服务端口通过Docker映射到host主机上,主机端口和容器互通;
  2. Kubernetes维护和不停的刷新每台节点上的iptables规则;
  3. 访问从任意节点进来是,通过主机上的iptables规则负载均衡到各个节点的服务端口。
    图片5.png


Q&A

Q:HAProxy是在Kubernetes内部对pod互通,是如何实现pod的发现的?

A:Kubernetes有一个开源机制,叫做ingress模块,提供了pod基于service的发现。
Q:Haproxy是通过配置模版生成的吗?更新然后重载吗?

A:是通过配置模板来生成负载均衡的分发规则,我们时刻动态刷新配置,我们重载配置,链接达到0丢失。
Q:如果你们的HAProxy的lb和ingress一样仅支持四,七层的lb,那么对于Nginx或者traefik的优势在于哪里呢?

A:各有优缺点,HAProxy更加适用于我们的平台。对于Nginx等,我们更加轻量,更加简单 ,迭代快。
Q:HAProxy经常reload有性能消耗,怎么做对单个发布的应用进行动态更新?之前新浪有Consul + Nginx?

A:不存在性能消耗,我们针对于单个应用的动态更新与多个的性能差异很小,因为都是配置 重载。
Q:如何做到HAProxy重载配置链接0丢失的?

A:首先重载之前的iptable规则,丢弃握手包,重启之后,去掉规则,达到重载时间内新请求不丢失,原有链接,haproxy提供机制支持,接管原来的链接。
Q:HAProxy是怎么调用service的? 直接调用service的群集ip?

A:基于Kubernetes的listwatch资源监听,通过service对应的endpoint获取到pod的ip。
以上内容根据2017年05月25日晚微信群分享内容整理。分享人钟德财,深信服科技研发工程师。毕业于华南理工大学。早期从事大数据,数据挖掘方面研究工作,现主要负责容器云平台产品开发与管理工作。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

3 个评论

这个分享挺好的
按照部署图,如果 node1 发生故障,DNS如果剔除node1的IP?
不需要剔除, node1是VIP, 会自动飘移

要回复文章请先登录注册