第 2 章 指定链接成本
在连接站点时,您可以为每个链接分配一个成本来影响流量流。默认情况下,为新链接将链接成本设置为 1
。在服务网络中,路由算法尝试使用从客户端到目标服务器的最低总成本的路径。
如果您在不同站点间分布服务,您可能需要客户端使用特定目标或链接。在这种情况下,您可以在替代链接中指定大于
1
的成本,以减少这些链接的使用。注意开放连接的分发是统计数据,即不是循环系统。
- 如果连接只遍历一个链接,则路径成本与链接成本相同。如果连接遍历多个链接,路径成本是路径中涉及的所有链接的总和。
成本充当使用从客户端到网络中的服务器的路径的阈值。当只有一个路径时,无论成本如何,该路径上的流量流。
注意如果您从两个服务的目标开始,并且不再提供其中一个目标,剩余路径上的流量流不再可用,无论成本如何。
- 当多个路径从客户端到服务器实例或服务时,最低成本路径上的流量流,直到连接数量超过替代路径的成本。达到这个打开连接阈值后,新的连接将分散到替代路径和最低的成本路径中。
前提条件
- 您已将 Kubernetes 上下文设置为您要从其中链接的站点。
- 要链接到的站点的令牌。
流程
创建到服务网络的链接:
$ skupper link create <filename> --cost <integer-cost>
其中
<integer-cost>
是一个大于 1 的整数,流量会优先使用成本链接。注意如果可以在不遍历链接的情况下调用服务,该服务被视为本地,且带有隐式成本
0
。例如,使用名为
token.yaml
的令牌文件创建成本设置为2
的链接:$ skupper link create token.yaml --cost 2
检查链接成本:
$ skupper link status link1 --verbose
输出结果类似以下:
Cost: 2 Created: 2022-11-17 15:02:01 +0000 GMT Name: link1 Namespace: default Site: default-0d99d031-cee2-4cc6-a761-697fe0f76275 Status: Connected
使用控制台观察流量。
如果您在站点中有一个控制台,请登录并导航到每台服务器的进程。您可以查看与每个客户端对应的流量级别。
注意如果不同站点上有多个客户端,请将视图过滤到每个客户端,以确定流量成本的影响。例如,在两个站点网络中与两个站点的服务器和客户端链接在一起,您可以看到客户端在本地服务器可用时由本地服务器提供。
2.1. 从命名空间公开服务网络上的服务
创建服务网络后,公开的服务就可以在该网络间进行通信。
skupper
CLI 有两个选项用于公开命名空间中已存在的服务:
-
expose
支持简单用例,例如,单一服务的部署。具体步骤请查看 第 2.1.1 节 “在服务网络上公开简单的服务”。 -
service create
andservice bind
是更灵活的公开服务方法,例如,如果您的一个部署有多个服务。具体步骤请查看 第 2.1.2 节 “在服务网络上公开复杂的服务”。
2.1.1. 在服务网络上公开简单的服务
这部分论述了如何为服务网络启用服务用于简单用例。
流程
在其中一个站点中创建部署、一些 pod 或服务,例如:
$ kubectl create deployment hello-world-backend --image quay.io/skupper/hello-world-backend
此步骤不是特定于 Skupper,即此过程与集群的标准进程不同。
创建可在服务网络中进行通信的服务:
部署和 pod
$ skupper expose [deployment <name>|pods <selector>]
其中
-
<name
> 是部署的名称 -
<selector>
是一个 pod 选择器
Kubernetes 服务
使用
--address
选项指定生成的服务名称。$ skupper expose service <name> --address <skupper-service-name>
其中
-
<
name> 是服务的名称 -
<skupper-service-name
> 是服务网络上共享生成的服务的名称。
StatefulSets
您可以使用以下方法公开 statefulset:
$ skupper expose statefulset <statefulsetname>
Kubernetes 中的 StatefulSet 通常与无头服务关联,为每个 pod 提供稳定、唯一的网络标识符。如果服务网络上的每个 pod 需要稳定的网络标识符,请使用
--headless
选项。$ skupper expose statefulset --headless
注意当您使用 '--headless" 选项时,服务网络中只有一个 statefulset 才能通过地址(routing 键)公开。
对于第 1 步中的示例部署,您可以使用以下命令创建服务:
$ skupper expose deployment/hello-world-backend --port 8080
expose
命令的选项包括:-
--port <port-number>
:: 指定该服务在服务网络上提供的端口号。注意:您可以通过重复这个选项来指定多个端口。 -
--target-port <port-number>
:: 指定您要公开的 pod 的端口号。 -
--protocol <protocol>
允许您指定要使用的协议:tcp
、http
或http2
注意如果没有指定端口,
skupper
将使用部署的containerPort
值。-
检查服务网络上公开的服务状态(
-v
仅在 Kubernetes 上可用):$ skupper service status -v Services exposed through Skupper: ╰─ backend:8080 (tcp) ╰─ Sites: ├─ 4d80f485-52fb-4d84-b10b-326b96e723b2(west) │ policy: disabled ╰─ 316fbe31-299b-490b-9391-7b46507d76f1(east) │ policy: disabled ╰─ Targets: ╰─ backend:8080 name=backend-9d84544df-rbzjx
2.1.2. 在服务网络上公开复杂的服务
本节描述了如何为服务网络启用服务,以获取更复杂的用例。
流程
在其中一个站点中创建部署、一些 pod 或服务,例如:
$ kubectl create deployment hello-world-backend --image quay.io/skupper/hello-world-backend
此步骤不是特定于 Skupper,即此过程与集群的标准进程不同。
创建可在服务网络中进行通信的服务:
$ skupper service create <name> <port>
其中
-
<name>
是您要创建的服务的名称 -
<port>
是服务使用的端口
对于第 1 步中的示例部署,您可以使用以下命令创建服务:
$ skupper service create hello-world-backend 8080
-
将服务绑定到集群服务:
$ skupper service bind <service-name> <target-type> <target-name>
其中
-
<service-name>
是服务网络上的服务名称 -
<target-type>
是您要公开的对象:deployment
,statefulset
,pods
, 或service
。 -
<target-name>
是集群服务的名称
对于第 1 步中的示例部署,您可以使用以下命令绑定该服务:
$ skupper service bind hello-world-backend deployment hello-world-backend
-
2.1.3. 将不同命名空间中的服务公开给服务网络
本节介绍如何从未部署 Skupper 的命名空间公开服务。
skupper 允许您为任何站点从其他命名空间中公开 Kubernetes 服务。但是,如果要公开工作负载,如部署,您必须创建一个站点,如本节所述。
先决条件
- 部署 Skupper 的命名空间。
- 允许命名空间间通信的网络策略
- 如果要公开服务以外的资源,则 cluster-admin 权限
流程
如果要从站点命名空间以外的命名空间中公开工作负载,请使用集群权限创建站点:
注意站点不需要通过
--enable-cluster-permissions
授予的额外权限来公开 Kubernetes 服务资源。$ skupper init --enable-cluster-permissions
从站点命名空间以外的命名空间公开 Kubernetes 服务:
$ skupper expose service <service>.<namespace> --address <service>
- <service> - 服务网络上的服务名称。
- <namespace> - 要公开服务的命名空间的名称。
例如,如果您在
east
命名空间中部署了 Skupper,并在east-
命名空间中创建了一个后端 Kubernetes 服务,您可以将上下文设置为backend
east
命名空间,并使用以下方法将服务作为
后端在服务网络上公开:$ skupper expose service backend.east-backend --port 8080 --address backend
从使用
--enable-cluster-permissions
创建的站点公开工作负载:$ skupper expose <resource> --port <port-number> --target-namespace <namespace>
- <resource> - 资源的名称。
- <namespace> - 要公开运行资源的命名空间名称。
例如,如果您在
east
命名空间中部署了 Skupper,并在east-
部署,您可以将上下文设置为backend
命名空间中创建了后端east
命名空间,并使用以下方法将服务作为
后端在服务网络上公开:$ skupper expose deployment/backend --port 8080 --target-namespace east-backend