DC/OS的服务发现与负载均衡功能

2020-06-01 00:00:00 规则 服务 域名 均衡器 负载均衡

方式一:Mesos-DNS和marathon-lb

只有有了服务发现和负载均衡功能,才能使得服务的物理布局,服务之间的依赖关系,服务挂掉之后的自动修复不需要用户关心,才能使得用户像用一台电脑一样使用整个数据中心。

如果服务之间的相互调用不使用IP地址,而使用域名的话,问题会简单很多。

对于Mesos上运行的每一个Task,Mesos-DNS都可以通过调用Mesos-Master的API得到,并且为每个Task分配一个域名和IP的对应项。如果一个Task需要访问另一个Task,则需要配置域名即可,无论Task如何挂掉,如何分配到其他的节点上运行,域名都不会变,当然Task的IP可能会变,但是不用担心,Mesos-DNS会更新它。

Marathon-lb是一个基于haproxy的负载均衡器,它会监听marathon event bus,每当注册到marathon-lb上的服务数目变化的时候,marathon-lb会自动更新haproxy的配置文件,从而实现负载均衡。Marathon-lb可以如图中实现对外的负载均衡,也可以实现对内的服务之间相互调用的负载均衡。

 

我们在服务里面创建如下的应用:

  1. {

  2.   "id": "nginx",

  3.   "container": {

  4.     "type": "DOCKER",

  5.     "docker": {

  6.       "image": "nginx:1.7.7",

  7.       "network": "BRIDGE",

  8.       "portMappings": [

  9.         { "hostPort": 0, "containerPort": 80, "servicePort": 10000 }

  10.       ]

  11.     }

  12.   },

  13.   "labels":{

  14.     "HAPROXY_GROUP":"external"

  15.   }

  16. }

servicePort为10000则说明我们注册到marathon-lb上的外部端口为10000, labels里面写的是external,也即注册到外部的负载均衡器上。

访问public slave上的10000端口,就能看到启动的nginx的页面http://54.254.148.129:10000/,内部其他的应用可以通过http://marathon-lb.marathon.mesos:10000来访问这个nginx

 

方法二:Minuteman

 

Minuteman是一个内部的东西向的负载均衡器,可用于设置VIP,多个实例使用同一个VIP来进行负载均衡。

在创建服务的时候,选择Load Balanced,则下面会出现一行地址:nginxdocker.marathon.l4lb.thisdcos.directory:80,这个就是minuteman分配的VIP。

当服务创建好了之后,通过curl http://nginxdocker.marathon.l4lb.thisdcos.directory:80就可以访问这个服务,但是我们如果ping这个域名却是不通的,而且对于的IP地址也是很奇怪的IP地址,这个IP就是VIP.

minuteman的load balancer是基于Netfilter的,在dcos的slave节点上,我们能看到多出来了四个iptables规则。其中前两个规则是在raw表里面的,后两个规则是在filter表里面的。

  1. -A PREROUTING -p tcp -m set --match-set minuteman dst,dst -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j NFQUEUE --queue-balance 50:58

  2. -A OUTPUT -p tcp -m set --match-set minuteman dst,dst -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j NFQUEUE --queue-balance 50:58

  3. -A FORWARD -p tcp -m set --match-set minuteman dst,dst -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REJECT --reject-with icmp-port-unreachable

  4. -A OUTPUT -p tcp -m set --match-set minuteman dst,dst -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REJECT --reject-with icmp-port-unreachable

根据iptbles的规则raw表中的规则会被先执行,一旦到达了filter表的minuteman的包就都过滤掉了。

NFQUEUE的规则表示将对于包的处理权交给用户态的一个进程。--queue-balance表示会将包发给几个queue,然后用户态进程会使用libnetfilter_queue连接到这些queue中,将包读出来,根据包的内容做决策后放回内核进行发送。

在每一个Mesos-Agent节点上都运行这一个minuteman的进程,监听这些queue,我们可以通过访问API查看VIP的映射关系,curl http://localhost:61421/vips。


相关文章