etcd nginx 容器_Etcd+Confd实现Nginx配置文件自动管理
一、需求
我們使用Nginx做七層負載均衡,后端是Tomcat。項目采用灰度發布方式,每次項目升級,都要手動先從Nginx下摘掉一組,然后再升級這組,當項目快速迭代時,手動做這些操作顯然會增加部署時間,于是就想通過腳本實現自動化管理Nginx配置文件。
當時考慮自己寫Shell腳本對Nginx配置文件操作,需要用到sed流編輯器,sed本身沒有條件判斷語句,并不能靈活判斷配置文件中要添加/刪除位置,因此會增加配置錯誤風險。
在查資料無意間發現confd能自動管理配置文件,通過模板渲染生成配置文件,避免了配置錯誤風險,覺得挺好,就實驗了下,于是就有了本章博文。
二、架構圖
三、涉及軟件
etcd:分布式KV存儲系統,一般用于共享配置和服務注冊與發現。是CoreOS公司發起的一個開源項目。 ETCD存儲格式類似于文件系統,以根"/"開始下面一級級目錄,最后一個是Key,一個key對應一個Value。
etcd集群:使用Raft協議保證每個節點數據一致,由多個節點對外提供服務。這里只用單臺。
confd:管理本地應用配置文件,使用etcd或consul存儲的數據渲染模板,還支持redis、zookeeper等。
confd有一個watch功能,通過HTTP API定期監測對應的etcd中目錄變化,獲取最新的Value,然后渲染模板,更新配置文件。
四、部署
環境說明:CentOS7,IP 192.168.1.99 # 為了試驗服務都安裝這臺上。
4.1 下載軟件包
4.2?安裝Nginx并啟動#?yum?install?-y?gcc?gcc-c++?make?openssl-devel?pcre-devel
#?useradd?nginx?-s/sbin/nologin
#?wget?http://nginx.org/download/nginx-1.10.3.tar.gz
#?tar?zxvf?nginx-1.10.3.tar.gz
#?cd?nginx-1.10.3
#?./configure--prefix=/usr/local/nginx?--user=nginx?--group=nginx?--with-http_ssl_module--with-http_gzip_static_module?--with-http_realip_module--with-http_stub_status_module
#?make?&&?make?install
獨立出來虛擬主機:
#?mkdir?/usr/local/nginx/conf/vhost
#?vi?/usr/local/nginx/conf/nginx.conf?#?在http{}段中末尾添加包含虛擬主機配置文件
http?{
includevhost/*.conf;
}
#?/usr/local/nginx/sbin/nginx??#?啟動Nginx
4.3 安裝etcd并啟動#?tar?zxvf?etcd-v3.1.4-linux-amd64.tar.gz
#?mv?etcd?etcdctl?/usr/bin/??#?etcd提供封裝好的包,直接使用即可
#?nohup?etcd--data-dir?/var/lib/data.etcd?--listen-client-urls?http://192.168.1.99:2379--advertise-client-urls?http://192.168.1.99:2379?&>/var/log/etcd.log?&
4.4 安裝confd
confd也是一個封裝好的包,直接使用即可。#?mv?confd-0.11.0-linux-amd64?/usr/bin/confd
key規劃:
keyvalue
/nginx/www/server_name域名
/nginx/www/upstream/server01節點01
/nginx/www/upstream/server02節點02
/nginx/www/upstream/server03節點03
創建配置目錄#?mkdir?-p?/etc/confd/{conf.d,templates}
conf.d????#?資源模板,下面文件必須以toml后綴
templates?#?配置文件模板,下面文件必須以tmpl后綴
創建資源模板#?vi?/etc/confd/conf.d/app01.conf.toml
[template]
src?=?"app01.conf.tmpl"????#?默認在/etc/confd/templates目錄下
dest?=?"/usr/local/nginx/conf/vhost/app01.conf"??#?要更新的配置文件
keys?=?[
"/nginx",????????????#?監測的key
]
reload_cmd?="/usr/local/nginx/sbin/nginx?-s?reload"???#?最后執行的命令
創建Nginx配置文件模板#?vi?/etc/confd/templates/app01.conf.tmpl
upstream?www.{{getv?"/nginx/www/server_name"}}?{
{{range?getvs?"/nginx/www/upstream/*"}}
server?``.``;
`end`
}
server?{
server_name??www.{{getv?"/nginx/www/server_name"}};
location?/?{
proxy_pass???????http://www.{{getv??"/nginx/www/server_name"}};
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;
}
}
博客地址:http://lizhenliang.blog.51cto.com
QQ群:323779636(Shell/Python運維開發群)
五、測試
使用etcdctl客戶端操作etcd,常用的幾個選項如下:USAGE:
etcdctl?[global?options]?command?[command?options]?[arguments...]
COMMANDS:
ls??????????retrieve?a?directory
get?????????retrieve?the?value?of?a?key
set?????????set?the?value?of?a?key
rm??????????remove?a?key?or?a?directory
GLOBAL?OPTIONS:
--peers,?-C?????a?comma-delimited?list?of?machine?addresses?in?the?cluster?(default:?"http://127.0.0.1:2379,http://127.0.0.1:2379")
5.1 向etcd添加k/v#?etcdctl?-C?http://192.168.1.99:2379?set?domain.com
domain.com
#?etcdctl?-C?http://192.168.1.99:2379?set?/nginx/www/upstream/server01?"192.168.1.10:80"
192.168.1.10:80
#?etcdctl?-C?http://192.168.1.99:2379?set?/nginx/www/upstream/server02?"192.168.1.11:80"
192.168.1.11:80
5.2 啟動confd監測etcd中的keys
當你啟動后,confd就會從etcd獲取key的值并填充到Nginx配置文件模板,并更新到/usr/local/nginx/conf/vhost/app01.conf,并nginx reload。
5.3 近一步測試
向etcd中/nginx/www/upstream/再添加一個節點:
OK!這樣就實現了自動管理Nginx配置文件,無感知加入后端節點。
六、etcd Rest API使用curl?-X?PUT?http://192.168.1.99:2379/v2/keys/test/a_key?-d?value="789"??#?增改key
curl?-X?DELETE?http://192.168.1.99:2379/v2/keys/test/a_key?????#?刪除key
curl?http://192.168.1.99:2379/v2/keys/test/a_key?????????????????#?查詢key的值
curl?-X?PUT?http://192.168.1.99:2379/v2/keys/dir?-d?dir=true???#?創建目錄
curl?http://192.168.1.99:2379/v2/keys?????????????#?查看所有keys
curl?-X?PUT?http://192.168.1.99:2379/v2/keys/ttlvar?-d?value="ttl_value"?-d?ttl=10?#?創建過期時間的key,單位秒
curl?http://192.168.1.99:2379/version?????????????#?查看etcd版本
curl?http://192.168.1.99:2379/v2/members????????????#?列出所有集群成員
curl?http://192.168.1.99:2379/v2/stats/leader?????????#?查看leader
curl?http://192.168.1.99:2379/v2/stats/self???????????#?節點自身信息
curl?http://192.168.1.99:2379/v2/stats/store??????????#?查看集群運行狀態
七、總結
總體來說,etcd+confd要比自己寫腳本管理Nginx配置文件更方便!當然,增加一套組件也會增加一點運維成本。
當初始化一臺Web節點,可以增加一步操作去把自己信息注冊到etcd,從而實現自動加入節點。
如果應用在生產環境,有些功能需要更加完善些,比如向etcd添加數據用Rest API或者用Python封裝接口,confd寫一個后臺進程腳本運行等。
如果線上已經有redis或者zookeeper的話,那么就可以直接作為k/v存儲信息,而不需要再搭建一套etcd集群!
由于keys的每次更新confd都會Nginx reload,在高并發訪問量會有一點影響,比較好的解決方案就是寫lua去動態加載Nginx參數。但應付中小規模還是可以的!
由此看來,confd不但局限管理Nginx配置文件,對于其他應用軟件也是可以的,比如Haproxy,LVS等。
confd使用文檔:
資源模板其他參數:
總結
以上是生活随笔為你收集整理的etcd nginx 容器_Etcd+Confd实现Nginx配置文件自动管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php fckeditor demo,如
- 下一篇: VS2019 配色_这个双11,凯里-欧