A Service Mesh for Kubernetes (Part 1): Top-Line Service Metrics
原文作者:Alex Leong
原文地址:https://dzone.com/articles/a-service-mesh-for-kubernetes-part-1-top-line-service-metrics
译者微博:@从流域到海域
译者博客:blog.csdn.net/solo95
本文同样刊载于腾讯云+:https://cloud.tencent.com/developer/article/1017111
Kubernetes的Service Mesh(第1部分):Service的重要指标
什么是service mesh,作为专为云设计的应用程序,云平台的应用程序如何使用它?在本文中,我们将向您展示如何在Kubernetes上使用linkerd作为service mesh,以及如何在不需要更改应用程序代码的情况下捕获和报告顶层服务指标(如成功率,请求数量和延迟)。
注意:这是关于linkerd和云原生应用程序的一系列文章的第一部分。在接下来的几周内,我们将介绍:
- 顶层服务指标(本文)
- 以DaemonSet方式运行linkerd
- 加密所有的东西
- 通过流量切换进行连续部署
- Dogfood环境,入口和边缘路由
- 简单轻松的分期微服务
- 如何使 分布式跟踪变得容易
- 使用Linkerd作为入口控制器
- gRPC的乐趣和增益
- 重试预算,截止日期传播,还有如何优雅地失败
- 通过顶层指标自动缩放
我们看到的关于linkerd的最常见的问题之一是,service mesh究竟是什么?而当Kubernetes这样的环境提供诸如服务对象和负载平衡器之类的原语操作时,为什么service mesh是云本地应用程序的关键组件?
简而言之,service是管理应用程序之间(或同一应用程序的各个部分之间的通信,如微服务)之间通信的一个层。在传统的应用程序中,这个逻辑直接构建到应用程序本身中:重试和超时,监视/可见性,跟踪,服务发现等等都被硬编码到每个应用程序中。
然而,随着应用程序架构越来越分散到服务中,将通信逻辑从应用程序转移到底层基础架构变得越来越重要。就像应用程序不应该编写自己的TCP堆栈一样,它们也不应该管理自己的负载平衡逻辑,或者管理自己的服务发现,或者自己的重试和超时逻辑。(例如,请参阅Oliver Gould’s MesosCon talk查看更多关于跨多个服务协调重试和超时的困难。
像linkerd这样的service mesh为大规模运行的多服务应用程序提供了关键功能:
- 基线弹性:重试预算,截止日期,断路。
- Service的重要指标:成功率,请求量和延迟。
- 延迟和容错能力:故障和延迟感知的负载均衡能够在缓慢的或中断的服务实例中进行路由转发。
- 分布式追踪一个a la Zipkin和OpenTracing
- 服务搜寻:定位目标实例。
- 协议升级:在TLS中封装跨网络通信,或将HTTP/1.1转换为HTTP/2.0。
- 路由:在不同版本的服务之间路由请求,在集群之间进行故障转移等。
在本文中,我们将重点关注可见性(visibility):service mesh如何自动捕获和报告服务的成功率等顶层指标。我们将通过Kubernetes的一个简单例子来引导你。
在Kubernetes中使用linkerd进行服务监视
在请求层操作的优点之一是service mesh可以访问成功和失败的协议级语义。例如,如果您正在运行HTTP服务,则linkerd可以读懂200、400、500响应的语义(即HTTP响应的状态码,例如404表示未找到请求的资源,译者注),并且可以自动计算成功率等指标。(当我们谈论重试时,在这一层操作变得更加重要 - 更多关于后面的文章)。
让我们通过一个简单的例子来说明如何在Kubernetes上安装linkerd,以自动获取汇总的顶线服务成功率,而无需更改应用程序。
第1步:安装linkerd
您可以使用这个Kubernetes配置安装linkerd 。这将会把linker安装为运行在Kubernetes默认名称空间中的DaemonSet(即,每个主机有一个实例):
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配置安装两个服务“hello”和“world” 。这将把服务安装到默认的命名空间中:
kubectl apply -f https://raw.githubusercontent.com/linkerd/linkerd-examples/master/k8s-daemonset/k8s/hello-world.yml
这两个服务共同组成一个高度可扩展的“hello world”微服务(其中hello服务自然地称为世界服务来完成它的请求)。
您可以通过linkerd的外部IP发送流量来看到这一点:
http_proxy=$INGRESS_LB:4140 curl -s http://hello
你应该看到“Hello world”,如果一切顺利的话。
第3步:安装linkerd-viz
最后,让我们通过安装linkerd-viz来看看我们的服务正在做什么。linkerd-viz是一个补充包,包括一个简单的Prometheus和Grafana设置,并被配置为自动查找linkerd实例。
使用这个linkerd-viz config来安装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:集群规模的成功率和请求量。
- SERVICE METRICS:部署每个应用程序的一个部分。包括成功率,请求量和延迟。
- PER-INSTANCE METRICS:群集中每个节点的成功率,请求量和延迟。
只需三个简单的命令,我们就可以在我们的Kubernetes集群上安装linkerd,安装一个应用程序,并使用linkerd来了解应用程序服务的健康状况。当然,linkerd提供的不仅仅是可见性:在您看不到的地方,我们启用了延迟感知负载平衡,自动重试和熔断机制,分布式跟踪等等。在本系列的即将发布的文章中,我们将介绍如何利用所有这些功能。
同时,有关在Kubernetes中运行linkerd的更多详细信息,请访问Kubernetes入门指南或跳转到这里!
请继续关注本系列的第2部分:以DaemonSet方式运行linkerd。
(原文第2部分标题:Pods are great, until they’re not, 事实上只字未提Pods,而是讲了DaemenSet,于是参考其中文社区翻译采用了此标题,译者注)