Linkerd 做为一款 service mesh 与kubernetes 结合后主要有如下几种用法:html
如下咱们着重讲解在 kubernetes 中如何使用 linkerd 做为 kubernetes 的 Ingress controller,并做为边缘节点代替 Traefik 的功能,详见 边缘节点的配置。前端
安装测试时须要用到的镜像有:node
buoyantio/helloworld:0.1.4 buoyantio/jenkins-plus:2.60.1 buoyantio/kubectl:v1.4.0 buoyantio/linkerd:1.1.2 buoyantio/namerd:1.1.2 buoyantio/nginx:1.10.2 linkerd/namerctl:0.8.6 openzipkin/zipkin:1.20 tutum/dnsutils:latest
这些镜像能够直接经过 Docker Hub 获取,我将它们下载下来并上传到了本身的私有镜像仓库 sz-pg-oam-docker-hub-001.tendcloud.com
中,下文中用到的镜像皆来自个人私有镜像仓库,yaml 配置见 linkerd 目录,并在使用时将配置中的镜像地址修改成你本身的。nginx
首先须要先建立 RBAC,由于使用 namerd 和 ingress 时须要用到。git
$ kubectl create -f linkerd-rbac-beta.yml
Linkerd 提供了 Jenkins 示例,在部署的时候使用如下命令:github
$ kubectl create -f jenkins-rbac-beta.yml $ kubectl create -f jenkins.yml
访问 http://jenkins.jimmysong.iodocker
图片 - Jenkins pipelineapache
图片 - Jenkins configjson
注意:要访问 Jenkins 须要在 Ingress 中增长配置,下文会提到。api
在 kubernetes 中使用 Jenkins 的时候须要注意 Pipeline 中的配置:
def currentVersion = getCurrentVersion() def newVersion = getNextVersion(currentVersion) def frontendIp = kubectl("get svc l5d -o jsonpath=\"{.status.loadBalancer.ingress[0].*}\"").trim() def originalDst = getDst(getDtab())
frontendIP
的地址要配置成 service 的 Cluster IP ,由于咱们没有用到LoadBalancer。
须要安装 namerd,namerd 负责 dtab 信息的存储,固然也能够存储在 etcd、consul中。dtab 保存的是路由规则信息,支持递归解析,详见 dtab。
流量切换主要是经过 dtab 来实现的,经过在 HTTP 请求的 header 中增长 l5d-dtab
和 Host
信息能够对流量分离到 kubernetes 中的不一样 service 上。
遇到的问题
Failed with the following error(s) Error signal dtab is already marked as being deployed!
由于该 dtab entry 已经存在,须要删除后再运行。
图片 - namerd
dtab 保存在 namerd 中,该页面中的更改不会生效,须要使用命令行来操做。
使用 namerctl 来操做。
$ namerctl --base-url http://namerd-backend.jimmysong.io dtab update internal file
注意:update 时须要将更新文本先写入文件中。
直接使用 yaml 文件部署,注意修改镜像仓库地址。
# 建立 namerd $ kubectl create -f namerd.yaml # 建立 ingress $ kubectl create -f linkerd-ingress.yml # 建立测试服务 hello-world $ kubectl create -f hello-world.yml # 建立 API 服务 $ kubectl create -f api.yml # 建立测试服务 world-v2 $ kubectl create -f world-v2.yml
为了在本地调试 linkerd,咱们将 linkerd 的 service 加入到 ingress 中,详见 边缘节点配置。
在 Ingress 中增长以下内容:
- host: linkerd.jimmysong.io http: paths: - path: / backend: serviceName: l5d servicePort: 9990 - host: linkerd-viz.jimmysong.io http: paths: - path: / backend: serviceName: linkerd-viz servicePort: 80 - host: l5d.jimmysong.io http: paths: - path: / backend: serviceName: l5d servicePort: 4141 - host: jenkins.jimmysong.io http: paths: - path: / backend: serviceName: jenkins servicePort: 80
在本地/etc/hosts
中添加以下内容:
172.20.0.119 linkerd.jimmysong.io 172.20.0.119 linkerd-viz.jimmysong.io 172.20.0.119 l5d.jimmysong.io
测试路由功能
使用 curl 简单测试。
单条测试
$ curl -s -H "Host: www.hello.world" 172.20.0.120:4141 Hello (172.30.60.14) world (172.30.71.19)!!%
请注意请求返回的结果,表示访问的是 world-v1
service。
$ for i in $(seq 0 10000);do echo $i;curl -s -H "Host: www.hello.world" 172.20.0.120:4141;done
使用 ab test。
$ ab -c 4 -n 10000 -H "Host: www.hello.world" http://172.20.0.120:4141/ This is ApacheBench, Version 2.3 <$Revision: 1757674 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 172.20.0.120 (be patient) Completed 1000 requests Completed 2000 requests Completed 3000 requests Completed 4000 requests Completed 5000 requests Completed 6000 requests Completed 7000 requests Completed 8000 requests Completed 9000 requests Completed 10000 requests Finished 10000 requests Server Software: Server Hostname: 172.20.0.120 Server Port: 4141 Document Path: / Document Length: 43 bytes Concurrency Level: 4 Time taken for tests: 262.505 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2210000 bytes HTML transferred: 430000 bytes Requests per second: 38.09 [#/sec] (mean) Time per request: 105.002 [ms] (mean) Time per request: 26.250 [ms] (mean, across all concurrent requests) Transfer rate: 8.22 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 36 51 91.1 39 2122 Processing: 39 54 29.3 46 585 Waiting: 39 52 20.3 46 362 Total: 76 105 96.3 88 2216 Percentage of the requests served within a certain time (ms) 50% 88 66% 93 75% 99 80% 103 90% 119 95% 146 98% 253 99% 397 100% 2216 (longest request)
访问 http://linkerd.jimmysong.io 查看流量状况
Outcoming
图片 - linkerd监控
Incoming
图片 - linkerd监控
访问 http://linkerd-viz.jimmysong.io 查看应用 metric 监控
图片 - linkerd性能监控
测试在 http header 中增长 dtab 规则。
$ curl -H "Host: www.hello.world" -H "l5d-dtab:/host/world => /srv/world-v2;" 172.20.0.120:4141 Hello (172.30.60.14) earth (172.30.94.40)!!
请注意调用返回的结果,表示调用的是 world-v2
的 service。
另外再对比 ab test 的结果与 linkerd-viz
页面上的结果,能够看到结果一致。
可是咱们可能不想把该功能暴露给全部人,因此能够在前端部署一个 nginx 来过滤 header 中的 l5d-dtab
打头的字段,并经过设置 cookie 的方式来替代 header 里的 l5d-dtab
字段。
$ http_proxy=http://172.20.0.120:4141 curl -s http:/hello Hello (172.30.60.14) world (172.30.71.19)!!
将 Linkerd 做为 kubernetes ingress controller 的方式跟将 Treafik 做为 ingress controller 的过程过程彻底同样,能够直接参考 边缘节点配置。
架构以下图所示。
图片 - Linkerd ingress controller
(图片来自 A Service Mesh for Kubernetes - Buoyant.io)
固然能够绕过 kubernetes ingress controller 直接使用 linkerd 做为边界路由,经过 dtab 和 linkerd 前面的 nginx 来路由流量。