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

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

461次阅读
没有评论

共计 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、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7982853
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...