Registrator+Consul+Consul-template+HaProxy實現動態修改Haproty配置文件

實現需求:

Haproxy做負載均衡,手動方式在配置文件中添加或刪除節點服務器信息,比較麻煩。

通過Registrator收集需要註冊到Consul作爲Haproxy節點服務器的信息,然後註冊到Consul key/value

Consul-templateConsul key/value中讀取信息,然後自動修改Haproxy配置文件,並重載Haproxy。不需要修改haproxy.cfg

集羣環境:

wKioL1ePH8TyP4vwAAA_diaQRtU606.png

PostilMesos集羣搭建過程此處省略


關閉selinux和防火牆

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl stop firewalld && systemctl disable firewalld


ZK-server

容器來做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


宿主機來做consul

下載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


編寫agentserverjson文件

[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:這種啓動方式是註冊到Consulkey/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 image/nginx


進入Consul UI界面查看

http://192.168.200.8:8500/ui/#/dc1/kv/

wKioL1eN2n-BKahmAAAlbgipA10864.png


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 /images /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

wKiom1eN29Ch92f1AAAn-FZu8sk782.png

wKioL1eN29DSwwZMAABEjcHBKnE132.png

wKiom1eN29HBhfyIAAFS6Sq96qE500.png


訪問HaProxy_IP

wKioL1eN2_DwH-usAABMZxBsa6s864.png




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章