Linkerd 使用指南

简介: 前言 该文章已归档到 kubernetes-handbook 第五章【领域应用】中,一切内容以 kubernetes-handbook 为准,该文档可能不会及时更新。 以下内容参考:A Service Mesh for Kubernetes Linkerd 作为一款 service mesh 与k.

前言

该文章已归档到 kubernetes-handbook 第五章【领域应用】中,一切内容以 kubernetes-handbook 为准,该文档可能不会及时更新。


以下内容参考:A Service Mesh for Kubernetes

Linkerd 作为一款 service mesh 与kubernetes 结合后主要有以下几种用法:

  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的功能,详见 边缘节点的配置

准备

安装测试时需要用到的镜像有:

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 目录,并在使用时将配置中的镜像地址修改为你自己的。

部署

首先需要先创建 RBAC,因为使用 namerd 和 ingress 时需要用到。

$ kubectl create -f linkerd-rbac-beta.yml

Linkerd 提供了 Jenkins 示例,在部署的时候使用以下命令:

$ kubectl create -f jenkins-rbac-beta.yml
$ kubectl create -f jenkins.yml

访问 http://jenkins.jimmysong.io

Jenkins pipeline
Jenkins config

注意:要访问 Jenkins 需要在 Ingress 中增加配置,下文会提到。

在 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

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监控

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 作为 Ingress Controller

将 Linkerd 作为 kubernetes ingress controller 的方式跟将 Treafik 作为 ingress controller 的过程过程完全一样,可以直接参考 边缘节点配置

架构如下图所示。

Linkerd ingress controller

(图片来自 A Service Mesh for Kubernetes – Buoyant.io)

当然可以绕过 kubernetes ingress controller 直接使用 linkerd 作为边界路由,通过 dtab 和 linkerd 前面的 nginx 来路由流量。

后记

看了 Linkerd 的官方示例 linkerd-examplesA Service Mesh for Kubernetes 个人感觉两者配合起来讲解的不是很清楚,每个章节不是特别的独立,也不是很有逻辑性。

Linkerd 跟 Istio 一样都是 service mesh,可以在服务间做很多事情,但是 istio 使用起来更加简单灵活,两者的功能基本一样,不过我更倾向于 Istio,因为它更轻量级,不需要在每个节点都部署一个 DaemonSet,并且使用 ingress 也更方便与 kubernetes 集成。

本文转自中文社区-Linkerd 使用指南

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
存储 弹性计算 安全
阿里云数字新基建系列——混合云架构(第2章-1)
阿里云经过12年的发展,以IaaS、PaaS分层为标准的云计算基础技术已经非常成熟,同时围绕这两层的泛网络、泛存储、泛安全等对云计算攸关的技术也起着关键支撑作用。当然,阿里云的核心技术有很多,包括但不限于数据库、大数据、IoT、AI等技术。限于篇幅,本章不会涉及这些内容,后续章节主要是介绍IaaS和PaaS层及相关的泛网络、泛存储、泛安全技术原理。
阿里云数字新基建系列——混合云架构(第2章-1)
|
消息中间件 存储 运维
浅析阿里《云原生架构白皮书》
提前看了《云原生架构白皮书》一直想着要写点东西,拖延来去[《白皮书》](https://developer.aliyun.com/topic/cn-architecture-paper)已经正式发布2天了,我还迟迟没有动手。没动手的一方面原因是我的懒癌症又犯了;另一个原因是《白皮书》覆盖面之广,基本触及到云原生的方方面面,而我在云原生方面的知识储备不足以支撑我写出一篇好文。
6099 0
浅析阿里《云原生架构白皮书》
|
存储 运维 监控
超越传统模型:从零开始构建高效的日志分析平台——基于Elasticsearch的实战指南
【10月更文挑战第8天】随着互联网应用和微服务架构的普及,系统产生的日志数据量日益增长。有效地收集、存储、检索和分析这些日志对于监控系统健康状态、快速定位问题以及优化性能至关重要。Elasticsearch 作为一种分布式的搜索和分析引擎,以其强大的全文检索能力和实时数据分析能力成为日志处理的理想选择。
830 6
|
API 微服务
Traefik 微服务 API 网关教程(全)
Traefik 微服务 API 网关教程(全)
|
监控 应用服务中间件 持续交付
EDAS
【7月更文挑战第27天】
977 9
|
网络协议 网络性能优化 API
TCP或RDMA
【10月更文挑战第1天】TCP或RDMA
637 2
|
存储 网络协议 算法
OSPF基本概念解析:从零开始理解
OSPF基本概念解析:从零开始理解
447 0
|
编译器 C++
【C++】实用编程规范与建议
C++ 相关,比较实用的 防止疏漏出错的编码规范与编码建议
365 0
JAVA——List中剔除空元素(null)的三种方法汇总
JAVA——List中剔除空元素(null)的三种方法汇总
|
弹性计算
阿里云服务器开通全部端口教程
阿里云服务器开通全部端口教程,
2034 0