第 2 章 指定链接成本
在连接站点时,您可以为每个链接分配一个成本来影响流量流。默认情况下,为新链接将链接成本设置为 1
。在服务网络中,路由算法尝试使用从客户端到目标服务器的最小总成本的路径。
如果您在不同站点间分布服务,您可能需要客户端使用特定的目标或链接。在这种情况下,您可以在替代链接中指定大于
1
的成本,以减少这些链接的使用。注意开放连接的分布是统计,即不是循环系统。
- 如果连接只遍历一个链接,则路径成本等于链接成本。如果连接遍历多个链接,则路径成本是路径中涉及的所有链接的总和。
cost 充当使用客户端到网络中服务器的路径的阈值。当只有一个路径时,无论成本如何,该路径上的流量流都为准。
注意如果您以服务两个目标开始,且其中一个目标不再可用,无论成本如何,剩余路径上的流量流。
- 当客户端到服务器实例或服务有多个路径时,流量在最低成本路径上流,直到连接数量超过替代路径的成本。达到此打开连接阈值后,新连接将分散到替代路径和最低成本路径中。
前提条件
- 您已将 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。
对于第 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
从 with-
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