概述
之前的linkerd示例中,服务发现和路由都集成在一个进程内。如果你的微服务和linkerd部署为sidecar模式,即一个service关联一个linkerd,那么当大规模部署之后,我们想要修改路由规则就是件很麻烦的事情。
默认情况下,配置在linkerd中的dtab(路由规则列表)配合解析器的解析在运行时是无法动态更改的,因此我们可以把这部分功能放到独立的命名解析组件中,则可以实现灵活的动态路由规则调整。
安装namerd组件
1、下载namerd组件
$ wget
https://github.com/linkerd/linkerd/releases/download/1.3.7/namerd-1.3.7-exec
2、重命名并放到linkerd可执行文件相同目录中
$ mv
namerd-1.3.7-exec
\linkerd-1.3.7\namerd
3、修改可执行权限
$ chmod u+x namerd
4、尝试执行
$ ./namerd
...
usage: namerd path/to/config
说明安装成功。
安装namerctl
namerctl是一个运行时调整namerd路由规则的小工具。可以在namerd中动态创建、修改dtab路由规则。我们可以从
https://github.com/linkerd/namerctl
下载对应平台的可执行文件。
1、下载namerctl
$ wget
https://github.com/linkerd/namerctl/releases/download/0.8.6/namerctl_linux_amd64
2、重命名并放到linkerd可执行文件相同目录中
$ mv
namerctl_linux_amd64
\linkerd-1.3.7\namerctl
3、
修改可执行权限
$ chmod u+x namerctl
配置namerd
不同于linkerd,我们下载的namerd只有一个可执行文件,因此我们需要为namerd创建一份配制文件,考虑到示例尽量简单,我们服务发现依旧采用基于文件系统的io.l5d.fs。
1、在config目录下新建namerd.yaml文件
$ vi namerd.yaml
配置内容及解释如下:
# dtab 存储,为了方便我们存储在namerd进程的内存中
storage:
kind: io.l5d.inMemory
# 可配置的服务发现服务,我们用基于文件系统的服务发现
namers:
- kind: io.l5d.fs
rootDir: disco
interfaces:
# 和linkerd 组件通讯并获取规则和服务发现的接口
- kind: io.l5d.thriftNameInterpreter
ip: 0.0.0.0
port: 4290
# 和namerctl通讯的端口
- kind: io.l5d.httpController
ip: 0.0.0.0
port: 4180
启动namerd
1、我们来启动namerd
$ ./namerd config/namerd.yaml
...
serving http on /127.0.0.1:9991
serving io.l5d.thriftNameInterpreter interface on /0.0.0.0:4290
2、访问默认的管理端口9991
至此namerd就配置启动成功了。
配置Linkerd
1、修改linkerd配置
$ vi config\linkerd.yaml
routers:
- protocol: http
#删除或者注释掉dtab配置,路由规则交由namerd处理
# dtab: |
# /svc => /#/io.l5d.fs;
#新增interpreter配置,来关联namerd
interpreter:
#类型选择namerd
kind: io.l5d.namerd
#命名空间,自定义,会和后续用namerctl dtab配置的命名空间对应
namespace: web
#namerd配置中对应的interfaces,负责和namerd通讯
dst: /$/inet/127.0.0.1/4290
2、启动linkerd
$ ./linkerd config\linkerd.yaml
...
serving http admin on /127.0.0.1:9990
serving int on /0.0.0.0:4140
initialized
namerctl动态配置规则
我们现在把命名和规则交给了namerd,因此我们需要在namerd里面配置规则,否则我们访问linkerd,会得到这样的提示:
$ curl -H "Host:test" http://127.0.0.1:4140/
No hosts are available for /svc/test, Dtab.base=[], Dtab.local=[]. Remote Info: Not Available
1、创建规则文件
$ vi config/dtab-config
内容和之前配置在linkerd中的dtab一样,如下:
/svc => /#/io.l5d.fs;
2、namerctl 创建规则,base-url是namerd中配置的namerctl的接口
$./namerctl dtab create web config/dtab-config --base-url http://127.0.0.1:4180
Created web
3、从namerd管理后台查看命名空间及路由规则
4、尝试访问
$ curl -H "Host:test" http://127.0.0.1:4140
It works!
小结
我们配置并启动了一个namerd进程来专门负责命名绑定和服务发现,然后修改linked将它和named关联,最后通过namerctl配置了一个命名空间test,并把规则赋给了namerd。实现了动态路由,我们可以尝试通过namerctl来删除一个命名空间:
$ ./namerctl dtab delete web --base-url http://127.0.0.1:4180
Deleted web
之后访问:
$ curl -H "Host:test" http://127.0.0.1:4140
No hosts are available for /svc/test, Dtab.base=[], Dtab.local=[]. Remote Info: Not Available
因找不到命名空间及其对应的规则配置,无法成功路由到服务提供者了。
后文我们将详解namerd及其相关配置。