NGINX 平台化管理之ETCD CONFD(1)

作者: admin 分类: 自动化管理 发布时间: 2015-09-21 20:36 ė 6 没有评论
nginx etcd confd

nginx etcd confd

写这篇文章 有2个原因:
一:先说说我为什么要这样做,主要是我没想好我如果又有DOCKER,又有物理机 云主机等 我这个配置怎么推送,难道都SALT,在容器里装SALT/PUPPET或者开SSH感觉好奢侈啊,而且NGINX里面有很多代理地址 快速上1000个容器 NGINX中得upstream地址也是SALT推?这感觉不舒服。看DOCKER的时候看到了服务发现ETCD和CONFD 我觉的这个方法应该不错,试验了下 个人感觉管理配置起来很方便,如果把持续集成和这个ETCD CONFD在结合到一起 可以方便快速批量部署,而且不需要操心服务配置,有开发能力自己写个WEB页面,在WEB中自己填写,NGINX服务器批量自动加载你填入的配置(我感觉其他服务也都可以)感觉爽爽的。可能是我书读的少!个人觉的这个方法确实不错。
二:好久没更新BLOG了,这个文章我大部分是借鉴前辈的,但是经过加入自己的思想 个人认为改良的更帅气了,欢迎呻吟!

不说废话进入配置阶段:
刚才已经说过了 不管是传统服务器还是DOCKER服务器 均通用,并且可一起负载使用

我是测试配置 一个机器或者一个容器也行

软件阶段 ETCD+CONFD
ETCD的用途主要是我觉的就是个存储仓库
配置如下,这个ETCD你在哪个容器或者机器上配置都可以 无限制(我直接抄刘天斯的配置了):

# mkdir -p /home/install && cd /home/install
         # wget https://github.com/coreos/etcd/releases/download/v0.4.6/etcd-v0.4.6-linux-amd64.tar.gz
         # tar -zxvf etcd-v0.4.6-linux-amd64.tar.gz
         # cd etcd-v0.4.6-linux-amd64
         # cp etcd* /bin/
         # mkdir /data/etcd
         # /bin/etcd -version
           etcd version 0.4.6

启动ETCD:

# /bin/etcd -name etcdserver -peer-addr 10.10.0.1:7001 -addr 10.10.0.1:4001 -data-dir /data/etcd -peer-bind-addr 0.0.0.0:7001 -bind-addr 0.0.0.0:4001 &

由于etcd具备多机支持,参数“-peer-addr”指定与其它节点通讯的地址;参数“-addr”指定服务监听地址;参数“-data-dir”为指定数据存储目录。
由于etcd是通过REST-API方式进行交互,常见操作如下
设置(set) key操作

 # curl -L http://127.0.0.1:4001/v2/keys/domain/www.linuxqq.com/server/com1 -XPUT -d value="10.10.0.1"
          {"action":"set","node":{"key":"/domain/www.linuxqq.com/server/com1","value":"10.10.0.1","modifiedIndex":28,"createdIndex":28}}

获取(get) key信息

 # curl -L http://127.0.0.1:4001/v2/keys/domain/www.linuxqq.com/server/com1
{"action":"get","node":{"key":"/domain/www.linuxqq.com/server/com1","value":"10.10.0.1","modifiedIndex":28,"createdIndex":28}}

删除key信息

 # curl -L http://127.0.0.1:4001/v2/keys/domain/www.linuxqq.com/server/com1 -XDELETE         {"action":"delete","node":{"key":"/domain/www.linuxqq.com","modifiedIndex":29,"createdIndex":28},"prevNode":{"key":"/domain/www.linuxqq.com/server/com1","value":"10.10.0.1","modifiedIndex":28,"createdIndex":28}}

更多操作API见https://github.com/coreos/etcd/blob/master/Documentation/api.md。

NGINX配置我就直接忽略 yum或者apt 安装即可

安装confd (CONFD和NGINX必须安装在一个机器上,NGINX机器上都必须装CONFD,很轻量)

#wget https://github.com/kelseyhightower/confd/releases/download/v0.6.3/confd-0.6.3-linux-amd64
#mv confd /usr/local/bin/confd
#chmod +x /usr/local/bin/confd
#/usr/local/bin/confd -version
confd 0.6.2

启动confd及NGINX服务
下面为启动Confd服务命令行,参数“interval”为指定探测etcd的频率,单位为秒,参数“-node”为指定etcd监听服务主地址。

  # /usr/local/bin/confd -verbose -interval 10 -node '127.0.0.1:4001' -confdir /etc/confd > /var/log/confd.log &
# /etc/init.d/nginx start

创建CONFD配置文件目录

# mkdir -p /etc/confd/{conf.d,templates}
# vi /etc/confd/conf.d/default.toml 添加如下配置
   [template]
    src = "default.tmpl"
    dest = "/etc/nginx/conf.d/cluster.conf"
    keys = [
     "/domain",
    ]

#vi /etc/confd/templates/default.tmpl  添加如下配置
{{range $dir :=lsdir "/domain/"}}
{{$lsdir := printf "/domain/%s/server" $dir}}
{{range ls $lsdir}}
{{$cusdir :=printf "/domain/%s/server/*" $dir}}
upstream {{base $dir}}{
ip_hash;
{{range gets $cusdir}}
    server {{.Value}} weight=12 max_fails=10 fail_timeout=30;
{{end}}
}
{{$cusdir :=printf "/domain/%s/configure" $dir}}
{{with get $cusdir}}
server {
    value: {{.Value}}
}
{{end}}
{{end}}
{{end}}

这个时候我们执行如下命令,几秒后NGINX的配置自动出来,如果你删除这些KEY,配置也将自动删除。能保持库和配置文件的一致性

curl -L http://127.0.0.1:4001/v2/keys/domain/www.linuxqq.com/server/com1 -XPUT -d value="10.10.0.1"
curl -L http://127.0.0.1:4001/v2/keys/domain/www.linuxqq.com/server/com2 -XPUT -d value="10.10.0.2"
curl -L http://127.0.0.1:4001/v2/keys/domain/www.linuxqq.com/server/net1 -XPUT -d value="20.20.0.1"
curl -L http://127.0.0.1:4001/v2/keys/domain/www.linuxqq.com/server/net2 -XPUT -d value="20.20.0.2"​
curl -L http://127.0.0.1:4001/v2/keys/configure/www.linuxqq.com/configure -XPUT -d value="listen 81%3b
server_name www.linuxqq.com%3blocation / {
        proxy_pass   www.linuxqq.com%3b
        proxy_set_header Host      $http_host%3b
        proxy_set_header X-Real-IP $remote_addr%3b
    }
"
curl -L http://127.0.0.1:4001/v2/keys/domain/www.linuxqq.com/configure -XPUT -d value="listen 81%3b
server_name www.linuxqq.com%3blocation / {
        proxy_pass   www.linuxqq.com%3b
        proxy_set_header Host      $http_host%3b
        proxy_set_header X-Real-IP $remote_addr%3b
    }
"

这个时候打开你的NGINX配置文件查看
vi /etc/nginx/conf.d/cluster.conf
111

我把NGINX一大段参数也当成配置,主要也是为了平台管理考虑,我只需要在WEB页面中输入配置,NGINX就会自动RELOAD,如果配置有问题,RELOAD也是无法成功,并且错误的配置也无法写入到配置文件中,特别提示:etcd 如果用CURL上传配置里面的特殊符号都需要用URL编码 例如; 就需要转变成%3b 才可以正常PUT到库里

confd 模板语法配置简介 Confd模板引擎采用了Go语言的文本模板,更多见http://golang.org/pkg/text/template/
1、base
作为path.Base函数的别名,获取路径最后一段。

{{ with get "/app/servers/prickly_blackwell"}}
    server {{base .Key}} {{.Value}} check
{{end}}
prickly_blackwell 192.168.1.22:49162

2、get
返回一对匹配的KV,找不到则返回错误。

{{with get "/app/servers/prickly_blackwell"}}
    key: {{.Key}}
    value: {{.Value}}
   {{end}}
   /app/servers/prickly_blackwell 192.168.1.22:49162

3、gets
返回所有匹配的KV,找不到则返回错误。

{{range gets "/app/servers/*"}}
    {{.Key}} {{.Value}}
     {{end}}
    /app/servers/backstabbing_rosalind 192.168.1.22:49156  
    /app/servers/cocky_morse 192.168.1.22:49158  
    /app/servers/goofy_goldstine 192.168.1.22:49160  
    /app/servers/prickly_blackwell 192.168.1.22:49162

4、getv
返回一个匹配key的字符串型Value,找不到则返回错误。

{{getv "/app/servers/cocky_morse"}}
            192.168.1.22:49158

5、getvs
返回所有匹配key的字符串型Value,找不到则返回错误。

 {{range getvs "/app/servers/*"}}
           value: {{.}}
        {{end}}
        value: 192.168.1.22:49156  
        value: 192.168.1.22:49158  
        value: 192.168.1.22:49160  
         value: 192.168.1.22:49162

6、split
对输入的字符串做split处理,即将字符串按指定分隔符拆分成数组。

    {{ $url := split (getv "/app/servers/cocky_morse") ":" }}
          host: {{index $url 0}}
          port: {{index $url 1}}
          host: 192.168.1.22  
          port: 49158

7、ls
返回所有的字符串型子key,找不到则返回错误。

{{range ls "/app/servers/"}}
   subkey: {{.}}
{{end}}
   subkey: backstabbing_rosalind  
   subkey: cocky_morse  
   subkey: goofy_goldstine  
   subkey: prickly_blackwell

8、lsdir
返回所有的字符串型子目录,找不到则返回一个空列表。

{{range lsdir "/app/"}}
   subdir: {{.}}
{{end}}
subdir: servers

我借鉴如下地址中内容:blog.liuts.com/post/242/
xiaorui.cc/2015/01/25/confd%E5%92%8Cetcd%E5%AE%9E%E7%8E%B0%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86%E5%8F%8A%E8%87%AA%E5%8A%A8%E5%8F%91%E7%8E%B0/

github.com/kelseyhightower/confd/blob/master/docs/templates.md

此文章为连载小说,下一集将登场WEB平台的CODE

本文出自 小Q,转载时请注明出处及相应链接。

本文永久链接: http://www.linuxqq.com/archives/1480.html

0
更多
Ɣ回顶部