Service Mesh-Linkerd安裝與使用

Service Mesh-Linkerd安裝與使用

前言

Linkerd 做爲一款 service mesh 與kubernetes 結合後主要有如下幾種用法:html

  1. 做爲服務網關,能夠監控 kubernetes 中的服務和實例
  2. 使用 TLS 加密服務
  3. 經過流量轉移到持續交付
  4. 開發測試環境(Eat your own dog food)、Ingress 和邊緣路由
  5. 給微服務作 staging
  6. 分佈式 tracing
  7. 做爲 Ingress controller
  8. 使用 gRPC 更方便

如下咱們着重講解在 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 pipeline

圖片 - Jenkins pipelineapache

Jenkins config

圖片 - 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 已經存在,須要刪除後再運行。

訪問 http://namerd.jimmysong.io

namerd

圖片 - namerd

dtab 保存在 namerd 中,該頁面中的更改不會生效,須要使用命令行來操做。

使用 namerctl 來操做。

$ namerctl --base-url http://namerd-backend.jimmysong.io dtab update internal file

注意:update 時須要將更新文本先寫入文件中。

部署 Linkerd

直接使用 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)

監控 kubernets 中的服務與實例

訪問 http://linkerd.jimmysong.io 查看流量狀況

Outcoming

linkerd監控

圖片 - linkerd監控

Incoming

linkerd監控

圖片 - linkerd監控

訪問 http://linkerd-viz.jimmysong.io 查看應用 metric 監控

linkerd性能監控

圖片 - 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 做爲 Ingress controller

將 Linkerd 做爲 kubernetes ingress controller 的方式跟將 Treafik 做爲 ingress controller 的過程過程徹底同樣,能夠直接參考 邊緣節點配置

架構以下圖所示。

Linkerd ingress controller

圖片 - Linkerd ingress controller

(圖片來自 A Service Mesh for Kubernetes - Buoyant.io)

固然能夠繞過 kubernetes ingress controller 直接使用 linkerd 做爲邊界路由,經過 dtab 和 linkerd 前面的 nginx 來路由流量。

參考

https://github.com/linkerd/linkerd-examples/

A Service Mesh for Kubernetes

dtab

相關文章
相關標籤/搜索