看到这个标题,你可能会问:什么是服务网格?在云服务广泛应用的现在又如何应用?马上我们就会在本文中将向您展示如何在Kubernetes上使用linkerd作为服务网格,以及如何在不更改应用程序代码的情况下收集并报告度量服务质量所需的关键指标(top-level service matrics)(如成功率,请求数量和延迟)。
注意:这是关于linkerd和基于云服务的应用的系列文章中的第一篇,这一系列的文章清单如下:
正如开头所说,我们看到的关于linkerd的最常见的问题之一就是:服务网格究竟是什么?为什么服务网格是基于云服务打造的应用的核心组件?为什么像Kubernetes一样的环境会提供诸如服务对象(service object)和负载均衡之类的原语(pimitives)?
简而言之,服务网格是管理应用通信的中间层(除了不同应用间的通信,也可以同一应用中的不同部分之间的通信,如微服务)。在传统的应用中,很多逻辑是直接构建在应用上的:重试和超时,监视/可见性,跟踪,服务发现(Service Discovery)等等都被硬编码到每个应用中。
然而,随着应用程序架构中越来越多的服务被拆分出来,将通信逻辑从应用上层转移至基础架构的底层也变得越来越重要。就像写应用的时候大家都不会从TCP堆栈写起一样,负载均衡,服务发现管理,重试和超时逻辑也不应该在应用层实现。(如果想深入了解,可以参阅Oliver Gould‘s MesosCon talk其中分享了跨服务场景下重试和超时的困难)
像linkerd这样的服务网格为大规模运行的多服务应用提供了以下关键特性:
在本文中,我们将重点关注可见性:服务网格如何自动收集和报告服务的成功率等关键指标。下面我们将通过Kubernetes快速创建一个简单例子来引导你。
在请求层操作的优点之一是服务网格可以在协议层判断访问成功还是失败。例如,如果你有一个HTTP服务,linkerd可以理解返回玛200,400,500的语义,并根据它自动计算成功率等指标。(当我们谈论重试时,在这一层的操作将变得更加重要 - 具体我们会在后面的文章讲解)。
让我们通过一个简单的例子来说明如何在Kubernetes上安装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
使用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”。
最后,让我们通过安装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仪表板包括三个部分:
只需三个简单的步骤,我们就在我们的Kubernetes集群上安装了linkerd和一个应用,并使用linkerd来监控应用服务的运转状况。当然,linkerd提供的不仅仅是可见性:在底层,我们启用了支持延迟感知的负载均衡,自动重试和断路,分布式跟踪等等。在本系列的文章中,我们将陆续介绍如何利用这些功能。
同时,有关在Kubernetes中运行linkerd的更多详细信息,可以参考Kubernetes入门指南或在linkerd slack进行交流!
请继续关注本系列的第2部分:PODS(Portable On Demand Storage, 便携式按需存储)很棒,怎么多用都不为过。