19

通过 Consul-Template 实现动态配置Nginx负载服务

 3 years ago
source link: https://segmentfault.com/a/1190000022635324
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 已经通了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK