Consul + Nginx實現自動擴容平臺

    幾個月沒有更新博客了,已經長草了,特意來除草。之前基於nginx反向代理使用的是:nginx + confd + etcd的存儲方式,最近發現部門DBA同事使用consul + redis + 哨兵實現的主從自動選舉切換,不影響業務的方式,還有看到有些公司分享的consul + mha的方式,覺得不錯,於是研究了下consul,本案例是基於consul + consul-template + nginx + flask + mysql構成的。既然consul這麼傳神,我們先來看看consul是什麼:

    consul是HashiCorp公司(曾經開發過vgrant) 推出的一款開源工具, 基於go語言開發, 輕量級, 用於實現分佈式系統的服務發現與配置。 與其他類似產品相比, 提供更“一站式”的解決方案。 consul內置有KV存儲, 服務註冊/發現, 健康檢查, HTTP+DNS API, Web UI等多種功能。官網: https://www.consul.io/其他同類服務發現與配置的主流開源產品有:zookeeper和ETCD。

    

consul的優勢:

1. 支持多數據中心, 內外網的服務採用不同的端口進行監聽。 多數據中心集羣可以避免單數據中心的單點故障, zookeeper和 etcd 均不提供多數據中心功能的支持

2. 支持健康檢查. etcd 不提供此功能.

3. 支持 http 和 dns 協議接口. zookeeper 的集成較爲複雜,etcd 只支持 http 協議. 有DNS功能, 支持REST API

4. 官方提供web管理界面, etcd 無此功能.

5. 部署簡單, 運維友好, go二進制文件解壓即用。批量部署方便


Consul和其他服務發現工具的對比表:

image.png

主要架構:

image.png

架構說明:

  1. Consul Cluster由部署和運行了Consul Agent的節點組成。 在Cluster中有兩種角色:Server和 Client。

  2.  Server和Client的角色和Consul Cluster上運行的應用服務無關, 是基於Consul層面的一種角色劃分.

  3.  Consul Server: 用於維護Consul Cluster的狀態信息, 實現數據一致性, 響應RPC請求。官方建議是: 至少要運行3個或者3個以上的Consul Server。 多個server之中需要選舉一個leader, 這個選舉過程Consul基於Raft協議實現. 多個Server節點上的Consul數據信息保持強一致性。 在局域網內與本地客戶端通訊,通過廣域網與其他數據中心通訊。Consul Client: 只維護自身的狀態, 並將HTTP和DNS接口請求轉發給服務端。

  4.  Consul 支持多數據中心, 多個數據中心要求每個數據中心都要安裝一組Consul cluster,多個數據中心間基於gossip protocol協議來通訊, 使用Raft算法實現一致性


基礎介紹到這裏,下面直接進入我們主題,環境介紹(生產環境建議構建consul server的集羣):

consul:192.168.113.174
nginx:192.168.113.174
反向代理服務器:
192.168.113.175:8080
192.168.113.176:8080

1、consul 與consul-template安裝:

安裝非常容易,到官方https://www.consul.io/downloads.html下載相關包,解壓之後放到/usr/local/bin/ 目錄下即可。


2、啓動一下consul server:

[root@master ~]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul  -bind 0.0.0.0 -client 0.0.0.0 -ui

##然後我們打開一下web:192.168.113.174:8500界面,即可看到相關的服務註冊信息:

image.png


3、下面我們準備一下consul模板,然後再註冊服務。


[root@master ~]# cat item.consul.ctmpl 
{{range services}} {{$name := .Name}} {{$service := service .Name}}
upstream {{$name}} {
  zone upstream-{{$name}} 64k;
  {{range $service}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1;
  {{else}}server 127.0.0.1:65535; # force a 502{{end}}
} {{end}}
{{range services}} {{$name := .Name}}
server {
    listen 80;
    server_name  www.{{$name}}.com;
    index  index.html index.htm index.php;
 
    ## send request back to apache ##
    location / {
        proxy_pass  http://{{$name}};
 
        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}
{{end}}


4、觀察一下nginx的配置信息,首先我們確認下配置文件自目錄下沒有信息:

[root@master conf.d]# pwd
/etc/nginx/conf.d
[root@master conf.d]# ls

5、啓動模板文件:

[root@master ~]# consul-template -consul 127.0.0.1:8500 -template item.consul.ctmpl:default.conf:"/usr/sbin/nginx -s reload"

##根據註冊信息與模板生成一個default.conf的文件,具體語法可以查看相關模板文檔:

[root@master ~]# consul-template -consul 127.0.0.1:8500 -template item.consul.ctmpl:/etc/nginx/conf.d/default.conf:"/usr/sbin/nginx -s reload"


6、往裏面註冊服務信息:

[root@master conf.d]# curl -X PUT http://127.0.0.1:8500/v1/catalog/register -d'{"Datacenter": "dc1", "Node":"tomcat1", "Address":"192.168.113.175","Service": {"Id" :"192.168.113.175:8080", "Service": "tomcat","tags": ["dev"], "Port": 8080}}'
[root@master conf.d]# curl -X PUT http://127.0.0.1:8500/v1/catalog/register -d'{"Datacenter": "dc1", "Node":"tomcat2", "Address":"192.168.113.176","Service": {"Id" :"192.168.113.176:8080", "Service": "tomcat","tags": ["dev"], "Port": 8080}}'

7、web界面我們查看一下是否已經註冊了服務:

image.png


8、看一下配置文件是否已經生成:

upstream tomcat {
  zone upstream-tomcat 64k;
  server 192.168.113.175:8080 max_fails=3 fail_timeout=60 weight=1;
  server 192.168.113.176:8080 max_fails=3 fail_timeout=60 weight=1;
  
} 
 
server {
    listen 80;
    server_name  www.consul.com;
    index  index.html index.htm index.php;
 
    ## send request back to apache ##
    location / {
        proxy_pass  http://consul;
 
        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}
 
server {
    listen 80;
    server_name  www.tomcat.com;
    index  index.html index.htm index.php;
 
    ## send request back to apache ##
    location / {
        proxy_pass  http://tomcat;
 
        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}

9、到這一步似乎已經完成了,不過像這種東西能不能平臺話呢,看一下我構建的平臺添加虛擬主機部分:


image.png


10、添加後端轉發地址:


image.png


11、下面我們把添加的後端地址同步到consul,然後查看一下域名的變化:


image.png


12、看一下web ui我們會發現已經添加了一個域名:

image.png


13、再看一下nginx的配置文件:


image.png


    總結:到此一個簡單的運維管理平臺已經構建完成了,那麼其實我們還能夠在擴展,比如做lvs,haproxy都是可以的,當然基於Docker的也有相關的註冊發現機制,我們可以隨意發揮,要構建一個漂亮的nginx管理平臺,監控必不可少,有時間我們加上圖像再展示。

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