如何在Kubernetes中安装和使用Linkerd

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Tech Education Fund 来接受捐赠。

介绍

服务网格 是一个专用的基础设施层,可帮助管理员处理服务到服务的通信。 这些服务网格提供了许多强大的工具,可以使您的系统更安全、更可靠、更可见。

例如,像 Linkerd 这样的服务网格可以自动加密连接、处理请求重试和超时、提供成功率和延迟等遥测信息等。

在本教程中,您将在 Kubernetes 集群中安装 Linkerd 服务网格,部署示例应用程序,然后探索 Linkerd 的仪表板。 在熟悉了一些仪表板信息之后,您将配置 Linkerd 以对特定 Kubernetes pod 实施 timeoutretry 策略。

或者,考虑探索 DigitalOcean 的一键式 Linkerd/Kubernetes 安装选项

先决条件

  • 一个 Kubernetes 1.12+ 集群。 在本教程中,设置将使用具有三个节点的 DigitalOcean Kubernetes 集群,但您可以使用另一种方法 自由创建 集群。
  • kubectl 命令行工具安装在开发服务器上并配置为连接到您的集群。 您可以在其 官方文档 中阅读有关安装 kubectl 的更多信息。

第 1 步 — 部署应用程序

要查看 Linkerd 的运行情况,您需要在集群中运行一个应用程序。 在这一步中,您将部署一个名为 emojivoto的应用程序,Linkerd 团队为此目的创建了该应用程序

这个存储库 中,您可以看到组成应用程序的四个服务的代码,以及您将用于在 Kubernetes 集群中部署这些服务的 清单文件

首先,将此清单文件保存在本地:

curl https://run.linkerd.io/emojivoto.yml --output manifest.yaml

您正在使用 curl 来获取文件,然后通过 --output 选项告诉它您要将文件保存在哪里。 在这种情况下,您将创建一个名为 manifest.yaml 的文件。

为了更好地理解这个文件将完成什么,用 cat 检查它的内容或用你喜欢的编辑器打开它:

cat manifest.yaml | less

SPACE 翻阅指令。 您将看到 manifest.yaml 正在创建一个名为 emojivoto 的 Kubernetes 命名空间,与此应用程序相关的所有内容都将在其中运行,还有几个 Kubernetes DeploymentsServices

接下来,在您的 Kubernetes 集群中应用此清单:

kubectl apply -f manifest.yaml

同样,您使用带有 -f 标志的 kubectl apply 来分配要应用的文件。

此命令将输出已创建的所有资源的列表:

Outputnamespace/emojivoto created
serviceaccount/emoji created
serviceaccount/voting created
serviceaccount/web created
service/emoji-svc created
service/voting-svc created
service/web-svc created
deployment.apps/emoji created
deployment.apps/vote-bot created
deployment.apps/voting created
deployment.apps/web created

现在检查服务是否正在运行:

kubectl -n emojivoto get pods

您正在使用 kubectl 列出您在集群中运行的所有 pods,然后传递 -n 标志以指示您要使用哪些命名空间。 您正在传递 emojivoto 命名空间,因为这是您运行所有这些服务的地方。

当您看到所有 pods 处于 Running 状态时,您就可以开始了:

OutputNAME                        READY   STATUS    RESTARTS   AGE
emoji-566954596f-cw75b      1/1     Running   0          24s
vote-bot-85c5f5699f-7dw5c   1/1     Running   0          24s
voting-756995b6fc-czf8z     1/1     Running   0          24s
web-7f7b69d467-2546n        1/1     Running   0          23s

最后,要查看在浏览器中运行的应用程序,您将使用 kubectl 将本地请求转发到远程集群的内置功能:

kubectl -n emojivoto port-forward svc/web-svc 8080:80

注意: 如果你不是在本地机器上运行它,你需要添加 --address 0.0.0.0 标志来监听所有地址,而不仅仅是 localhost


在这里,您再次在 emojivoto 命名空间中使用 kubectl,但现在调用 port-forward 子命令并指示它转发端口 8080 上的所有本地请求到端口 80 上的 Kubernetes 服务 web-svc。 这只是您访问应用程序的一种便捷方式,而无需安装适当的负载均衡器。

现在访问 http://localhost:8080,您将看到 emojivoto 应用程序。

在终端中按 CTRL + C。 在集群中运行一个应用程序后,您现在可以安装 Linkerd 并查看它是如何工作的。

第 2 步 — 安装 Linkerd

现在您已经运行了一个应用程序,让我们安装 Linkerd。 要将其安装在您的 Kubernetes 集群中,您首先需要 Linkerd CLI。 您将使用此命令行界面从本地计算机与 Linkerd 进行交互。 之后,您可以在集群中安装 Linkerd。

首先,让我们使用 Linkerd 团队提供的脚本安装 CLI:

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

在这里,您使用 curl 下载安装脚本,然后将输出传送到 sh,它会自动执行脚本。 或者,您可以直接从 Linkerd 的 发布页面 下载 CLI。

如果您使用该脚本,那么它将在 ~/.linkerd2/bin 上安装 Linkerd。 现在确认 CLI 工作正常:

~/.linkerd2/bin/linkerd version

该命令将输出如下内容:

OutputClient version: stable-2.7.1
Server version: unavailable

然后,为了更容易运行 CLI,将此目录添加到您的 $PATH

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

现在您可以更直接地运行命令,如上一个:

linkerd version

最后,让我们在您的 Kubernetes 集群中安装 Linkerd。 linkerd install 命令用于生成运行 Linkerd 所需的所有必要的 yaml 清单,但它不会将这些清单应用于您的集群。 运行此命令以检查其输出:

linkerd install

您将看到一个长输出,列出了 Linkerd 需要运行的资源的所有 yaml 清单。 要将这些清单应用到您的集群,请运行:

linkerd install | kubectl apply -f -

运行 linkerd install 将输出您之前看到的所有清单。 | 然后将此输出直接通过管道传输到 kubectl apply,后者将应用它们。

运行此命令后,kubectl apply 将输出已创建的所有资源的列表。

要确认集群中的一切都在运行,请运行 linkerd check

linkerd check

这将对您的集群运行多项检查,以确认所有必要的组件都在运行:

Outputkubernetes-api
--------------
√ can initialize the client
√ can query the Kubernetes API

[...]

control-plane-version
---------------------
√ control plane is up-to-date
√ control plane and cli versions match

Status check results are √

最后,运行此命令以在浏览器中打开内置的 Linkerd 仪表板(请记住,如果您不是从本地计算机运行此命令,则需要提供 --address 0.0.0.0 标志):

linkerd dashboard

您在仪表板中看到的大部分信息都可以使用 Linkerd CLI 获得。 例如,运行此命令以查看高级统计部署:

linkerd stat deployments -n linkerd

在这里,您说您想要在 linkerd 命名空间中运行的部署的统计信息。 这些是 Linkerd 自己的组件,有趣的是,您可以使用 Linkerd 本身来监控它们。 您可以查看每秒请求数 (RPS)、成功率、延迟等统计信息。 您还可以看到一个 Meshed 列,它表示有多少 pods Linkerd 已注入:

OutputNAME                     MESHED   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONN
linkerd-controller          1/1   100.00%   0.4rps           1ms          87ms          98ms          5
linkerd-destination         1/1   100.00%   0.3rps           1ms           2ms           2ms         13
linkerd-grafana             1/1   100.00%   0.3rps           2ms           3ms           3ms          2
linkerd-identity            1/1   100.00%   0.3rps           1ms           2ms           2ms         10
linkerd-prometheus          1/1   100.00%   0.7rps          35ms         155ms         191ms          9
linkerd-proxy-injector      1/1   100.00%   0.3rps           2ms           3ms           3ms          2
linkerd-sp-validator        1/1   100.00%   0.3rps           1ms           5ms           5ms          2
linkerd-tap                 1/1   100.00%   0.3rps           1ms           4ms           4ms          6
linkerd-web                 1/1   100.00%   0.3rps           1ms           2ms           2ms          2

现在在你的 emojivoto 命名空间中尝试这个命令:

linkerd stat deployments -n emojivoto

尽管您可以看到您的四个服务,但您之前看到的所有统计信息都不适用于这些部署,并且在“Meshed”列中,您可以看到它显示为 0/1

OutputNAME       MESHED   SUCCESS   RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONN
emoji         0/1         -     -             -             -             -          -
vote-bot      0/1         -     -             -             -             -          -
voting        0/1         -     -             -             -             -          -
web           0/1         -     -             -             -             -          -

这里的输出意味着你还没有将 Linkerd 注入到应用程序中。 这将是您的下一步。

第 3 步 — 将 Linkerd 注入您的应用程序

现在您已经在集群中运行了 Linkerd,您可以将其注入到您的 emojivoto 应用程序中。

Linkerd 通过在 Kubernetes pods 中运行 sidecar 容器来工作。 也就是说,您将在每个正在运行的 pod 中注入一个 linkerd 代理容器。 您的 pods 然后发送或接收的每个请求都将通过这个非常轻量级的代理,该代理可以收集指标(如成功率、每秒请求数和延迟)并执行策略(如超时和重试)。

您可以使用以下命令手动注入 Linkerd 的代理:

kubectl get deployments -n emojivoto -o yaml | linkerd inject - | kubectl apply -f -

在此命令中,您首先使用 kubectl get 来获取您在 emojivoto 命名空间中运行的所有 Kubernetes deployment,然后指定要在 [ X181X] 格式。 然后您将该输出发送到 linkerd inject 命令。 此命令将使用您正在运行的当前清单读取 yaml 文件,并对其进行修改以在每个 deployment 旁边包含链接器代理。

最后,您将收到此修改后的清单并使用 kubectl apply 将其应用到您的集群。

运行此命令后,您将看到一条消息,指出所有四个 emojivoto 服务(emojivote-botvotingweb)被成功注入。

如果您现在检索 emojivotostats,您将看到所有 deployment 现在都已网格化,几秒钟后您将开始看到与您相同的统计数据看到 linkerd 命名空间:

linkerd stat deployments -n emojivoto

在这里,您可以查看组成 emojivoto 应用程序的所有四个服务的统计信息,包括它们各自的成功率、每秒请求数和延迟,而无需编写或更改任何应用程序代码。

OutputNAME       MESHED   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONN
emoji         1/1   100.00%   1.9rps           1ms           2ms           2ms          2
vote-bot      1/1         -        -             -             -             -          -
voting        1/1    85.96%   0.9rps           1ms           1ms           1ms          2
web           1/1    93.04%   1.9rps           8ms          27ms          29ms          2

vote-bot 服务不显示任何统计信息,因为它只是一个向其他服务发送请求的机器人,因此没有接收任何流量,这本身就是有价值的信息。

现在让我们看看如何向 Linkerd 提供一些有关您的服务的额外信息以自定义其行为。

第 4 步 — 定义服务配置文件

现在您已经将 Linkerd 注入到您的应用程序中,您可以开始检索有关每个服务的行为方式的有价值的信息。 此外,您无需编写任何自定义配置或更改应用程序代码即可完成此操作。 但是,如果您确实向 Linkerd 提供了一些额外的信息,它就可以强制执行许多策略,例如超时和重试。 然后它还可以提供每个路由的指标。

此信息通过服务配置文件提供,该服务配置文件是一种自定义 Linkerd 资源,您可以在其中描述应用程序中的路由以及每个路由的行为方式。

以下是服务配置文件清单的示例:

示例服务配置文件.yaml

apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
  name: my-service.my-namespace.svc.cluster.local
spec:
  routes:
  - name: My Route Name
    isRetryable: true # Define it's safe to retry this route
    timeout: 100ms # Define a timeout for this route
    condition:
      method: GET
      pathRegex: /my/route/path

服务配置文件描述了一个路由列表,然后定义了匹配指定 condition 的请求的行为方式。 在此示例中,您是说发送到 /my/route/path 的每个 GET 请求将在 100 毫秒后超时,如果它们失败,则可以重试。

现在让我们为您的一项服务创建一个服务配置文件。 以 voting-svc 为例,首先使用 Linkerd CLI 查看您为该服务定义的路由:

linkerd routes svc/voting-svc -n emojivoto

在这里,您使用 linkerd routes 命令列出服务 voting-svc 的所有路由,在 emojiovoto 命名空间中:

OutputROUTE          SERVICE   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99
[DEFAULT]   voting-svc    83.05%   1.0rps           1ms           1ms           2ms

您只会找到一条路线,[DEFAULT]。 在您定义服务配置文件之前,所有请求都在此分组。

现在打开 nano 或您喜欢的编辑器来创建 service-profile.yaml 文件:

nano service-profile.yaml

将以下服务配置文件定义添加到此文件中:

服务配置文件.yaml

apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
  name: voting-svc.emojivoto.svc.cluster.local
  namespace: emojivoto
spec:
  routes:
  - name: VoteDoughnut
    isRetryable: true
    timeout: 100ms
    condition:
      method: POST
      pathRegex: /emojivoto.v1.VotingService/VoteDoughnut

现在保存文件并关闭编辑器。

在这里,您在 emojivoto 命名空间中为 voting-svc 服务声明服务配置文件。 您已经定义了一个名为 VoteDoughnut 的路由,它将匹配对 /emojivoto.v1.VotingService/VoteDoughnut 路径的任何 POST 请求。 如果符合这些条件的请求超过 100 毫秒,Linkerd 将取消它,客户端将收到 504 响应。 您还告诉 Linkerd,如果此请求失败,则可以重试。

现在将此文件应用于您的集群:

kubectl apply -f service-profile.yaml

几秒钟后,重新检查此服务的路由:

linkerd routes svc/voting-svc -n emojivoto

您现在将看到新定义的 VoteDoughnut 路线:

OutputROUTE             SERVICE   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99
VoteDoughnut   voting-svc     0.00%   0.2rps           1ms           1ms           1ms
[DEFAULT]      voting-svc   100.00%   0.8rps           1ms           4ms           4ms

您可以看到几个自定义指标,例如成功率、每秒请求数和此特定路由的延迟。 注意VoteDoughnut端点是故意配置总是返回错误,输出成功率为0%,而[DEFAULT]路由输出100% .

所以现在,在给 Linkerd 一些关于你的服务的信息之后,你就有了每个路由的自定义指标,以及两个强制执行的策略:超时和重试。

结论

在本文中,您在 Kubernetes 集群中安装了 Linkerd,并使用它来监控示例应用程序。 您提取了有用的遥测信息,例如成功率、吞吐量和延迟。 您还配置了一个 Linkerd 服务配置文件来收集每个路由的指标并在 emojivoto 应用程序中实施两个策略。

如果您有兴趣了解有关 Linkerd 的更多信息,可以浏览他们出色的 文档页面 ,其中展示了如何 保护您的服务配置分布式跟踪 、[ X204X]自动化金丝雀版本,等等。

从这里您还可以考虑 检查 Istio,这是另一个具有不同功能和权衡的服务网格。