Kubernetes的服务网格(第1部分):获取关键的服务指标

看到这个标题,你可能会问:什么是服务网格?在云服务广泛应用的现在又如何应用?马上我们就会在本文中将向您展示如何在Kubernetes上使用linkerd作为服务网格,以及如何在不更改应用程序代码的情况下收集并报告度量服务质量所需的关键指标(top-level service matrics)(如成功率,请求数量和延迟)。

注意:这是关于linkerd和基于云服务的应用的系列文章中的第一篇,这一系列的文章清单如下:

  1. 获取关键的服务指标(本文)
  2. PODS(Portable On Demand Storage, 便携式按需存储)很棒,怎么多用都不为过
  3. 对所有的内容进行加密
  4. 通过流量转移实现持续部署
  5. Dogfood环境,入口(ingress)和边界路由(edge routing)
  6. 渐进式微服务
  7. 让分布式跟踪变得容易
  8. 用Linkerd作为入口控制器
  9. 为了乐趣与提升,尝试一下gRPC吧
  10. 自动重试,期限传播(deadline propagation)与优雅降级
  11. 根据关键指标实现弹性伸缩

正如开头所说,我们看到的关于linkerd的最常见的问题之一就是:服务网格究竟是什么?为什么服务网格是基于云服务打造的应用的核心组件?为什么像Kubernetes一样的环境会提供诸如服务对象(service object)和负载均衡之类的原语(pimitives)?

简而言之,服务网格是管理应用通信的中间层(除了不同应用间的通信,也可以同一应用中的不同部分之间的通信,如微服务)。在传统的应用中,很多逻辑是直接构建在应用上的:重试和超时,监视/可见性,跟踪,服务发现(Service Discovery)等等都被硬编码到每个应用中。

然而,随着应用程序架构中越来越多的服务被拆分出来,将通信逻辑从应用上层转移至基础架构的底层也变得越来越重要。就像写应用的时候大家都不会从TCP堆栈写起一样,负载均衡,服务发现管理,重试和超时逻辑也不应该在应用层实现。(如果想深入了解,可以参阅Oliver Gould‘s MesosCon talk其中分享了跨服务场景下重试和超时的困难)

像linkerd这样的服务网格为大规模运行的多服务应用提供了以下关键特性:

  • 基线弹性:支持重试预计算,超时处理,通信链路的断开。
  • 记录关键服务指标:成功率,请求量和延迟。
  • 延迟和容错能力:支持故障和延迟感知的负载均衡可以通过路由绕过缓慢或中断的服务实例。
  • 分布式追踪Zipkin OpenTracing
  • 服务发现:查找目标实例。
  • 协议升级:使用TLS封装跨网络通信,将HTTP / 1.1切换至HTTP / 2.0。
  • 路由:支持将请求路由至不同版本的服务,在集群之间进行故障转移等。

在本文中,我们将重点关注可见性:服务网格如何自动收集和报告服务的成功率等关键指标。下面我们将通过Kubernetes快速创建一个简单例子来引导你。

在Kubernetes中使用linkerd监控服务情况

在请求层操作的优点之一是服务网格可以在协议层判断访问成功还是失败。例如,如果你有一个HTTP服务,linkerd可以理解返回玛200,400,500的语义,并根据它自动计算成功率等指标。(当我们谈论重试时,在这一层的操作将变得更加重要 - 具体我们会在后面的文章讲解)。

让我们通过一个简单的例子来说明如何在Kubernetes上安装linkerd,在不更改应用的情况下自动获取汇总关键服务的成功率。

第1步:安装linkerd

使用这个Kubernetes配置来安装linkerd 。这会linkerd作为DaemonSet安装(即每个主机对应一个实例)并运行在Kubernetes默认的命名空间:

kubectl apply -f https://raw.githubusercontent.com/linkerd/linkerd-examples/master/k8s-daemonset/k8s/linkerd.yml

您可以通过查看linkerd的管理页面来确认安装是否成功:

INGRESS_LB = $(kubectl get svc l5d -o jsonpath ="{.status.loadBalancer.ingress [0].*}")
open http://$INGRESS_LB:9990

第2步:安装示例应用

使用hello-world config安装两个服务“hello”和“world” 。这两个服务将被安装到默认的命名空间中:

kubectl apply -f https://raw.githubusercontent.com/linkerd/linkerd-examples/master/k8s-daemonset/k8s/hello-world.yml

这两个服务将共同组成一个高度可扩展的“hello world”微服务(hello服务通过调用world服务来完成一次请求流程)。

可以设定通过linkerd的外部IP发送流量来观察请求的动作:

http_proxy = $INGRESS_LB:4140 curl  -s http://hello

你应该会看到字符串“Hello world”。

第3步:安装linkerd-viz

最后,让我们通过安装linkerd-viz来观察我们服务的运行情况。linkerd-viz是一个扩展包,其中包括实现自动查找linkerd实例所需的Prometheus、Grafana的配置。

使用其中的配置来安装linkerd-viz。这会将linkerd-viz安装到默认的命名空间中:

kubectl apply -f https://raw.githubusercontent.com/linkerd/linkerd-viz/master/k8s/linkerd-viz.yml

打开linkerd-viz的外部IP来查看仪表板页面:

VIZ_INGRESS_LB = $(kubectl get svc linkerd-viz -o jsonpath ="{.status.loadBalancer.ingress [0].*}")
open http://$VIZ_INGRESS_LB

您应该看到一个仪表板界面,包括服务和实例的选择器。所有图表都会根据你选择的服务和实例进行进行展示:

linkerd-viz仪表板包括三个部分:

  • 整体指标(TOP LINE):整个集群的成功率和请求量。
  • 服务指标:部署的每个应用的指标。包括成功率,请求量和延迟。
  • 每个实例的指标:集群中每个节点的成功率,请求量和延迟。

只需三个简单的步骤,我们就在我们的Kubernetes集群上安装了linkerd和一个应用,并使用linkerd来监控应用服务的运转状况。当然,linkerd提供的不仅仅是可见性:在底层,我们启用了支持延迟感知的负载均衡,自动重试和断路,分布式跟踪等等。在本系列的文章中,我们将陆续介绍如何利用这些功能。

同时,有关在Kubernetes中运行linkerd的更多详细信息,可以参考Kubernetes入门指南或在linkerd slack进行交流!

请继续关注本系列的第2部分:PODS(Portable On Demand Storage, 便携式按需存储)很棒,怎么多用都不为过。

本文的版权归 ArrayZoneYour 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大葡萄元元

开发一款app从PHP到API接口

答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发。(别去纠结 GTK、WinBinder)

4621
来自专栏大魏分享(微信公众号:david-share)

实战派 | 不讲理论讲实战,现场耍一耍openshift | 容器在企业中的应用

“如果将现在主流IT技术比作武林的各项武功,那么将Oenshift比喻成天龙八部的中六脉神剑,一点也不为过。” 前言 在2017年1月11日,红帽举办了Op...

3264
来自专栏杨建荣的学习笔记

跨网络拷贝文件的简单实践(r3笔记第67天)

在实际的项目中可能要访问生产环境是需要各种安全验证和设置的,毕竟客户的数据是最宝贵的资源。一般来说,客户会把一部分访问的权限开放出来。这样在系统出现问题的时候,...

3407
来自专栏CSDN技术头条

携程开源Redis多数据中心解决方案XPipe

Redis在携程内部得到了广泛的使用,根据客户端数据统计,整个携程全部Redis的读写请求在每秒200W,其中写请求约每秒10W,很多业务甚至会将Redis当成...

4529
来自专栏机器学习算法与Python学习

Python中常用的一些架构

在各种语言平台中,python涌现的web框架恐怕是最多的,是一个百花齐放的世界,各种micro-framework、framework不可胜数;猜想原因应该是...

5384
来自专栏重庆的技术分享区

创建一个微服务?首先回答这10个问题

原文地址:https://articles.microservices.com/creating-a-microservice-answer-these-10-...

2882
来自专栏匠心独运的博客

过来人的经验,谈谈一致性处理方案—分布式事务(DTS)

传统事务是使用数据库自身的事务属性(ACID),而数据库自身的事务属性是局限于当前实例,不能实现跨库。而对于大型分布式/微服务集群系统中,不仅存在着跨库的事务,...

3854
来自专栏阮一峰的网络日志

网站的无密码登录

大部分网站,都要求用户登录。 常见的做法,是让用户注册一个账户。 ? 这种做法并不让人满意。 对于用户来说,每个网站必须记住一个密码,非常麻烦;对于开发者来说,...

6256

使用Node.js构建API网关

当微服务架构中的服务被外部的客户端访问时,可以共享有关身份验证和传输的一些常见请求。API网关提供了一个共享层去处理服务协议之间的差异,同时满足特定客户端(像P...

3899

使用IBM云功能构建无服务器应用程序

在Serverlessconf一文中,IBM宣布了IBM云服务器的一项新功能(作为IBM Research预览版)。使用新的工具Composer,可以创建包含多...

2179

扫码关注云+社区

领取腾讯云代金券