天天看點

通過 Consul-Template 實作動态配置Nginx負載服務

【轉載請注明出處】: https://developer.aliyun.com/article/760145

Consul-Template簡介

Consul-Template是基于Consul的自動替換配置檔案的應用。在Consul-Template沒出現之前,大家建構服務發現系統大多采用的是Zookeeper、Etcd+Confd這樣類似的系統。

Consul官方推出了自己的模闆系統Consul-Template後,動态的配置系統可以分化為Etcd+Confd和Consul+Consul-Template兩大陣營。Consul-Template的定位和Confd差不多,Confd的後端可以是Etcd或者Consul。

Consul-Template提供了一個便捷的方式從Consul中擷取存儲的值,Consul-Template守護程序會查詢Consul執行個體來更新系統上指定的任何模闆。當更新完成後,模闆還可以選擇運作一些任意的指令。

Consul-Template的使用場景

Consul-Template可以查詢Consul中的服務目錄、Key、Key-values等。這種強大的抽象功能和查詢語言模闆可以使Consul-Template特别适合動态的建立配置檔案。例如:建立Apache/Nginx Proxy Balancers、Haproxy Backends、Varnish Servers、Application Configurations等。

Consul-Template特性

  • Quiescence:Consul-Template内置靜止平衡功能,可以智能的發現Consul執行個體中的更改資訊。這個功能可以防止頻繁的更新模闆而引起系統的波動。
  • Dry Mode:不确定目前架構的狀态,擔心模闆的變化會破壞子系統?無須擔心。因為Consul-Template還有Dry模式。在Dry模式,Consul-Template會将結果呈現在STDOUT,是以操作員可以檢查輸出是否正常,以決定更換模闆是否安全。
  • CLI and Config:Consul-Template同時支援指令行和配置檔案。
  • Verbose Debugging:即使每件事你都做的近乎完美,但是有時候還是會有失敗發生。Consul-Template可以提供更詳細的Debug日志資訊。

項目位址:

https://github.com/hashicorp/consul-template

Consul-Template安裝

Consul-Template和Consul一樣,也是用Golang實作。是以具有天然可移植性(支援 Linux、windows 和macOS)。安裝包僅包含一個可執行檔案。Consul-Template安裝非常簡單,隻需要下載下傳對應系統的軟體包并解壓後就可使用。

這裡以Linux系統為例:

$ wget https://releases.hashicorp.com/consul-template/0.18.3/consul-template_0.18.3_linux_amd64.zip
$ unzip consul-template_0.18.3_linux_amd64.zip
$ mv consul-template /usr/local/bin/           

其它系統版本可在這裡下載下傳:

https://releases.hashicorp.com/consul-template/

Consul-Template常用指令

-consul-auth=<username[:password]>      設定基本的認證使用者名和密碼。
-consul-addr=<address>                  設定Consul執行個體的位址。
-max-stale=<duration>                   查詢過期的最大頻率,預設是1s。
-dedup                                  啟用重複資料删除,當許多consul template執行個體渲染一個模闆的時候可以降低consul的負載。
-consul-ssl                             使用https連接配接Consul。
-consul-ssl-verify                      通過SSL連接配接的時候檢查證書。
-consul-ssl-cert                        SSL用戶端證書發送給伺服器。
-consul-ssl-key                         用戶端認證時使用的SSL/TLS私鑰。
-consul-ssl-ca-cert                     驗證伺服器的CA憑證清單。
-consul-token=<token>                   設定Consul API的token。
-syslog                                 把标準輸出和标準錯誤重定向到syslog,syslog的預設級别是local0。
-syslog-facility=<facility>             設定syslog級别,預設是local0,必須和-syslog配合使用。
-template=<template>                    增加一個需要監控的模闆,格式是:'templatePath:outputPath(:command)',多個模闆則可以設定多次。
-wait=<duration>                        當呈現一個新的模闆到系統和觸發一個指令的時候,等待的最大最小時間。如果最大值被忽略,預設是最小值的4倍。
-retry=<duration>                       當在和consul api互動的傳回值是error的時候,等待的時間,預設是5s。
-config=<path>                          配置檔案或者配置目錄的路徑。
-pid-file=<path>                        PID檔案的路徑。
-log-level=<level>                      設定日志級别,可以是"debug","info", "warn" (default), and "err"。
-dry                                    Dump生成的模闆到标準輸出,不會生成到磁盤。
-once                                   運作consul-template一次後退出,不以守護程序運作。           

Consul-Template使用執行個體

在進行以下測試前,你首先得有一個Consul叢集。如果你還沒有,可搭建一個,當然單節點Consul環境也是可以的。

下面就以動态配置nginx為例來說明,還需要提前啟動好一個端口是8090的tomcat服務、安裝好Nginx。

1、先向Consul注冊服務

curl -X PUT http://127.0.0.1:8500/v1/catalog/register -d '{"Datacenter": "dc1","Node": "tomcat1","Address": "127.0.0.1","Service": { "Id": "127.0.0.1:8090", "Service": "api_tomcat1","tags": [ "dev" ],"Port": 8090}}'           

檢視注冊的資訊

curl -X GET http://127.0.0.1:8500/v1/catalog/service/api_tomcat1           

2、準備Nginx啟動腳本

start_nginx.sh

#!/bin/sh
ps -ef |grep nginx |grep -v grep |grep -v .sh
if [ $? -ne 0 ]; then
 nginx;
 echo "nginx start"
else
 nginx -s reload;
 echo "nginx reload"
fi           

3、在Nginx配置目錄

/etc/nginx/conf.d/

準備一個空配置檔案

test-consul-template.conf

4、編寫Nginx配置檔案模闆

nginx.conf.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 down; # force a 502{{end}}
} {{end}}

server {
  listen 80 default_server;

{{range services}} {{$name := .Name}}
  location /{{$name}} {
    proxy_pass http://{{$name}};
  }
{{end}}

}
           

模闆的文法可以參考官網

https://github.com/hashicorp/consul-template#templating-language

5、使用配置檔案的方式啟動Consul-Template

編輯配置檔案

nginx.hcl

consul {
  address = "127.0.0.1:8500"
}

template {
  source = "nginx.conf.ctmpl"
  destination = "/etc/nginx/conf.d/test-consul-template.conf"
  command = "./start_nginx.sh"
}           

6、啟動Consul-Template

consul-template -config "nginx.hcl"           

7、測試

請求

http://127.0.0.1/api_tomcat/info

已經通了。