阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

基于etcd+confd通过Nginx对Docker服务混合注册发现详解

151次阅读
没有评论

共计 7058 个字符,预计需要花费 18 分钟才能阅读完成。

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

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

基于 etcd+confd 通过 Nginx 对 Docker 服务混合注册发现详解

根据业务情况,要解决如下几个问题:

1、nginx 负载均衡的混合注册,使得 nginx 可以混合负载多个业务;

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

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

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

5、权限问题如何处理,怎么做,如果任何人知道 ip 和端口就可以注册,那么服务就垮了。

一、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,创建过程如下:

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,先看下注册后的结果:

基于 etcd+confd 通过 Nginx 对 Docker 服务混合注册发现详解

然后我再继续注册第二个服务,对应命令如下:
etcdctl set /service_sgin/subdomain/service2  “www.service2.com  page.service2.com”
etcdctl set  /service_sgin/upstream/service2/server1  192.168.1.2

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

基于 etcd+confd 通过 Nginx 对 Docker 服务混合注册发现详解

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

/etc/confd/conf.d/nginx.conf.toml
[template]
prefix = “/service_sgin”  #此配置对应 etcd 的默认目录
src = “https://www.linuxidc.com/Linux/2017-03/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}}
}

二、不同机房如何在同一 etcd 集群上进行注册,如何规划
  这个其实看起来复杂,实施起来非常简单,为了节省资源,不可能每个机房都对应建 etcd 集群,这个时候就可以复用 etcd 集群,比如北显和亦庄机房的注册,可以使用改变默认 etcd 键值目录来实现:
prefix = “/service_sgin_bx”
prefix  =  “/service_sgin_yz”

三、confd 更新频率如何周期可控制,k/ v 每有变化实时触发 reload 太敏感,况且每个容器要注册多个 k /v,在整体注册完之前,是不需要 reload 的
  这个同样,看起来复杂,其实 confd 改一下模式就能实现,不要用 watch 模式,改而周期性去探测 etcd 的键值变化,比如说 2 秒探测一次,对应启动时的命令如下:
./confd -backend=”etcd” -node=10.211.103.151:2379 -interval=2

四、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

五、权限问题的处理
对于权限有两种方式,一个是证书,一个是账号,业务本就跑到内网,再加之账号的配合是灵活迅速的,就从账号着手了,对于 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  #查看某个用户下的规则

备注:1、guest 用户的规则是 guest,默认是全部权限;
    2、confd 是以访客 guest 身份监控 k / v 的,对应的规则就是 guest;

后附:etcd 的集群配置,扩容
    假设初始化 3 台 etcd 分别是 10.211.103.152、10.211.103.153、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

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/142224.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计7058字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中