實現需求:javascript
用Haproxy作負載均衡,手動方式在配置文件中添加或刪除節點服務器信息,比較麻煩。css
經過Registrator收集須要註冊到Consul做爲Haproxy節點服務器的信息,而後註冊到Consul key/value。java
Consul-template去Consul key/value中讀取信息,而後自動修改Haproxy配置文件,並重載Haproxy。不須要修改haproxy.cfg。linux
集羣環境:nginx
Postil:Mesos集羣搭建過程此處省略redis
關閉selinux和防火牆docker
setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config systemctl stop firewalld && systemctl disable firewalld
ZK-serverjson
容器來作consul: 獲取Consul-server鏡像 [root@zk-server ~]# docker pull docker.io/gliderlabs/consul-server 啓動Consul-server [root@zk-server ~]# docker run -d --name=consul --net=host docker.io/gliderlabs/consul-server -bootstrap -bind=192.168.200.8
宿主機來作consulbootstrap
下載consul包,並解壓後端
[root@zk-server ~]# wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_386.zip [root@zk-server ~]# unzip consul_0.6.4_linux_386.zip [root@zk-server ~]# mv consul /usr/bin/
下載consul-template包,並解壓
[root@zk-server ~]# wget https://releases.hashicorp.com/consul-template/0.15.0/consul-template_0.15.0_linux_386.zip [root@zk-server ~]# unzip consul-template_0.15.0_linux_386.zip [root@zk-server ~]# mv consul-template /usr/bin/
安裝HaProxy並啓動
[root@zk-server ~]# yum -y install haproxy [root@zk-server ~]# systemctl start haproxy
建立consul服務器配置目錄
[root@zk-server ~]# mkdir /config
編寫agent和server的json文件
[root@zk-server ~]# vi /config/agent.json 添加內容以下: { "client_addr": "0.0.0.0", "data_dir": "/data", "leave_on_terminate": true, "dns_config": { "allow_stale": true, "max_stale": "1s" } } [root@zk-server ~]# vi /config/server.json 添加內容以下: { "ui": true, "dns_config": { "allow_stale": false } }
啓動consul單節點服務器,固然,你consul服務器節點多的話也能夠作consul集羣。
[root@zk-server ~]# consul agent -server -config-dir=/config -bootstrap -bind=192.168.200.8 &
Postil:可用consul members 查看consul集羣節點
Slave1-server
獲取Registrator鏡像
[root@slave1 ~]# docker pull gliderlabs/registrator:latest
啓動Registrator
Postil:這種啓動方式是註冊到Consul的key/value
[root@slave1 ~]# docker run -d --restart=always --name=registrator --net=host --volume=/var/run/docker.sock:/tmp/docker.sock docker.io/gliderlabs/registrator -ip 192.168.200.10 consulkv://192.168.200.8:8500/hello
Postil:-ip後面跟registration 所屬的主機 IP, 必定要設置此屬性, 不然服務IP會顯示爲127.0.0.1
測試Registrator是否把本機容器註冊到Consul key/value
啓動個容器
[root@slave1 ~]# docker run -d -P --name=test --net=bridge p_w_picpath/nginx
進入Consul UI界面查看
http://192.168.200.8:8500/ui/#/dc1/kv/
ZK-server
建立consul配置目錄
[root@zk-server ~]# mkdir -p /data/cfg/consul [root@zk-server ~]# vi /data/cfg/consul/tmpl.json 添加內容以下: consul = "127.0.0.1:8500" template { source = "/etc/haproxy/haproxy.ctmpl" destination = "/etc/haproxy/haproxy.cfg" command = "systemctl reload haproxy" }
編寫haproxy模版
[root@zk-server ~]# vi /etc/haproxy/haproxy.ctmpl 添加內容以下: global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend main *:80 acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app backend static balance roundrobin server static 127.0.0.1:4331 check backend app balance roundrobin {{range $key, $pairs := tree "hello/" | byKey}}{{range $serverid, $pair := $pairs}} server app ``.`Value` check inter 2000 fall 3 weight 1 `end``end`
啓動consul-template
[root@zk-server ~]#consul-template -config /data/cfg/consul/tmpl.json > consul-template.out 2>&1 &
用marathon啓動一個nginx容器,看registrator是否註冊到consul,而後看consul-template是否自動添加了這個後端服務器到/etc/haproxy/haproxy.cfg
訪問HaProxy_IP