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 來路由流量。