作为 Write for DOnations 计划的一部分,作者选择了 Tech Education Fund 来接受捐赠。
介绍
服务网格 是一个专用的基础设施层,可帮助管理员处理服务到服务的通信。 这些服务网格提供了许多强大的工具,可以使您的系统更安全、更可靠、更可见。
例如,像 Linkerd 这样的服务网格可以自动加密连接、处理请求重试和超时、提供成功率和延迟等遥测信息等。
在本教程中,您将在 Kubernetes 集群中安装 Linkerd 服务网格,部署示例应用程序,然后探索 Linkerd 的仪表板。 在熟悉了一些仪表板信息之后,您将配置 Linkerd 以对特定 Kubernetes pod 实施 timeout
和 retry
策略。
或者,考虑探索 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 Deployments
和 Services
。
接下来,在您的 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
服务(emoji
、vote-bot
、voting
和 web
)被成功注入。
如果您现在检索 emojivoto
的 stats
,您将看到所有 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,这是另一个具有不同功能和权衡的服务网格。