基于etcd+confd经过nginx对docker服务混合注册发现详解

  先简单说下业务逻辑,etcd是一个分部式k/v存储系统,confd是一个对etcd的key或者目录作变化监控的软件,并配有相关语法,能够将变化的k/v处理后造成配置文件,nginx不用多说了,作docker容器的负载均衡流量调度。node

  在业务过程当中,docker容器健康起来后,会经过接口向etcd注册相关k/v信息,confd检测到etcd的k/v变化后,当即触发程序经过模板造成新的nginx配置文件,先作离线语法测试,若是没问题就覆盖原配置,进而reload,测试不经过就不覆盖原配置,整个过程是安全可控的。在容器注册到nginx的upstream后,nginx会对容器作健康检查发现,若是正常,则分发流量过去。对应的业务流程图以下:nginx

wKioL1jR9SGwQOthAAF-cP-4rNY162.png

根据业务状况,要解决以下几个问题:git

  一、nginx负载均衡的混合注册,使得nginx能够混合负载多个业务;github

  二、不一样机房如何在同一etcd集群上进行注册,如何规划;docker

  三、confd更新频率如何周期可控制,k/v每有变化实时触发reload太敏感,何况每一个容器要注册多个k/v,在总体注册完以前,是不须要reload的;api

  四、confd启动时如何关联多个etcd的地址,保证高可用;安全

  五、权限问题如何处理,怎么作,若是任何人知道ip和端口就能够注册,那么服务就垮了。bash

1、nginx负载均衡的混合注册,使得nginx能够混合负载多个业务域名容器服务器

   先分析下nginx作负载均衡时的配置文件,分析后注册时的变化因子主要有3个,1是server_name的域名,2是upstream的名称,3是upstream里的server,这三个元素就决定了不一样的注册服务。有了这个思路后,设计confd对应的nginx的模板文件,先简单说下confd,confd能够直接下载二进制包,不存在安装的问题,配置好path后直接使用命令,在使用中默认读取/etc/confd下的conf.d和templates下两个目录的配置,对应github是https://github.com/coreos/etcd ,建立过程以下:app

mkdir -p /etc/confd/{conf.d,templates}

   而后在conf.d下建立.toml配置文件,在templates下建立.tmpl模板文件。

   根据nginx的3个元素去分析规划k/v规则,优化后发现注册一个服务要添加两个健值,并用etcdctl命令进行模拟测试,注册第一个服务以下:

etcdctl set /service_sgin/subdomain/service1  "www.service1.com"
etcdctl set /service_sgin/upstream/service1/server1 192.168.1.1

其中service1是对应业务名称,"www.service1.com"是域名,192.168.1.1对应是server,先看下注册后的结果:

wKioL1jQ8mSzWC7rAABMApx55SI444.png

而后我再继续注册第二个服务,对应命令以下:

etcdctl set /service_sgin/subdomain/service2  "www.service2.com  page.service2.com"
etcdctl set  /service_sgin/upstream/service2/server1  192.168.1.2

注册后配置文件截图以下:

wKioL1jQ8sax-P3qAACD4MWXxJs880.png 

  要的就是这个效果,另外加了一个默认的server,当过来没有符合业务的域名,直接302到某个业务地址,好了剖开看confd的两个概要配置以下:

/etc/confd/conf.d/nginx.conf.toml

[template]
prefix = "/service_sgin"   #此配置对应etcd的默认目录
src = "nginx.conf.tmpl"    #对应templates下的模板文件
dest = '/usr/local/nginx/conf/nginx.conf'   #对应nginx的配置文件
owner = "root"
mode = "0666"
keys = [
  "/upstream",   #监控的键值目录
  "/subdomain",  #监控的键值目录
]
check_cmd = "/usr/local/nginx/sbin/nginx -t -c ``.`src`"   #检测到变化后的测试
reload_cmd = "/usr/local/nginx/sbin/nginx -s reload"       #配置文件没问题后的reload

/etc/confd/templates/nginx.conf.tmpl

user root;
worker_processes auto;
worker_cpu_affinity auto;
pid   logs/nginx.pid;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#error_log_bind 192.168.1.31;
worker_rlimit_nofile 512000;
events {
    use epoll;
    worker_connections  20480;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    resolver 127.0.0.1 valid=10m;
    sendfile        on;
    keepalive_timeout  65s;
    proxy_next_upstream error timeout;
    proxy_buffering on;
    proxy_buffer_size 8k;
    proxy_buffers 32 4k;
######################对应upstream的模板部分################
{{range $sub := ls "/subdomain"}}
    upstream {{base $sub}} {
{{$subdir := printf "/upstream/%s/*" $sub}}{{range getvs $subdir}}
        server ``.``; `end`
        keepalive_timeout 65s;
    }
`end`
#############################################################
    server {
        listen 80 backlog=65535 default;
        server_name localhost;
        location / {
                rewrite ^/(.*)$ http://www.sina.cn redirect;
               }
            }
#####################对应server的模板部分####################
{{range gets "/subdomain/*"}}
    server {
        listen  80;
        server_name  ``.`Value`;
        location / {
                proxy_pass              http://{{base .Key}};
                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;
          }
    }
`end`
}

2、不一样机房如何在同一etcd集群上进行注册,如何规划

  这个其实看起来复杂,实施起来很是简单,为了节省资源,不可能每一个机房都对应建etcd集群,这个时候就能够复用etcd集群,好比北显和亦庄机房的注册,可使用改变默认etcd键值目录来实现:

prefix = "/service_sgin_bx" 
prefix  =  "/service_sgin_yz"

3、confd更新频率如何周期可控制,k/v每有变化实时触发reload太敏感,何况每一个容器要注册多个k/v,在总体注册完以前,是不须要reload的

  这个一样,看起来复杂,其实confd改一下模式就能实现,不要用watch模式,改而周期性去探测etcd的键值变化,好比说2秒探测一次,对应启动时的命令以下:

./confd -backend="etcd" -node=10.211.103.151:2379 -interval=2

4、confd启动时如何关联多个etcd的地址,保证高可用

  一样,只要修改下confd的启动命令便可,让confd监控更多node,我目前的etcd有3个node,所有监控进去以下:

./confd -backend="etcd" -node=10.211.103.151:2379 -node=10.211.103.152:2379 -node=10.211.103.153:2379 -interval=2

5、权限问题的处理

 对于权限有两种方式,一个是证书,一个是帐号,业务本就跑到内网,再加之帐号的配合是灵活迅速的,就从帐号着手了,对于etcd的权限,主要是经过用户、规则来管理的,将用户和规则对应起来就是用户的权限,默认安装后是不开启权限的,整理后相关的权限操做以下:

用户管理:

etcdctl user add root:123   #加root用户,开启权限必须先加
etcdctl auth enable         #权限管理开启
etcdctl --username root:123 user list       #查看用户
etcdctl --username root:123 user remove test_user       #删除用户

role规则管理:

etcdctl --username root:123 role add test_role          
etcdctl --username root:123 role grant --path "/*"  --rw  test_role      #加权限
etcdctl --username root:123 role revoke --path "/*" --write test_role    #减权限
etcdctl --username root:123 role remove test_role       
etcdctl --username root:123 role list
etcdctl --username root:123 role get test_role

用户规则管理:

etcdctl --username root:123 user add test_user:123
etcdctl --username root:123 user grant --roles test_role   test_user  #加规则
etcdctl --username root:123 user revoke  --roles test_role test_user  #减规则
etcdctl --username root:123 user get test_user  #查看某个用户下的规则


备注:一、guest用户的规则是guest,默认是所有权限;

    二、confd是以访客guest身份监控k/v的,对应的规则就是guest;


后附一:etcd的集群配置,扩容

    假设初始化3台etcd分别是10.211.103.15二、10.211.103.15三、10.211.103.154,etcd下载下来就能够用,主要是如何配置启动,分别再三台机器上编写以下启动脚本etcdnew.sh,而后依次启动便可:

10.211.103.152服务器:

#/bin/sh
#writer:gaolixu
/usr/local/etcd/etcd --name etcd152 --data-dir /data1/etcd \
--initial-advertise-peer-urls http://10.211.103.152:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://10.211.103.152:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster etcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380 \
--initial-cluster-state new  &

10.211.103.153服务器:

#/bin/sh
#writer:gaolixu
/usr/local/etcd/etcd --name etcd153 --data-dir /data1/etcd \
--initial-advertise-peer-urls http://10.211.103.153:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://10.211.103.153:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster etcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380 \
--initial-cluster-state new   &

10.211.103.154服务器:

#/bin/sh
#writer:gaolixu
/usr/local/etcd/etcd --name etcd154 --data-dir /data1/etcd \
--initial-advertise-peer-urls http://10.211.103.154:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://10.211.103.154:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster etcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380 \
--initial-cluster-state new  &

启动后能够看到集群成员和健康状况以下:

wKioL1jR3JPyAj14AABQ_MYz7rs055.png

添加、删除etcd集群节点操做:

好比添加10.211.103.151节点

etcdctl member add etcd151 http://10.211.103.151:2380

执行命令后会有提示,而后再151上编写以下脚本etcdadd.sh:

#/bin/sh
#writer:gaolixu
/usr/local/etcd/etcd --name etcd151 --data-dir /data1/etcd \
--initial-advertise-peer-urls http://10.211.103.151:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://10.211.103.151:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380,etcd151=http://10.211.103.151:2380,etcd152=http://10.211.103.152:2380 \
--initial-cluster-state existing   &

删除节点的话执行以下命令:

etcdctl member remove cf5e47596c46611a #经过etcdctl member list 查看到id

后附2:etcd的api 2和api 3的转换及confd的使用转换

1、etcd经过环境变量的调整来修改

export ETCDCTL_API=2   #api2版本
export ETCDCTL_API=3   #api3版本

2、confd经过监控时的参数修改

下载二进制文件直接使用: https://github.com/bacongobbler/confd/releases

-backend etcdv3  即 etcd api v3
-backend etcd    即 etcd api v2

自建我的原创站运维网咖社(www.net-add.com),新的博文会在网咖社更新,欢迎浏览

相关文章
相关标签/搜索