教程|如何在 K8S 集群上快速部署 Linkerd 2.0
技术
作者:Thomas Rampelberg
译者:夏天
2018-09-27 12:02

目前,Linkerd 2.0 已宣布普遍可用(GA),这表明它已准备好用于生产。在这个教程中,我们将指导你如何在几秒钟内在 Kubernetes 集群上启动和运行 Linkerd 2.0。 

Linkerd 2.0 教程 

在开始教程之前,我们先说说什么是 Linkerd?以及你为什么要学这个教程?Linkerd 是一种 service sidecar,可增强 Kubernetes 服务,提供零配置 Dashboard 和 UNIX 风格的 CLI 工具,用于运行时调试,诊断和可靠性。Linkerd 也是一个 Service Mesh,应用于集群中的多个(或所有)服务,为它们提供统一的遥测,安全和控制层。 

Linkerd 的工作原理是将超轻代理安装到服务的每个 Pod 中。这些代理将遥测数据报告给控制层,并从控制层接收信号。这意味着不需要做任何代码更改就能直接使用 Linkerd ,甚至可以在正在运行的服务上实时安装。Linkerd 获得了 Apache v2 许可,是完全开源的,目前由云原生计算基金会(CNCF)托管(与  Kubernetes 一样!)。 

接下来就让我们看看在 Kubernetes 集群上运行 Linkerd 的速度有多快。接下来,我们将向你介绍如何在任意 Kubernetes 1.9 + 集群上部署 Linkerd,以及如何使用它来调试一个示例 gRPC 应用程序中的故障。

第 1 步:安装 demo 应用程序   

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

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

此命令用来下载 Emojivoto 的 Kubernetes manifest,使用 kubectl 将其应用于你的 Kubernetes 集群上。Emojivoto 由几个在 “emojivoto” namespace 中运行的服务组成。你可以通过运行以下命令来查看服务:

kubectl get -n emojivoto deployments

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

minikube -n emojivoto service web-svc --url # if you’re on minikube或:kubectl get svc web-svc -n emojivoto -o jsonpath="{.status.loadBalancer.ingress[0].*}" #

如果你在别的地方

点击其他地方。你可能会注意到应用程序的某些部分已损坏!如果要你检查本地  Kubernetes dashboard,你很难感受到乐趣。就 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

“Server version: unavailable” 意味着我们需要将 Linkerd 的控制层添加到集群,我们接下来会这样做。但首先,让我们运行以下命令来验证,你的集群是否已经为 Linkerd 做好准备:

linkerd check --pre

这个便捷的命令将向你反馈所有会影响你安装 Linkerd 的问题。希望你进展顺利并已经准备好继续下一步了。 

第 3 步:将 Linkerd 的控制层安装到集群上 

在这一步中,我们将 Linkerd 的轻量级控制层安装到集群中自己的 namespace(“linkerd”)中。为此,请运行: 

linkerd install | kubectl apply -f -

此命令可生成一个 Kubernetes manifest ,然后使用 kubectl 命令将其应用于 Kubernetes 集群。(在应用之前,请随意检查 manifest )

注意:如果你的 Kubernetes 集群在启用了 RBAC 的 GKE 后,则需要额外的步骤:首先,你必须向你的 Google Cloud 帐户授予 ClusterRole 集群管理员权限,以便在控制层中安装某些遥测功能。为此,运行:

kubectl create clusterrolebinding cluster-admin-binding-$USER --clusterrole=cluster-admin --user=$(gcloud config get-value account)

你的 Kubernetes 集群可能需要一两分钟才能获取 Linkerd 镜像,这取决于你的互联网连接速度。在发生这种情况时,我们可以通过运行以下命令来验证是否一切正常:

linkerd check

此命令将耐心等待 Linkerd 安装并运行。

最后,我们准备好查看 Linkerd 的 dashboard 了!只需要运行:

linkerd dashboard

如果你看到类似下面的内容,那么 Linkerd 现在应该正在你的集群上运行了。

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

此时,我们在 “linkerd” namespace 中安装了 Linkerd 控制层,并且在 “emojivoto” namespace 中安装了我们的 emojivoto demo 应用程序。但我们还没有将 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 添加到 Kubernetes 时,“web” 可以提供流量服务!
我们现在在 “web” 服务上运行服务 service sidecar!

第 5 步:调试 Fun 和 for Profit 

恭喜!你现在已经在 Kubernetes 集群上运行了一个完整的 gRPC 应用程序,并在 “web” 服务上安装了 Linkerd。但是当你使用它时,应用程序失败了。所以现在让我们使用 Linkerd 来追踪这些错误。 


非常棒是不是,但你可能首先注意到的是成功率远低于 100%!点击 “web”,让我们深入挖掘。


你现在应该查看 Web 服务的“Deployment ”页面。你首先将看到的是 Web 正在从 vote-bot (包含在 Emojivoto manifest 中的服务,以持续生成低水平的实时流量)中获取流量,并且具有两个输出依赖项,emoji 和 voting。


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

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


 其中有两个不是 100% 的调用:第一个是 vote-bot 调用 “/ api / vote” 端点。第二个是从 Web 服务到 voting 服务的 “VotePoop” 调用。很有意思!由于 / api / vote 是一个呼入,而 “/ VotePoop” 是一个呼出,这是一个很好的线索,表明 vote 服务的 VotePoop 端点失败是造成问题的原因!
最后,如果我们点击最右侧列中该行的 “tap” 图标,我们将会看到与该端点匹配的实时列表。我们可以确认请求失败(它们都具有 gRPC 状态代码 2,表示错误)。


 


其中有两个不是 100% 的调用:第一个是 vote-bot 调用 “/ api / vote” 端点。第二个是从 Web 服务到 voting 服务的 “VotePoop” 调用。很有意思!由于 / api / vote 是一个呼入,而 “/ VotePoop” 是一个呼出,这是一个很好的线索,表明 vote 服务的 VotePoop 端点失败是造成问题的原因!


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


在这一点上,我们有了与投票 “voting” 服务的所有者谈判的筹码。我们已经在其服务上确定了一个始终返回错误的端点,并且在系统中没有发现其他明显的故障源。

我们希望你可以与 Linkerd 2.0 一起享受这段旅程。还有更多值得探索的地方。例如,我们在上面使用 Web UI 所做的一切,也可以通过纯粹的 CLI 命令,如完成 linkerd top,linkerd stat 和 linkerd tap。
另外,你注意到第一页上的小 Grafana 图标了吗?Linkerd 附带所有这些指标的自动 Grafana dashboard,可以让你以时间序列格式查看 Linkerd dashboard 中所有内容。赶快一探究竟吧!


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

未来发展 

Linkerd 社区深入了解其 Service Mesh 平台的最新更新,以进一步提高开发人员和服务所有者的效率,并与不断发展的 Kubernetes 生态系统更紧密地集成。这次更新还为 Linkerd 在日益拥挤的 Service Mesh 空间中提供了一些喘息空间。
Bouyant 首席执行官兼 Linkerd 创始开发者之一 William Morgan 表示,Linkerd 2.0 版本最重要的特点是完全重写其基础代码库,并更加注重简化 Service Mesh 部署。

这次重写将控制层从 JVM 编程语言变为 Go 编程语言。Morgan 表示,与之前的迭代相比,此次更新让 Linkerd 2.0 “规模更小,速度更快”。
除了性能优势之外,转向 Go 语言的 Linkerd 更接近 Kubernetes 生态系统。“我们的大多数用户都身处 Kubernetes 阵营,所以我们希望能尽早解决这个问题,” Morgan 说。

Morgan 解释说,除了与 Kubernetes 生态系统相结合之外,Go 编程语言“更容易上手”,并将推动平台的更大创新。Linkerd 和 Kubernetes 都是云原生计算基金会(CNCF)生态系统的一部分。
Morgan 表示,尽管 Service Mesh 选项越来越多,但 Linkerd 社区仍然专注于提高平台的可用性。他指出,由于这一重点,该平台本身仍然收到人们的额外关注。Morgan 预计接下来 Linkerd 将尽快从 CNCF 的“孵化”项目转为“全面毕业”项目。


参考文献:https://kubernetes.io/blog/


 

179 comCount 0