mesos-dns & marathon-lb

来源:互联网 发布:java gz 压缩 多文件 编辑:程序博客网 时间:2024/05/02 00:00

Mesos-dns 和 Marathon-lb 是mesosphere 官网提供的两种服务发现和负载均衡工具。

1. Mesos服务发现与负载均衡

默认情况下mesos marathon会把app发布到随机节点的随机端口上,mesos slavesapp越来越多的时候,想查找某组app就变得困难。

mesos提供了两个工具:mesos-dnsmarathon-lbmesos-dns是一个服务发现工具,marathon-lb不仅是服务发现工具,还是负载均衡工具。

 

2. mesos-dns

Mesos-dns是 mesos 服务发现工具,能查找appIp,端口号以及master,leader等信息在Apache Mesos 集群中,允许应用程序和服务通过域名系统(DNS)来相互定位。Mesos-DNS 充当的角色和在互联网中DNS 的作用差不多。Mesos-DNS 的特点是轻量、无状态,易于部署和维护。Mesos-DNS 将每个集群中正在运行的应用程序的域名转换成IP 地址和端口号。这使得任何链接到集群中运行的服务都可以通过DNS 进行查找。Mesos-DNS 被设计成简单并且无状态的,它不需要共识机制,永久储存以及日志。因为Mesos-DNS 没有实现心跳,状态监测,或者管理应用程序的生命周期。这些功能在Mesos master,slaves,和frameworks 中实现。

Frameworks 运行在Mesos 中,不需要直接与Mesos-DNS 通信。Mesos-DNS 定期查询Mesos master(s),检索所有运行的框架中正在运行的任务的状态,并为这些任务生成DNS 记录,包括A 记录与SRV记录。当Mesos 集群中的任务开始,结束,或重启, Mesos-DNS 都需要更新DNS 记录以保证为最新状态。

在某一DNS 域A 中,当某一框架B 启动某一任务C,Mesos-DNS 就会为hostname 为C.B.A 生成一条记录(A),对应的ip 有下述两中情况:

1、任务执行的容器所提供的网络ip(这个网络是mesos 容器提供的)

2、任务在某一slave 节点执行的ip

需要解释的A.B.C 即为taks.framework.domain 这样的命名规则,例如,当mesos 使用marathon 框架执行jenkins 任务,这样就可以知道其域名,即为:jenkins.marathon.mesos.

SOA 记录

除了task.framework.domain 记录,Mesos-DNS 通常还会产生一个A记录task.framework.slave.domain,即为task 执行的slave 节点的ip。例如,jenkins.marathon.slave.mesos 的A 记录将运行marathon 框架的jenkins应用的slave 节点的ip。

SRV 记录

服务器资源记录为某一服务分配一个hostname 和一个ip port,对于在域A 中,当框架B 启动任务C,这样Mesos-DNS 将产生一个SRV 记录名为_C._tcp.B.A,命名规则为_taskname._protocol.framework.domain,其中protocol 可以为udp 或者tcp,例如mesos 使用marathon 启动的任务jenkins。


2.1 使用方法

注:lk-dcos-2是安装了mesos-dns的主机名,测试的app名为nginx-test。

2.1.1 查找appip

centos7安装dig:yum -y install bind-utils

dig nginx-test.marathon.mesos +short

10.132.47.25

10.132.47.26

2.3.2 查找app所在节点的IP

dig nginx-test.marathon.slave.mesos +short 

10.132.47.25

10.132.47.26

2.3.3 查找app服务端口号

dig SRV _nginx-test._tcp.marathon.mesos +short

0 0 3734 nginx-test-d1o9k-s0.marathon.mesos.
0 0 16016 nginx-test-jin7r-s2.marathon.mesos.
0 0 19683 nginx-test-m9whb-s0.marathon.mesos.

0 0 24465 nginx-test-58msf-s2.marathon.mesos.


3. marathon-lb

Marathon-lb既是一个服务发现工具,也是负载均衡工具,它集成了haproxy,自动获取各个app的信息,为每一组app生成haproxy配置,通过servicePort或者web虚拟主机提供服务

要使用marathonn-lb,每组app必须设置HAPROXY_GROUP标签。

Marathon-lb运行时绑定在各组app定义的服务端口(servicePort上,可以通过marathon-lb所在节点的服务端口访问各组app

对于提供web服务的app,可以增加一个HAPROXY_{n}_VHOST(WEB虚拟主机)标签,marathon-lb会自动把这组app的WEB集群服务发布在marathon-lb所在节点的80443端口上,用户设置DNS后通过虚拟主机名来访问。

3.3 使用方法

下面使用marathon-lbhttp服务进行服务发现和负载均衡:

3.3.1 发布app

# 先创建app的json配置信息

一定要加上HAPROXY_GROUP标签,对于web服务,可以加上VHOST标签,让marathon-lb设置WEB虚拟主机;

对于web服务,servicePort设置为0即可,marathon-lb会自动把web服务集群发布到80、443上; 

{
"id": "test-app",
"labels": {
"HAPROXY_GROUP":"external",
"HAPROXY_0_VHOST":"test-app.gkkxd.com"

},
"cpus": 0.5,
"mem": 64.0,
"instances": 3,
"constraints": [["hostname", "UNIQUE"]],
"container": {
"type": "DOCKER",
"docker": {
"image": "httpd",
"privileged": false,
"network": "BRIDGE",
"portMappings": [
{ "containerPort": 80, "hostPort": 0, "servicePort": 0, "protocol": "tcp"}
]
}
}
}

#发布app

curl -i -H 'Content-Type: application/json' 172.31.17.71:8080/v2/apps -d@test-app.json

3.3.2 访问app

先设置DNS或者hosts文件:

172.31.17.34 test-app.gkkxd.com

用浏览器通过http和https访问虚拟主机,发现服务已经启动,实际上是marathon-lb内置的haproxy对test-app的三个实例配置的web服务集群:

http://test-app.gkkxd.com

https://test-app.gkkxd.com

对于marathon-lb,可以同时部署多台,然后用DNS轮询或者keepalived虚拟IP实现高可用。






http://www.cnblogs.com/hahp/p/5396302.html

0 0