confd+nginx+etcd实现无感知升级
背景介绍
基于我们现在自己服务的体量,发现使用confd+nginx+etcd+docker
能够满足我们实现无感知升级的需求,且比较轻量。遂,组长让我研究一下confd
。nginx
、ectd
和docker
这里不做过多的介绍,只关注confd
。
无感知原理
假设我们有一个服务起了两个docker
镜像,那么我们把这两个镜像的地址都放在etcd
中,并启动在confd
进行监测。
当我们需要对服务进行升级时,我们可以先在etcd
中删除一个docker
的地址,这样confd
会检测到配置有变动,重新生成新的nginx
配置文件并且重启nginx
。
因为nginx
的重启时间相当短暂,几乎在瞬间完成,所以此时nginx
指向不到已经删除掉的docker
地址,我们可以升级完服务,启动新的docker
,再将新的docker
服务的地址放回etcd
中,剩下的老的docker
服务也以此类推,从而做到无感知升级。
运行环境
centos7
安装confd
- 下载+安装
mkdir -p /opt/confd/bin
mv confd-0.16.0-linux-amd64 /opt/confd/bin/confd
chmod +x /opt/confd/bin/confd
export PATH=”$PATH:/opt/confd/bin”
使用前需要创建相应的配置目录
配置confd
创建配置目录
mkdir -p /etc/confd/{conf.d,templates}
在
/etc/confd/conf.d
下创建配置文件:vim /etc/confd/conf.d/cloud.toml
这个里面是confd生成的nginx配置文件
1 | # etcd中keys的前缀 |
- 在
/etc/confd/templates
下创建模板文件:vim /etc/confd/templates/cloud.conf.tmpl
这个里面是nginx的upstream的模板,被/etc/confd/conf.d/cloud.toml
读取
1 | # upstream指从etcd某个键中读取出来的数据 |
- 修改nginx中的配置
vim /etc/nginx/nginx.conf
1 | http { |
执行生成配置文件
confd -onetime -backend etcd -node http://127.0.0.1:2379 只一次
confd -interval=60 -backend etcd -node http://127.0.0.1:2379 & 按时间轮询
上述俩http地址为etcd的地址,自行替换即可
操作
etcdctl set /cloud/upstream/192.168.0.98_1337 192.168.0.98:1337
接下来,当你在对etcd进行操作的时候,如上,confd会进行轮询,发现有所改动,自动生成nginx的配置文件,并重启nginx
docker化confd
docker启动命令
docker run –name confd –restart=always -v /etc/confd/conf.d/:/etc/confd/conf.d/ -v /etc/confd/templates/:/etc/confd/templates/ -v /etc/nginx/conf.d/:/etc/nginx/conf.d/ –net=host -d confd sh -c “/opt/confd/bin/run.sh ‘10’ ‘http://192.168.0.71:2379' “
10 表示多少秒轮询一次;后面的地址是etcd的地址Dockerfile
1 | FROM nginx:latest |
- run.sh
1 | #!/bin/bash |
—————-华丽的分割线—————-
若未标明转载,本博客内容均为原创。
版权归作者所有,转载请注明出处。
若有帮助(批评指正),还请留言,您的建议是我不断前进的动力