据悉marathon-lb的劳动自发现与负载均衡

参照文档:

C++分布式实时应用框架——微服务架构的形成

 技术交换合作QQ群:436466587 欢迎啄磨交换

上一篇:(四):C++分布式实时应用框架——状态为主模块

 

版权表明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等作为保留法律追究的权利!

 

  OCS(online charging
system,在线计费系统)在举行云化改造的进程中,从实用主义角度出发,微服务架构并不是大家的对象。虽然大家也对系统举办了容器化改造(Docker),并基于业务经过的功能将系统分为了少数类的器皿,但这一切多是出于对系统中的某些处理节点开展动态扩缩容的内需,跟微服务半点关系没有。随着系统改造
的尖锐,系统的通讯关系复杂程度开端领先大家事先的估价。如若说数量过多的功力节点还有人可以勉强掌握,这么些节点间错综复杂的报道关系连线已超过程序员可以明白的范畴。在座谈哪边简化程序员实现全方位系统各项节点的报导关系的配置过程中,节点微服务化的理念日益进入咱们的脑海之中……

  下边先给我们介绍下大家所面临的困境,下边的图是大家系统部分节点的简报关系总图(注意,只是其中有的):

葡京在线开户 1

 

  还记得第二篇《基于ZeroMQ的实时报道平台》中异常大家引以为傲的简报配置文件呢,就是先后中有着的报导连接关系不再是写死在代码中,而是经过AppInit.json配置文件进行配置,程序启动的时候再由CDRAF举办实时加载。当初酷炫的法力,现在却成我们的梦魇。此时AppInit.json这个文件已到达1700多行,你没看错,一个布局文件1700多行,并且还不是全部,还会延续变大。

 

"OLC" : {
      "AUTO_START" : "YES",
      "ENDPOINTS" : [
         {  // 用于与SmartMonitor建立心跳
            "name" : "MonitorSUB",   
            "zmq_socket_action" : "CONNECT",  // ZMQ的连接模式
            "zmq_socket_type" : "ZMQ_SUB"     // ZMQ的通讯模式
         },
         { // 下发消息给OCDis,这边存在转发功能,支持业务实现按条件转发
            "downstream" : [ "OCDis2OLC"],
            "name" : "NE2OLC",                // 根据这个名字在业务代码中实现转发
            "zmq_socket_action" : "BIND",
            "zmq_socket_type" : "ZMQ_STREAM" 
         },
         { // OLC到OCDis的链路
            "name" : "OCDis2OLC",
            "statistics_on" : true,
            "zmq_socket_action" : "CONNECT",
            "zmq_socket_type" : "ZMQ_DEALER"
         },
         { // OCDis回OLC的链路,之所以来去分开,主要用于实现优雅启停功能(启停节点保证不丢消息)
            "name" : "OCDis2OLC_Backway",
            "statistics_on" : true,
            "zmq_socket_action" : "CONNECT",
            "zmq_socket_type" : "ZMQ_DEALER",
            "backway_pair" : "OCDis2OLC"
         },
         {  // 用于与SmartMonitor的命令消息链路
            "name" : "OLC2Monitor",
            "zmq_socket_action" : "CONNECT",
            "zmq_socket_type" : "ZMQ_DEALER"
         },
      ],
      "ENDPOINT_TO_MONITOR" : "OLC2Monitor",
      "INSTANCE_GROUP" : [
         {
            "instance_endpoints_address" : [
               {
                  "endpoint_name" : "NE2OLC",
                  "zmq_socket_address" : "tcp://*:6701"
               },
               {
                  "endpoint_name" : "OCDis2OLC",
                  "zmq_socket_address" : [
                     "tcp://127.0.0.1:7201"   // 跨机的IP地址与端口,配合状态中心可实现自动管理,无需人工参与配置
                  ]
               },
               {
                  "endpoint_name" : "OCDis2OLC_Backway",
                  "zmq_socket_address" : [
                     "tcp://127.0.0.1:7202"
                  ]
               },
               {
                  "endpoint_name" : "OLC2Monitor",
                  "zmq_socket_address" : "ipc://Monitor2Business_IPC"
               },
               {
                  "endpoint_name" : "MonitorSUB",
                  "zmq_socket_address" : "ipc://MonitorPUB"
               }
            ],
            "instance_group_name" : "1"
         }
      ]
   },

 

  一个工作程序员倘使要调动系统中某个程序的报导连接,一定得盯着下边这副图探究半天,并且要搞了解“CONNECT”、“BIND”、”ZMQ_ROUTER”、“ZMQ_DEALER”等等那些zeromq专业词汇的意思,才可能展开准确配置,我们隐隐感到这已是一个mission
impossible。如何简化那一个布局文件,如何对系统的复杂度进行分层,让不同层级的人口只是只需关注自我层级情况,再通过大家的CDRAF最后将这么些散落的布局、代码组成一个做到可运行的系统才是大家先天急需解决的题材。相信这也是各类系统架构师所面临的题目,当一个类另外复杂度超过单个人可承受能力范围,就要对这个系统举办恰当分层,分模块。让每个人去管理一小部分复杂点,并且我们只需兑现好和谐的模块,无需去关心其余模块的兑现细节。通过先行规划好的接口,各种模块可以相互协作,全部系统是足以依此完美地运转的。那里CDARF正是起这样一个不一模块的大桥(接口)的效能。

  1. Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/
  2. 参考:http://www.cnblogs.com/kevingrace/p/6845980.html
  3. 依照脚本实现服务自发现与负载均衡(供参考,marathon-lb以前的方案):

    http://dockone.io/article/439

    https://github.com/draculavlad/SetUpMesosphereOnCentos7WithServiceDiscovery/

  一、节点间通讯模式的会见

  原来节点内的应用程序都是报道全能应用程序,所谓全能是指应用程序既能够跟节点内的进程展开报道也得以跟节点外的随意进程展开报道。这样乍看起来没啥问题,但假若节点数和过程数变多后,通讯关系将是一个指数级增长的过程。如下图,倘诺再追加一个CDR节点,或者OCS节点,连接数都将追加非凡多。

  葡京在线开户 2

  我们的解决办法是统一节点的报道模式,每个节点内都有一个Dis进程,统一对外承担跟其他节点举办报道。在接到外部发给节点的音信后,依据效率和负载转发给内部工作处理过程。业务经过倘使有音信需要发往此外节点,就一向发放Dis进程,由它举行转账。统一通讯模式带来的功利除了在节点和进程增多后,通讯关系不会变得太复杂以外。由于格局统一,
CDARF可以替业务程序员完成很多干活,直接的利益就是事情程序员不再需要安排很多与工作无关的配置。最大化的将通讯模块的复杂度留给CDRAF去处理,业务程序员将越发小心于我的政工逻辑。下面的图中其实系统起先已经有微服务的规范,但大家盼望完成的不单是从系统架构上是微服务架构,在程序员开发顺序的时候,也理应是带着微服务思维的,我们的CDRAF应该提供这样一种能力来支撑这种支付情势。

  葡京在线开户 3

 

 本文重要遵照marathon-lb实现mesos+marathon平台的的劳动自发现与负载均衡。

  二、配置文件的简化

  通讯形式统一后,我们对报道配置文件举办了一遍较大的简化,从原先1700行收缩到了200行左右。这中档省去了诸多冗余的部署项,通讯配置文件不再是对系统通讯简单直接的照应,而更多的是对节点通讯能力的一种表述。

  应用程序分为Dis和非Dis两类,Dis类程序重要负责节点间的通讯和节点内的音讯转发,非Dis类程序就是平凡的事务处理过程。从底下的文书中得以看看“OCDis”进程中分成“InterContainerEndpoints”和“InnerContainerEndpoints”两大类,分别代表节点间的报导和节点内的报道。对于节点间的报道,每个服务端口只要写上相应的“服务名字”就可以以了,配置中的“OCDisCDRDis”表示OCSDis与CDRDis的报导,“OLCDisOLCProxy”、“OCDis_SyDis_SNR”也是看似。当工作侧程序需要对外提供一个劳务(或者说与外部举行报道),只需要写一个服务名字,而如:端口、机器的IP地址、服务端如故客户端、通讯形式等等都完全不需要去关爱,这是多大一种有益。配置中的注释部分是不需要工作程序员去填的,而是由CDRAF的境况为主,依照集群节点的实时气象自动生成,并拓展连续和保安。

  

{
  "OCDis": {
    "MaxInstanceGroupNum": 3,
    "InterContainerEndpoints": 
    {
      "OCDisCDRDis": 
      {
        //"Port": [6001, 6002, 6003],
        //"Cluster": ["10.45.4.10:6001", "10.45.4.10:6001"]
      },

      "OCDisOLCProxy": 
      {
        //"Port": [6101, 6102, 6103],
        "DownStreams": ["OCDis2IN", "OCDis2PS", "OCDis2SMS", "OCDis2ISMP", "OCDis2IMS"],
        "router": true
      },
      "OCDis_SyDis_SNR": 
      { 
          //"Peer": "ZSmartSyDis.OCDis_SyDis_SNR" 
      }
    },

    "InnerContainerEndpoints": 
    {
      "OCPro_OCDis_CDR": { "DownStreams": ["OCDisCDRDis"] },
      "OCPro_OCDis_SNR": { "DownStreams": ["OCDis_SyDis_SNR"] },
    }
  },

  "OCPro": {
    "Groups": ["IN", "PS", "SMS", "IMS", "ISMP"],
    "InnerContainerEndpoints": {
      "OCPro2OCDis": {
        "PeerMap": [
          "OCDis.OCDis2IN",
          "OCDis.OCDis2PS",
          "OCDis.OCDis2SMS",
          "OCDis.OCDis2ISMP",
          "OCDis.OCDis2IMS"
        ]
      },
      "OCPro_OCDis_SNR": {"Peer": "OCDis.OCPro_OCDis_SNR"},
      "OCPro_OCDis_CDR": {"Peer": "OCDis"}
    }
  },

  "CDRDis": {
    "InterContainerEndpoints": 
    {
      "OCDisCDRDis" : 
      {
        "DownStreams": ["CDRDisCDR"],
        //"Peer": "OCDis"
      }
    }
  },

  "CDR": {
    "InnerContainerEndpoints": 
    {
      "CDRDisCDR" : {"Peer": "CDRDis"}
    }
  }
}

  想像一下,对于每一个政工节点,开发人士仅需考虑节点内的业务实现逻辑,并为本节点对外所提供的劳务起个名字,而不再需要关怀这一个服务到底是提供给何人,更毫不操心什么人会来连本人的经过,怎么连。这是何其精细的政工!大家不不过从架构上完成了微服务架构,程序员在付出业务程序的时候,不需要去关爱除了自身模块以外的另外复杂音讯,从此可以轻装上阵,而不再需要负重前行。这应该就是CDRAF对微服务架构提供的最直白、最好的支撑了,协理工作程序员从观念的支付形式转变,进而适应微服务的思想格局。

葡京在线开户 4

 

一.环境

  三、节点间的简报关系安排

  下边我们关系配置文件只定义了节点的劳务名,那么如此多的微服务节点是怎样构成起来工作的?一个业务使用系统会由许多的微服务一起联手提供劳动,这一个劳动对于每个不同的当场或者功效是不平等的,或者说微服务汇集是不均等的。那么,对这一个微服务的组成的经过就像一个“编排”的历程。通过“编排”,采取适合的微服务举行铺垫组合提供劳务,而编辑的过程就是我们报道建立的进程。上面我们就来看一下CDRAF是什么样成功“编排”效用的。

  葡京在线开户 5

葡京在线开户 6

  下边的首先张表,描述了有着的微服务列表,所有节点服务要向外通讯都不可以不到这张表中加进对应的劳务名,这里的劳动名是与前边配置文件中的服务名相对应的。第二张表描述了这个微服务名以内的通讯关系,比如第二条记下表明的是OCDis程序的OCDis2CDRDis到CDRDis的OCDis2CDRDis之间会有一个通讯关系。只要经过这一个简单的布置,就可以完成多个节点间的通讯关系的创造。这样的设计会带动多少个好处。

  1、对于一个扑朔迷离的体系,可能有几十类微服务节点,运行实例可能有不少个,若是有地方的表二,就足以容器的从上边的多寡中画出任何集群的实时拓扑图,这些对于系统的督察是至极首要的。

  2、集群通讯关系的宏图上升了一个阶段,业务程序员只需要按照模块接口设计提供对应的微服务节点,而不需要关注与其它微服务是哪些协调工作的。而那些微服务咋样“编排”提高到了架构师的工作范围的层级。这明明是对复杂度举行分层隔离很好的一个范例。

  3、运维或者管理人员,通过表二的布置可以很容易地操作集群里的某部微服务下线或者上线。在一个宏大的集群里面,倘诺某类微服务出故障,而CDARF提供了这样一种手段可以去让那类故障微服务下线,将给系统的安澜带来巨大的可靠保证。

  4.、原来集群拥有的报道都布置在一个文书中,在分布式系统中就事关文件的大局一致性的问题。解决的方案或者是,倘使要上线一个新类型的布局文件(新增节点、删除节点、通讯关系转移等等),就要去改进具有在网节点的配置文件。但此时一经新的配备文件有bug,那么可能造成整个集群的故障,并且为了提高某个效用去提高总体集群拥有节点的布局也是极不合理的。在新的方案中,节点的布置只定义节点内的报导和对外提供的微服务名。那么一旦要新增某类别型的微服务,不再需要去革新任何节点的布局,只需要将新节点上线,然后在地点的表一新增微服务名,表二扩充连接关系就可以了。真正做到了增量升级!

 

  未完待续……

 

1. 条件认证

葡京在线开户 7

依据《基于zookeeper+mesos+marathon的docker集群管理平台》的条件,不同处:

  1. 自发现与负载均衡服务由镜像marathon-lb生成的器皿完成,下发到自由1台salve节点;
  1. 抱有salve节点安装keepalived服务做劳务的高可用,vip:10.11.5.145。 

二.部署marathon-lb

1. 准备marathon-lb镜像

#在3个slave节点提前准备镜像,以节省容器部署时间
[root@slave-node1 ~]# docker pull mesosphere/marathon-lb
[root@slave-node1 ~]# docker images

葡京在线开户 8

2. 拓扑编写marathon-lb的json文件

#在任意marathon master节点上编写关于marathon-lb的json文件
[root@master-node1 ~]# vim marathon-lb.json

#”network”采用HOST模式,与宿主机共享namespace;
#”args”参数将3个marathon master节点的ip:8080都带上,即marahon的api接口地址,因为不确定marathon下发marathon-lb容器时,会下发到哪一台宿主机;
#”group”参数为”external”,可以定义多个不同的”group”(即不同的marathon-lb),针对不同的应用可以绑定到不同的”group”;
#请注意json文件的格式,如标点符号等,marathon web下的”JSON Mode”框有检查语法正确与否的功能。
{
  "id":"marathon-lb",
  "cpus": 1,
  "mem": 128,
  "instances": 1,
  "constraints": [["hostname", "UNIQUE"]],
  "container": {
  "type":"DOCKER",
  "docker": {
     "image": "mesosphere/marathon-lb",
     "privileged": true,
     "network": "HOST"
    }
  },
   "args": ["sse", "-m", "http://10.11.4.156:8080", "-m", "http://10.11.4.157:8080", "-m", "http://10.11.4.158:8080", "--group", "external"]
}

3. 下发marathon-lb容器

1)方式1:通过curl调用json配置

#调用保存有json文件的maste节点8080端口下的json文件,即调用marathon的api
[root@master-node1 ~]# curl -X POST http://10.11.4.156:8080/v2/apps -d@/root/marathon-lb.json -H "Content-type:application/json"

2)方式2:通过marathon web下发json配置

葡京在线开户 9

4. 查看marathon-lb

1)marathon web

marathon-lb作为一种长服务,已经发出,运行正常化,如下:

葡京在线开户 10

marathon-lb已发出到slave节点10.11.4.146:31187,如下:

葡京在线开户 11

2)mesos web

mesos
active tasks中体现marathon-lb任务下发成功,如下:

葡京在线开户 12

5. 查看haproxy

1)设置iptables

#marathon-lb生成的haproxy容器映射到宿主机的tcp 9090端口,可以在相应宿主机通过”netstat -tunlp | grep haproxy”查看;
#需要在所有的宿主机,即slave节点放行tcp 9090端口,因为在没有指定特定主机的时候(在slave启动参数中设置机器属性 --attributes=VALUE),通过marathon下发的marathon-lb容器是随机下发到任意slave节点的;
#不重启iptables,如果重启则docker daemon也需要重启,否则iptables相关的docker的forward规则会丢失;或者在没有容器的情况下提前放行相应端口再做容器相关操作
[root@slave-node1 ~]# iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 9090 -j ACCEPT

2)haproxy监控页面

浏览器查看:http://10.11.4.146:9090/haproxy?stats

葡京在线开户 13

另外还有局部haproxy监控页面(ip地址是宿主机,即相应slave节点的ip),如下:

三.验证自动发现与负载均衡

因此部署nginx服务可以证实自动发现与负载均衡两项功用。

1. 编制生成nginx服务的json文件

#在任意marathon master节点上编写json文件
[root@master-node1 ~]# vim marathon-nginx.json

#“labels”中的“HAPROXY_GROUP”,与相关的marathon-lb绑定即可,“group”在下发marathon-lb容器时已经定义;
#“labels”中"HAPROXY_0_VHOST"主要起标签作用;对于web服务可以加上VHOST标签,让marathon-lb设置WEB虚拟主机;标签名字自定义,目的是为了便于区别应用容器,一般可以用业务域名来描述标签;
#"instances",实例数;
#"healthChecks",对应示例健康状态检测点;
#"portMappings"中的"containerPort"是容器应用端口;"hostPort"是映射的宿主机的端口(设置为”0”即随机);"servicePort"是marathon-lb配置的haproxy代理端口(设置为”0”即随机),设置"servicePort"对一组实例服务非常有用;
{
  "id":"web",
  "labels": {
     "HAPROXY_GROUP":"external",
     "HAPROXY_0_VHOST":"web.nginx.com"
  },
  "cpus":0.2,
  "mem":20.0,
  "instances": 2,
  "healthChecks": [{ "path": "/" }],
  "container": {
    "type":"DOCKER",
    "docker": {
     "image": "nginx",
     "network": "BRIDGE",
     "portMappings":[{"containerPort":80,"hostPort":0,"servicePort":0,"protocol":"tcp"}]
    }
  }
}

2. 下发nginx服务

#采用上述方式1下发服务即可;
#nginx镜像已经提前准备
[root@master-node1 ~]# curl -X POST http://10.11.4.156:8080/v2/apps -d@/root/marathon-nginx.json -H "Content-type:application/json"

3. 验证

1)查看marathon&mesoso ui

(1)marathon
ui呈现web服务一度是”Running”状态,且服务名后带标签;

葡京在线开户 14

(2)点击查阅服务的具体信息,”Instances”标签中呈现了2个instance容器部署的slave节点与映射的端口信息(可以在切实的slave节点通过”docker
ps”命令查看),同时健康检查状态正常;

葡京在线开户 15

(3)
“Configuration”标签中有显示服务的现实性部署信息,同json文件,关注标红框的”servicePort”是10002,此服务端口是随机分配的,可经过marathon-lb所在节点的ip+port的章程访问服务,而不是造访单独的某部instance节点提供的劳务;

葡京在线开户 16

(4)mesos
ui显示突显web服务的多少个instance任务已经下发。

葡京在线开户 17

2)访问容器instance提供的劳动

#可以先将2个nginx instance的web页面提前修改;
#如marathon ui展示,1个nginx容器在slave节点10.11.4.146:31005
#在10.11.4.146,即slave-node1节点编写index.html文件,使用”docker cp”将文件覆盖对应容器的默认web站点目录”/usr/share/nginx/html”下的index.html文件
[root@slave-node1 ~]# echo "This is Nginx Server: 10.11.4.146:31005" >> index.html
[root@slave-node1 ~]# docker cp /root/index.html 2c7448e2d185:/usr/share/nginx/html

葡京在线开户 18

#如marathon ui展示,另1个nginx容器在slave节点10.11.4.147:31071;
#10.11.4.147,即slave-node2节点
[root@slave-node2 ~]# echo "This is Nginx Server: 10.11.4.147:31071" >> index.html
[root@slave-node2 ~]# docker cp /root/index.html 11060abfad4f:/usr/share/nginx/html

葡京在线开户 19

3)访问haproxy提供的劳务

(1)访问marathon-lb所在slave节点的10002端口(在marathon
ui服务的configuration可以查询分配的servicePort);

URL:http://10.11.4.146:10002

葡京在线开户 20

葡京在线开户 21

PS:10002端口需要在对应节点不重启iptables的状态下放行,可以举办iptables
-I INPUT -m state –state NEW -m tcp -p tcp –dport 10002 -j
ACCEPT

(2)查看marathon-lb
haproxy的配置;

URL:http://10.11.4.146:9090/_haproxy_getconfig

葡京在线开户 22

PS:或者登陆到marathon-lb容器中查看haproxy.cfg文件(效果同样)。

(3)查看marathon-lb
haproxy的气象页;

URL:http://10.11.4.146:9090/haproxy?stats

葡京在线开户 23

四.keepalived高可用配置

对此marathon-lb或者其后端的real-server来说,对外提供的劳动都依赖marathon-lb容器所在slave节点本身的ip,即便marathon能长久保持服务在线,但对外提供劳务的ip的更动还是内需高可用的安装,那里运用keepalived实现,vip:10.11.4.145。

Keepalived服务需要设置配备在富有marathon-lb可能下发到的slave节点。

1. 安装keepalived

Keepalived服务需要安装配置在颇具marathon-lb可能下发到的slave节点。

keepalived版本:keepalived-1.3.6

葡京在线开户,切切实实的装置步骤请见:http://www.cnblogs.com/netonline/p/7598744.html

PS:注意各keepalived节点之间打招呼拔取组播,iptables需要放行组播或vrrp相关协议。

2. keepalived配置文件

#各slave节点的keepalived配置文件根据情况做微小调整
[root@slave-node1 ~]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost.local
   }
   notification_email_from root@localhost.local
   smtp_server 10.11.4.146
   smtp_connect_timeout 30
   router_id MARATHON_DEVEL
}

vrrp_script chk_marathonlb {
    script "/usr/local/keepalived/etc/chk_marathonlb.sh"
    interval 1
    weight 2          //脚本检测返回值为”0”时,权重上升
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP
    interface br0
    virtual_router_id 201
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 987654
    }
    virtual_ipaddress {
        10.11.4.145
    }
    track_script {
        chk_marathonlb
    }
}

3. marathon-lb检测脚本

#根据配置文件中的配置设定检测脚本
[root@slave-node1 ~]# touch /usr/local/keepalived/etc/chk_marathonlb.sh
[root@slave-node1 ~]# chmod +x /usr/local/keepalived/etc/chk_marathonlb.sh
[root@slave-node1 ~]# vim /usr/local/keepalived/etc/chk_marathonlb.sh

#!/bin/bash
# check if thers is a matathon-lb container running, then this is a keepalived master.
# 2017-09-18 v0.1 

MARATHONLB_LOG="/tmp/marathon-lb.log"

MARATHONLB=`netstat -tunlp | grep "haproxy" | grep ":80" | awk '{print $4}' | awk  'BEGIN{FS=":"} {print $2}'`

#检测marathon-lb服务的80端口,若存在则返回”0”,不存在返回”1”;
#记录日志,非必须项
if [ ${MARATHONLB} -eq 80 ]; then
     echo -e "`date +%F\ %T`: Matathon-lb is here, exit!\n" >> $MARATHONLB_LOG
     exit 0

else
     echo -e "`date +%F\ %T`: Matathon-lb is not here, the keepalived weight will be downgraded." >> $MARATHONLB_LOG
     exit 1
fi

4. 验证

1)启动并查阅vip

#验证过程中,marathon-lb所在的slave1节点宕机,marathon为了保持服务,将marathon-lb重新下发到在salve2节点
[root@slave-node2 ~]# systemctl daemon-reload
[root@slave-node2 ~]# systemctl restart keepalived
[root@slave-node2 ~]# ip a show br0

葡京在线开户 24

2)访问服务

#web服务下的两个instance都被重置过,这里修改新instance容器的index.html文件
[root@slave-node2 ~]# echo "This is Nginx Server: 10.11.4.147:31288" > index.html
[root@slave-node2 ~]# docker cp /root/index.html 9489b51370fd:/usr/share/nginx/html
[root@slave-node2 ~]# echo "This is Nginx Server: 10.11.4.147:31646" > index.html
[root@slave-node2 ~]# docker cp /root/index.html 2aee995a6ce7:/usr/share/nginx/html

(1)访问vip的10002端口;

URL:http://10.11.4.145:10002

葡京在线开户 25

葡京在线开户 26

(2)通过vip访问marathon-lb状态页。

URL:http://10.11.4.145:9090/haproxy?stats

葡京在线开户 27