如何在 Kubernetes 中安装和使用 Linkerd

作者选择了 技术教育基金作为 写给捐款计划的一部分接受捐款。

介绍

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

例如 Linkerd等服务网格可以自动加密连接,处理请求重置和时间,提供成功率和延迟等远程测量信息等等。

在本教程中,您将在您的 Kubernetes群集中安装Linkerd服务网格,部署示例应用程序,然后探索Linkerd的仪表板。

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

前提条件

在本教程中,安装将使用三节点的 DigitalOcean Kubernetes群集,但您可以自由创建一个使用另一种方法的 群集

  • 在开发服务器上安装的 kubectl命令行工具并配置到连接到您的群集。您可以在其 官方文档中阅读有关安装 kubectl的更多信息。

步骤 1 - 部署应用程序

要看到Linkerd在行动中,你需要在你的群集中运行一个应用程序. 在这个步骤中,你将部署一个名为emojivoto的应用程序, Linkerd团队为此而创建的应用程序

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

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

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

您正在使用curl来获取文件,然后通过--output选项告诉它您想要存储文件的位置。

要更好地了解这个文件将实现什么,检查其内容与或打开它与你最喜欢的编辑器:

1cat manifest.yaml | less

你会看到manifest.yaml正在创建一个名为emojivoto的Kubernetes名称空间,在那里将运行与此应用程序相关的一切,以及几个Kubernetes部署服务

接下来,在您的 Kubernetes 集群中应用此宣言:

1kubectl apply -f manifest.yaml

再次,您使用kubectl 应用-f 旗帜分配您想要应用的文件。

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

 1[secondary_label Output]
 2namespace/emojivoto created
 3serviceaccount/emoji created
 4serviceaccount/voting created
 5serviceaccount/web created
 6service/emoji-svc created
 7service/voting-svc created
 8service/web-svc created
 9deployment.apps/emoji created
10deployment.apps/vote-bot created
11deployment.apps/voting created
12deployment.apps/web created

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

1kubectl -n emojivoto get pods

您正在使用kubectl列出您在集群中运行的所有pods,然后通过n旗帜来表示您想要使用的名称空间。

当你看到运行状态中的所有pods时,你应该去:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3emoji-566954596f-cw75b 1/1 Running 0 24s
4vote-bot-85c5f5699f-7dw5c 1/1 Running 0 24s
5voting-756995b6fc-czf8z 1/1 Running 0 24s
6web-7f7b69d467-2546n 1/1 Running 0 23s

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

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

<$>[注] 注: 如果您没有从本地计算机运行此功能,则需要添加 --地址 0.0.0.0 旗帜,以便在所有地址上聆听,而不仅仅是 localhost

在这里,您再次在emojivoto名称空间中使用kubectl,但现在呼叫port-forward子命令并指示它将所有本地请求在端口8080上传送到Kubernetes服务web-svc,在端口80

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

Emojivoto sample application

在您的终端中按CTRL + C。在您的集群中运行一个应用程序,您现在已经准备好安装Linkerd,看看它是如何工作的。

步骤 2 – 安装 Linkerd

现在你有一个应用程序正在运行,让我们安装Linkerd。 要在你的Kubernetes集群中安装它,你首先需要Linkerd CLI。 您将使用这个命令行界面从本地机器与Linkerd进行交互。

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

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

在这里,你正在使用‘curl’来下载安装脚本,然后你正在导出输出到‘sh’,这会自动执行脚本。

如果你使用了脚本,它将安装Linkerd在 ~/.linkerd2/bin. 现在确认 CLI 是正确的:

1~/.linkerd2/bin/linkerd version

命令将输出这样的东西:

1[secondary_label Output]
2Client version: stable-2.7.1
3Server version: unavailable

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

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

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

1linkerd version

最后,让我们在您的 Kubernetes 集群中安装 Linkerd. 命令linkerd install用于生成运行 Linkerd 所需的所有必要的 yaml 宣言,但它不会将这些宣言应用到您的集群。

1linkerd install

您将看到一个长的输出,列出所有 Yaml 宣言资源 Linkerd 需要运行. 要将这些宣言应用到您的集群,运行:

1linkerd install | kubectl apply -f -

运行linkerd 安装将输出您之前看到的所有宣言。``然后将此输出直接输出到kubectl 应用,它将应用它们。

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

若要确认集群中的所有内容都在运行,请运行linkerd check:

1linkerd check

这将对您的集群执行几个检查,以确认所有必要的组件正在运行:

 1[secondary_label Output]
 2kubernetes-api
 3--------------
 4√ can initialize the client
 5√ can query the Kubernetes API
 6
 7[...]
 8
 9control-plane-version
10---------------------
11√ control plane is up-to-date
12√ control plane and cli versions match
13
14Status check results are √

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

1linkerd dashboard

Linkerd Dashboard

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

1linkerd stat deployments -n linkerd

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

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

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

1linkerd stat deployments -n emojivoto

尽管你可以看到你的四个服务,但你之前没有看到的统计数据可用于这些部署,而在网格列中,你可以看到它说0/1:

1[secondary_label Output]
2NAME MESHED SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 TCP_CONN
3emoji 0/1         -     -             -             -             -          -
4vote-bot 0/1         -     -             -             -             -          -
5voting 0/1         -     -             -             -             -          -
6web 0/1         -     -             -             -             -          -

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

步骤 3 – 将 Linkerd 注入到您的应用程序中

现在你已经在你的集群中运行了Linkerd,你已经准备好将其注入到你的emojivoto应用程序中。

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

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

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

在这个命令中,你首先使用kubectl get来获取你在emojivoto命名空间中运行的所有Kubernetes部署,然后指定你希望以yaml格式输出,然后你将该输出发送到linkerd inject命令。

最后,您正在收到这个修改的宣言并将其应用到您的集群中,使用kubectl 应用

运行此命令后,您将看到一个消息,称所有四个emoji服务(emoji,vote-bot,投票Web)都成功注入。

如果你现在检索了emojivoto状态,你会看到你所有的部署现在都被绑定了,几秒钟后你会开始看到你看到的linkerd名称空间的相同的统计数据:

1linkerd stat deployments -n emojivoto

在这里,您可以看到构成emojivoto应用程序的所有四个服务的统计数据,各自的成功率,每秒请求和延迟,而无需写或更改任何应用程序代码。

1[secondary_label Output]
2NAME MESHED SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 TCP_CONN
3emoji 1/1 100.00%   1.9rps 1ms 2ms 2ms 2
4vote-bot 1/1         -        -             -             -             -          -
5voting 1/1 85.96%   0.9rps 1ms 1ms 1ms 2
6web 1/1 93.04%   1.9rps 8ms 27ms 29ms 2

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

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

步骤 4 – 定义服务配置文件

现在你已经将 Linkerd 注入到你的应用程序中,你可以开始获取有关每个服务的行为的有价值信息。此外,你已经完成了这一点,而无需编写任何自定义配置或更改应用程序的代码。

这些信息通过服务配置文件提供,这是一个自定义的Linkerd资源,您可以描述应用程序中的路径以及每个路径的行为。

以下是服务配置文件宣言的样子示例:

 1[label example-service-profile.yaml]
 2apiVersion: linkerd.io/v1alpha2
 3kind: ServiceProfile
 4metadata:
 5  name: my-service.my-namespace.svc.cluster.local
 6spec:
 7  routes:
 8  - name: My Route Name
 9    isRetryable: true # Define it's safe to retry this route
10    timeout: 100ms # Define a timeout for this route
11    condition:
12      method: GET
13      pathRegex: /my/route/path

服务配置文件描述了路线列表,然后定义了符合指定的条件的请求将如何行为. 在本示例中,您表示每个发送到/my/route/pathGET请求将在100ms后过时,如果它们失败,则可以重新处理。

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

1linkerd routes svc/voting-svc -n emojivoto

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

1[secondary_label Output]
2ROUTE SERVICE SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99
3[DEFAULT]   voting-svc 83.05%   1.0rps 1ms 1ms 2ms

您只會找到一條路線,『DEFAULT』. 此處是所有請求的組合,直到您設定您的服務個人資料為止。

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

1nano service-profile.yaml

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

 1[label service-profile.yaml]
 2apiVersion: linkerd.io/v1alpha2
 3kind: ServiceProfile
 4metadata:
 5  name: voting-svc.emojivoto.svc.cluster.local
 6  namespace: emojivoto
 7spec:
 8  routes:
 9  - name: VoteDoughnut
10    isRetryable: true
11    timeout: 100ms
12    condition:
13      method: POST
14      pathRegex: /emojivoto.v1.VotingService/VoteDoughnut

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

在这里,您在emojivoto名称空间中声明投票-svc服务的服务个人资料。您已定义了一个路线,称为VoteDoughnut,该路线将与任何POST请求匹配到/emojivoto.v1.VotingService/VoteDoughnut路径。如果符合这些标准的请求需要超过100ms,Linkerd会取消它,客户端将收到504的回复。

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

1kubectl apply -f service-profile.yaml

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

1linkerd routes svc/voting-svc -n emojivoto

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

1[secondary_label Output]
2ROUTE SERVICE SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99
3VoteDoughnut voting-svc 0.00%   0.2rps 1ms 1ms 1ms
4[DEFAULT]      voting-svc 100.00%   0.8rps 1ms 4ms 4ms

您可以看到多个自定义指标,例如成功率、每秒请求和该特定路线的延迟。 请注意,VoteDoughnut终端是 故意配置始终返回错误的,并且它输出0%的成功率,而[DEFAULT]路线输出100%。

因此,现在,在给Linkerd一些关于您的服务的信息之后,您每条路线都有定制的指标,以及两项政策:时间推迟和退出。

结论

在本文中,您在您的 Kubernetes 集群中安装了 Linkerd,并使用它来监控样本应用程序. 您提取了有用的远程测量信息,如成功率,传输率和延迟。

如果你有兴趣了解更多关于Linkerd的信息,你可以浏览他们的伟大的文档页面(https://linkerd.io/2/overview/),在那里他们展示了如何 保护你的服务, 配置分布式跟踪, 自动卡纳利发行,等等。

从这里,你也可以考虑 检查 Istio ,这是另一个服务网,具有不同的功能和折扣。

Published At
Categories with 技术
comments powered by Disqus