Linkerd实战(2)示例详解

概述
我们用一个step by step的基本示例来动手搭建一个linkerd代理。

服务提供方
为了简化示例,我们以ubuntu上的ngnix为例,搭建一个最基本的http服务作为服务提供方。
sudo apt-get install nginx

修改/var/www/html/index.html 内容为
It works!

我们来访问一下服务。

服务调用方
为了简化示例,我们采用http协议,因此服务调用方用curl替代。

$ curl http://127.0.0.1/
It works!

安装Linkerd
1、从github下载Linkerd,我们选用1.3.7版本,链接如下:
$ wget https://github.com/linkerd/linkerd/releases/download/1.3.7/linkerd-1.3.7.tgz

2、解压
$ tar zxf linkerd-1.3.7.tgz
之后,看到目录如下

config配置文件:linkerd.yaml
disco本地服务发现配置:web
docs文档:
linkerd-1.3.7-exec可执行文件
logs日志文件

3、重命名及可执行权限
$ mv linkerd-1.3.7.tgz linkerd
$ chmod u+x linkerd

4、尝试执行
$ ./linkerd
...
usage: linkerd path/to/config
看到最后一行显示说明安装成功。

配置服务发现
在disco目录下新建文件test
$ vi test
内容
127.0.0.1<空格>80

来实现将“test”服务名映射为具体的服务地址端口127.0.0.1:80

启动Linkerd
执行下面的命令
$ ./linkerd config/linkerd.yaml

测试访问
我们用curl模拟访问

$ curl -H "Host: test" http://localhost:4140/
It works!
详解
例子跑起来了,为什么要-H 访问,为什么要添加Http Header,4140又是什么端口? 接下来我们详解上面的示例配置及流程,以便对整个示例有个清晰的了解。

端口
我们来看看config目录下的配置文件linkerd.yaml:
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.fs;
servers:
- port: 4140
ip: 0.0.0.0

定义了一个http协议的路由器,在端口4140提供代理服务。
因此我们可以直接访问代理服务端口,或者通过http proxy来将流量转到linkerd,稍后我们来演示使用代理的场景。

路由
Linkerd最核心的事情就是路由,在Linked中,路由经过了有序的三个阶段:
Identification/识别 > binding/绑定 > Resolution/解析
Linkerd实战(2)示例详解_第1张图片
识别
识别将服务调用方的原始请求转换为一个字符串,我们称作 service name,这个字符串随后将和这次请求关联,作为这次请求路由的标识往后传递。

在http1.1协议中,默认情况下识别会采用类型为io.l5d.header.token的识别器。这个识别器又默认会使用Http Header中键为Host的值来作为service name。再加上路由默认固定的前缀 dstPrefix的值 /svc
在三个默认值的作用下,我们的请求:
curl -H "Host: test" http://localhost:4140/
被转换为:
/svc/test

绑定
有了service name之后,我们进入第二个流程——绑定。绑定由dtab(delegation table/委托表的简称)转换而成。 绑定阶段舒服的字符串叫 client name。client name 是 replica set/副本集的名称,通常是服务发现条目的名称。与service name 不同,client name 通常包含集群,区域和/或环境等细节。
在当前示例中,配置文件的dtab配置如下:
/svc => /#/io.l5d.fs;
因此我们的 /svc/test 被转换为:
/#/io.l5d.fs/test

client names 通常以 /$ or /# 开头. 
以 /$ 开头的 client name 表示应该加载 classpath 中的 namer 来绑定该名称,而以 /# 开头的 client name 表示加载 linkerd 配置中的 namer 来绑定该名称。
例如,我们的client name /#/io.l5d.fs/test 说明使用配置的io.l5d.serversets namer 查找 /test。
类似地,client name /$/inet/test/8080 意味要为 inet namer 的搜索classpath。通过对 "test" 进行 DNS 查找并使用端口8080,该 namer 获取一组地址。
绑定是linkerd最灵活的一个转换过程,灰度、限流、蓝绿都是基于dtab来实现。
解析
有了client name之后,linkerd会通过namer配置,定位到合适的解析器来将client name转换为对应的一组服务提供者ip:port。通常这部分工作由服务发现组件完成,例如:consul,zookeeper等。在示例中我们使用了linkerd自带的用于开发测试的服务发现:文件系统disco。
我们来看一下配置文件:
namers:
- kind: io.l5d.fs
rootDir: disco
指定了服务发现类型为:io.l5d.fs,支持文件系统服务发现。disco目录配置为服务发现注册的根目录。大家可以看到可以跟我们的client name /#/io.l5d.fs/test关联上。还记得我们在disco目录下创建的test文件么,里面的内容是服务提供者的ip:port。具体流程如下:
1、根据client name /#/io.l5d.fs/test,寻找namer中基于配置的服务发现解析器 io.l5d.fs
2、服务发现解析器 io.l5d.fs从client name 解析出 /test,然后在自己的服务注册配置里面搜索test
配置,并提取出127.0.0.1:80。

自此整个从service name 到client name再到服务发现解析目标地址工作完成,linkerd将请求转发到正确的目的地ngnix,经由ngnix处理之后返回It works!

配置
config\linkerd.yaml
namers:
- kind: io.l5d.fs
rootDir: disco
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.fs;
httpAccessLog: logs/access.log
label: int
servers:
- port: 4140
ip: 0.0.0.0

disco\test
127.0.0.1 80


你可能感兴趣的:(linkerd)