本文发布已超过一年。较旧的文章可能包含过时的内容。请检查页面上的信息自发布以来是否已变得不正确。

Linkerd 2.0 实践

Linkerd 2.0 最近已宣布正式发布 (GA),标志着它已为生产环境做好准备。在本教程中,我们将引导您在几秒钟内完成在 Kubernetes 集群上启动并运行 Linkerd 2.0 的过程。

但首先,Linkerd 是什么?为什么您应该关心它?Linkerd 是一种服务边车,它可以增强 Kubernetes 服务,为运行时调试、诊断和可靠性提供零配置仪表板和 UNIX 风格的 CLI 工具。Linkerd 也是一个服务网格,应用于集群中的多个(或所有)服务,以在它们之间提供统一的遥测、安全和控制层。

Linkerd 的工作原理是在服务的每个 pod 中安装超轻量代理。这些代理将遥测数据报告给控制平面,并从控制平面接收信号。这意味着使用 Linkerd 不需要任何代码更改,甚至可以在正在运行的服务上实时安装。Linkerd 是完全开源的,采用 Apache v2 许可证,并由云原生计算基金会托管(就像 Kubernetes 本身一样!)

事不宜迟,让我们看看您可以在 Kubernetes 集群上多快地运行 Linkerd。在本教程中,我们将引导您完成在任何 Kubernetes 1.9+ 集群上部署 Linkerd 的过程,以及如何使用它来调试示例 gRPC 应用程序中的故障。

步骤 1:安装演示应用程序 🚀

在安装 Linkerd 之前,让我们首先将一个名为 Emojivoto 的基本 gRPC 演示应用程序安装到您的 Kubernetes 集群上。要安装 Emojivoto,请运行

curl https://run.linkerd.io/emojivoto.yml | kubectl apply -f -

此命令下载 Emojivoto 的 Kubernetes 清单,并使用 kubectl 将其应用于您的 Kubernetes 集群。Emojivoto 由在“emojivoto”命名空间中运行的多个服务组成。您可以通过运行以下命令查看这些服务

kubectl get -n emojivoto deployments

您还可以通过运行以下命令实时查看应用程序

minikube -n emojivoto service web-svc --url # 如果您使用的是 minikube

… 或

kubectl get svc web-svc -n emojivoto -o jsonpath="{.status.loadBalancer.ingress[0].*}" #

… 如果您在其他地方

随意点击浏览。您可能会注意到应用程序的某些部分已损坏!如果您查看本地的 Kubernetes 仪表板,您不会看到任何有趣的内容---就 Kubernetes 而言,应用程序运行良好。这是一个非常常见的情况!Kubernetes 了解您的 pod 是否正在运行,但不了解它们是否正在正确响应。

在接下来的几个步骤中,我们将引导您了解如何使用 Linkerd 来诊断问题。

步骤 2:安装 Linkerd 的 CLI

我们将首先将 Linkerd 的命令行界面 (CLI) 安装到您的本地计算机上。访问 Linkerd 发布页面,或直接运行

curl -sL https://run.linkerd.io/install | sh

安装完成后,使用以下命令将 linkerd 命令添加到您的路径中

export PATH=$PATH:$HOME/.linkerd2/bin

您现在应该能够运行命令 linkerd version,该命令应显示

Client version: v2.0
Server version: unavailable

“服务器版本:不可用”表示我们需要将 Linkerd 的控制平面添加到集群,我们将在下一步中执行此操作。但首先,让我们通过运行以下命令来验证您的集群是否已为 Linkerd 做好准备

linkerd check --pre

此便捷命令将报告任何会干扰您安装 Linkerd 的问题。希望一切正常,您可以继续下一步。

步骤 3:将 Linkerd 的控制平面安装到集群上

在此步骤中,我们将 Linkerd 的轻量级控制平面安装到集群上它自己的命名空间(“linkerd”)中。要执行此操作,请运行

linkerd install | kubectl apply -f -

此命令会生成一个 Kubernetes 清单,并使用 kubectl 命令将其应用于您的 Kubernetes 集群。(在应用清单之前,请随时检查清单。)

(注意:如果您的 Kubernetes 集群在启用了 RBAC 的 GKE 上,则需要一个额外的步骤:您必须首先将 cluster-admin 的 ClusterRole 授予您的 Google Cloud 帐户,才能在控制平面中安装某些遥测功能。为此,请运行:kubectl create clusterrolebinding cluster-admin-binding-$USER --clusterrole=cluster-admin --user=$(gcloud config get-value account)。)

根据您的互联网连接速度,您的 Kubernetes 集群可能需要一到两分钟才能拉取 Linkerd 镜像。在此期间,我们可以通过运行以下命令来验证一切是否正常进行

linkerd check

此命令将耐心等待,直到 Linkerd 安装完成并正在运行。

最后,我们准备好查看 Linkerd 的仪表板了!只需运行

linkerd dashboard

如果您看到如下所示的内容,则 Linkerd 现在正在您的集群上运行。🎉

步骤 4:将 Linkerd 添加到 Web 服务

此时,我们在“linkerd”命名空间中安装了 Linkerd 控制平面,并且在“emojivoto”命名空间中安装了 emojivoto 演示应用程序。但我们实际上尚未将 Linkerd 添加到我们的服务中。所以让我们这样做。

在此示例中,让我们假设我们是“web”服务的所有者。其他服务(如“emoji”和“voting”)由其他团队拥有——因此我们不想接触它们。

有几种方法可以将 Linkerd 添加到我们的服务中。出于演示目的,最简单的方法是执行以下操作

kubectl get -n emojivoto deploy/web -o yaml | linkerd inject - | kubectl apply -f -

此命令从 Kubernetes 检索“web”服务的清单,通过 linkerd inject 运行此清单,最后将其重新应用于 Kubernetes 集群。linkerd inject 命令会增强清单以包含 Linkerd 的数据平面代理。与 linkerd install 一样,linkerd inject 是一种纯文本操作,这意味着您可以在使用之前检查输入和输出。由于“web”是一个 Deployment,Kubernetes 会逐步滚动服务(一次一个 pod)——这意味着当我们将 Linkerd 添加到其中时,“web”可以实时提供流量!

我们现在有一个运行在“web”服务上的服务边车!

步骤 5:调试以获得乐趣和利润

恭喜!您现在有一个完整的 gRPC 应用程序在您的 Kubernetes 集群上运行,并且“web”服务上安装了 Linkerd。当然,当您使用该应用程序时,该应用程序会失败——所以现在让我们使用 Linkerd 来追踪这些错误。

如果您浏览 Linkerd 仪表板(linkerd dashboard 命令),您应该会看到“emojivoto”命名空间中的所有服务都显示出来。由于“web”安装了 Linkerd 服务边车,您还将看到成功率、每秒请求数和延迟百分位数显示出来。

这非常棒,但您可能首先注意到的事情是成功率远低于 100%!点击“web”,让我们深入研究。

您现在应该在查看 Web 服务的 Deployment 页面。您在这里看到的第一件事是 web 正在从 vote-bot(Emojivoto 清单中包含的一项服务,用于持续生成低水平的实时流量)获取流量,并且有两个传出的依赖项:emoji 和 voting。

emoji 服务运行率为 100%,但 voting 服务失败!依赖服务中的故障可能正是导致 web 返回错误的原因。

让我们向下滚动一点页面,我们将看到“web”正在接收的所有流量端点的实时列表。这很有意思

有两个调用不是 100%:第一个是 vote-bot 对“/api/vote”端点的调用。第二个是从 web 服务到 voting 服务的“VotePoop”调用。非常有趣!由于 /api/vote 是一个传入调用,而“/VotePoop”是一个传出调用,因此这是一个很好的线索,即 vote 服务的 VotePoop 端点的故障正是导致问题的原因!

最后,如果我们点击最右列中该行的“tap”图标,我们将被带到与此端点匹配的请求的实时列表。这使我们能够确认请求失败(它们都具有 gRPC 状态代码 2,表示错误)。

此时,我们有了与 vote “voting” 服务的所有者交谈所需的信息。我们已确定他们服务上的一个端点始终返回错误,并且在系统中没有发现其他明显的故障来源。

我们希望您喜欢这次 Linkerd 2.0 的旅程。还有很多东西等着您去探索。例如,我们使用 Web UI 完成的所有操作也可以通过纯 CLI 命令来完成,例如 linkerd toplinkerd statlinkerd tap

另外,您是否注意到我们看到的第一个页面上的小 Grafana 图标?Linkerd 为所有这些指标附带了自动 Grafana 仪表板,允许您以时间序列格式查看您在 Linkerd 仪表板中看到的所有内容。快来查看一下!

想要了解更多?

在本教程中,我们向您展示了如何在集群上安装 Linkerd,将其作为服务边车添加到仅一项服务中——同时该服务正在接收实时流量!——并使用它来调试运行时问题。但这只是冰山一角。我们甚至没有接触过 Linkerd 的任何可靠性或安全功能!

Linkerd 拥有一个蓬勃发展的采用者和贡献者社区,我们希望您能成为其中的一员。有关更多信息,请查看 文档GitHub 存储库,加入 Linkerd Slack 和邮件列表(用户开发人员公告),当然,请在 Twitter 上关注 @linkerd!我们迫不及待地想让您加入!