3.2.12. 使用路由器共享
路由器分片使用 NAMESPACE_LABELS
和 ROUTE_LABELS
来过滤路由器命名空间和路由。这可让您通过多个路由器部署分发路由的子集。通过使用非覆盖的子集,您可以有效地对一组路由进行分区。或者,您可以定义由重叠的路由子集组成的分片。
默认情况下,路由器从所有项目(命名空间)中选择所有路由。分片涉及将标签添加到路由或命名空间,以及向路由器添加标签选择器。每个路由器分片都由一组特定标签选择器或属于由特定标签选择器选择的命名空间来选择的路由组成。
路由器服务帐户必须设置 [集群读取器
] 权限,以允许访问其他命名空间中的标签。
路由器划分和 DNS
由于需要外部 DNS 服务器将请求路由到所需的分片,因此管理员负责为项目中的每个路由器创建单独的 DNS 条目。路由器不会将未知路由转发到另一个路由器。
考虑以下示例:
-
路由器 A 驻留在主机 192.168.0.5 上,并且具有
*.foo.com
的路由。 -
路由器 B 驻留在主机 192.168.1.9 上,并且具有
*.example.com
的路由。
单独的 DNS 条目必须将 *.foo.com 解析为托管 Router A 和 *.example.com 的节点:
-
*.foo.com A IN 192.168.0.5
-
*.example.com A IN 192.168.1.9
路由器分片示例
本节论述了使用命名空间和路由标签进行路由器分片。
图 3.1. 路由器划分基于命名空间标签
使用命名空间标签选择器配置路由器:
$ oc set env dc/router NAMESPACE_LABELS="router=r1"
由于该路由器在命名空间上有一个选择器,因此路由器将仅处理匹配的命名空间的路由。要使此选择器与命名空间匹配,请相应地标记命名空间:
$ oc label namespace default "router=r1"
现在,如果您在 default 命名空间中创建路由,该路由位于默认路由器中:
$ oc create -f route1.yaml
创建新项目(命名空间)并创建路由
route2
:$ oc new-project p1 $ oc create -f route2.yaml
注意路由在路由器中不可用。
标签命名空间
p1
带有router=r1
$ oc label namespace p1 "router=r1"
添加此标签使路由在路由器中可用。
- 示例
一个路由器部署
finops-router
使用标签选择器NAMESPACE_LABELS="name in (finance, ops)"
配置,一个路由器部署dev-router
使用标签选择器NAMESPACE_LABELS="name=dev"
配置。如果所有路由都位于标有
name=finance
、name=ops
和name=dev 的命名空间
中,则此配置会在两个路由器部署之间有效分发您的路由。在上面的场景中,分片成为分区的一种特殊情况,没有重叠的子集。路由在路由器分片之间划分。
路由选择标准适用于路由的分布方式。有可能在路由器部署之间具有重叠的路由子集。
- 示例
除了上例中的
finops-router
和dev-router
外,您还有devops-router
,它使用标签选择器NAMESPACE_LABELS="name in (dev, ops)"
配置。标签为
name=dev
或name=ops
的命名空间中的路由现在由两个不同的路由器部署服务。在这种情况下,您定义了重叠的路由子集,如 基于命名空间标签的路由器交换过程中所示。另外,这可让您创建更复杂的路由规则,允许将优先级更高的流量转移到专用的
finops-router
,同时将较低优先级的流量发送到devops-router
。
基于路由标签的路由器划分
NAMESPACE_LABELS
允许过滤项目来服务并从这些项目中选择所有路由,但您可能希望根据与路由本身相关的其他标准对路由进行分区。ROUTE_LABELS
选择器允许您对路由本身进行分片。
- 示例
使用标签选择器
ROUTE_LABELS="mydeployment=prod"
配置路由器部署prod-router
,路由器部署devtest-router
则配置了标签选择器ROUTE_LABELS="mydeployment in(dev, test)"
。此配置根据路由的标签(无论命名空间如何)在两个路由器部署之间路由。
这个示例假设您有要服务的所有路由,并带有标签
"mydeployment=<tag>"
。
3.2.12.1. 创建路由器分片
本节描述了路由器分片的高级示例。假设有 26 个路由,名为 a
到 z
,且具有不同的标签:
路由上可能的标签
sla=high geo=east hw=modest dept=finance sla=medium geo=west hw=strong dept=dev sla=low dept=ops
这些标签表达了包括服务级别协议、地理位置、硬件要求和部门在内的概念。路由最多可在每列中有一个标签。有些路由可能具有其他标签,或者根本没有标签。
名称 | SLA | 地域 | HW | 部门 | 其他标签 |
---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
| ||
|
|
|
| ||
|
|
|
| ||
|
|
|
| ||
|
|
|
以下是一个便捷脚本 mkshard,它演示了如何一起使用 oc adm router
、oc set env
和 oc scale
来创建路由器分片。
#!/bin/bash # Usage: mkshard ID SELECTION-EXPRESSION id=$1 sel="$2" router=router-shard-$id 1 oc adm router $router --replicas=0 2 dc=dc/router-shard-$id 3 oc set env $dc ROUTE_LABELS="$sel" 4 oc scale $dc --replicas=3 5
运行 mkshard 几次创建多个路由器:
路由器 | 选择表达式 | Routes |
---|---|---|
|
|
|
|
|
|
|
|
|