作者选择了 技术教育基金作为 写给捐款计划的一部分接受捐款。
介绍
服务网是一个专用的基础设施层,可以帮助管理员处理服务对服务的通信,提供许多强大的工具,这些服务网可以使您的系统更安全,更可靠,更可见。
例如 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 应用程序。
在您的终端中按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 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/path
的GET
请求将在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 ,这是另一个服务网,具有不同的功能和折扣。