作为Write for DOnations计划的一部分,作者选择了技术教育基金来接受捐赠。
介绍
一个服务网是一个专门的基础设施层,帮助管理员处理服务到服务的通信。这些服务网格提供了许多强大的工具,可以使您的系统更安全、更可靠、更可见。
例如,像Linkerd这样的服务网格可以自动加密连接、处理请求重试和超时、提供成功率和延迟等遥测信息等。
在本教程中,您将在Kubernetes集群中安装 Linkerd 服务网格,部署示例应用程序,然后浏览 Linkerd 的仪表板。有一些这方面的信息仪表盘自己熟悉后,您将配置Linkerd执行timeout
和retry
特定Kubernetes荚政策。
或者,考虑探索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
正在创建一个名为 Kubernetes 命名空间的命名空间emojivoto
,与此应用程序相关的所有内容都将在其中运行,以及一些 KubernetesDeployments
和Services
.
接下来,在您的 Kubernetes 集群中应用此清单:
- kubectl apply -f manifest.yaml
同样,你用kubectl apply
用-f
标志指定要申请的文件。
此命令将输出已创建的所有资源的列表:
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
.
在这里,您再次使用kubectl
的emojivoto
命名空间,但现在调用port-forward
子命令,并引导其对端口的所有本地请求转发8080
到Kubernetes服务web-svc
,端口80
。这只是一种方便您访问应用程序的方式,而无需适当的负载均衡器。
现在访问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
. 现在确认 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
命令用于生成yaml
运行 Linkerd 所需的所有必要清单,但不会将这些清单应用于您的集群。运行此命令以检查其输出:
- 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 中运行 sidecar 容器来工作pods
。也就是说,您将在pod
您运行的每个容器中注入一个 linkerd 代理容器。您pods
随后发送或接收的每个请求都将通过这个非常轻量级的代理,它可以收集指标(如成功率、每秒请求数和延迟)并执行策略(如超时和重试)。
您可以使用以下命令手动注入 Linkerd 的代理:
- kubectl get deployments -n emojivoto -o yaml | linkerd inject - | kubectl apply -f -
在此命令中,您首先使用kubectl get
获取deployment
在emojivoto
命名空间中运行的所有 Kubernetes ,然后指定您想要的输出yaml
格式。然后您将该输出发送到linkerd inject
命令。此命令将读取yaml
包含您正在运行的当前清单的文件,并修改它以在每个deployment
.
最后,您将收到此修改后的清单并将其应用到您的集群中kubectl apply
。
运行此命令后,您会看到一条消息,说所有的四个emojivoto
服务(emoji
,vote-bot
,voting
和web
)被成功注入。
如果您现在检索stats
for emojivoto
,您将看到所有deployment
s 现在都已网格化,几秒钟后您将开始看到与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 资源,您可以在其中描述应用程序中的路由以及每个路由的行为方式。
以下是服务配置文件清单的示例:
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-svc
在emojiovoto
命名空间中列出 service 的所有路由:
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
将以下服务配置文件定义添加到此文件中:
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-svc
在emojivoto
命名空间中为服务声明了一个服务配置文件。您已经定义了一个名为 的路由,VoteDoughnut
它将匹配任何POST
对/emojivoto.v1.VotingService/VoteDoughnut
路径的请求。如果符合这些条件的请求耗时超过 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 的更多信息,可以浏览他们很棒的文档页面,其中展示了如何保护您的服务、配置分布式跟踪、自动化金丝雀发布等等。
从这里你还可以考虑查看 Istio,这是另一个具有不同功能和权衡的服务网格。