如何在 Kubernetes 中安装和使用 Linkerd

作为Write for DOnations计划的一部分,作者选择了技术教育基金来接受捐赠

介绍

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

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

在本教程中,您将在Kubernetes集群中安装 Linkerd 服务网格,部署示例应用程序,然后浏览 Linkerd 的仪表板。有一些这方面的信息仪表盘自己熟悉后,您将配置Linkerd执行timeoutretry特定Kubernetes荚政策。

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

先决条件

第 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正在创建一个名为 Kubernetes 命名空间的命名空间emojivoto,与此应用程序相关的所有内容都将在其中运行,以及一些 KubernetesDeploymentsServices.

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

  • kubectl apply -f manifest.yaml

同样,你用kubectl apply-f标志指定要申请的文件。

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

Output
namespace/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命名空间,因为这是您运行所有这些服务的地方。

当你看到所有podsRunning状态,你是好去:

Output
NAME 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.

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

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

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. 现在确认 CLI 工作正常:

  • ~/.linkerd2/bin/linkerd version

该命令将输出如下内容:

Output
Client version: stable-2.7.1 Server version: unavailable

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

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

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

  • linkerd version

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

  • linkerd install

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

  • linkerd install | kubectl apply -f -

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

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

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

  • linkerd check

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

Output
kubernetes-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列,表示podsLinkerd 注入了多少

Output
NAME 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

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

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

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

在此命令中,您首先使用kubectl get获取deploymentemojivoto命名空间中运行的所有 Kubernetes ,然后指定您想要的输出yaml格式。然后您将该输出发送到linkerd inject命令。此命令将读取yaml包含您正在运行的当前清单文件,并修改它以在每个deployment.

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

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

如果您现在检索statsfor emojivoto,您将看到所有deployments 现在都已网格化,几秒钟后您将开始看到与linkerd命名空间相同的统计信息

  • linkerd stat deployments -n emojivoto

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

Output
NAME 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行为方式。在此示例中,您是说GET发送到的每个请求都/my/route/path将在 100 毫秒后超时,如果失败,可以重试。

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

  • linkerd routes svc/voting-svc -n emojivoto

在这里,您使用该linkerd routes命令voting-svcemojiovoto命名空间中列出 service 的所有路由

Output
ROUTE 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

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

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

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

  • kubectl apply -f service-profile.yaml

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

  • linkerd routes svc/voting-svc -n emojivoto

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

Output
ROUTE 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 的更多信息,可以浏览他们很棒的文档页面,其中展示了如何保护您的服务配置分布式跟踪自动化金丝雀发布等等。

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁