3.2.12. 使用路由器共享


路由器分片使用 NAMESPACE_LABELSROUTE_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. 路由器划分基于命名空间标签

路由器划分基于命名空间标签
  1. 使用命名空间标签选择器配置路由器:

    $ oc set env dc/router NAMESPACE_LABELS="router=r1"
  2. 由于该路由器在命名空间上有一个选择器,因此路由器将仅处理匹配的命名空间的路由。要使此选择器与命名空间匹配,请相应地标记命名空间:

    $ oc label namespace default "router=r1"
  3. 现在,如果您在 default 命名空间中创建路由,该路由位于默认路由器中:

    $ oc create -f route1.yaml
  4. 创建新项目(命名空间)并创建路由 route2

    $ oc new-project p1
    $ oc create -f route2.yaml

    注意路由在路由器中不可用。

  5. 标签命名空间 p1 带有 router=r1

    $ oc label namespace p1 "router=r1"

添加此标签使路由在路由器中可用。

示例

一个路由器部署 finops-router 使用标签选择器 NAMESPACE_LABELS="name in (finance, ops)" 配置,一个路由器部署 dev-router 使用标签选择器 NAMESPACE_LABELS="name=dev" 配置。

如果所有路由都位于标有 name=financename=opsname=dev 的命名空间 中,则此配置会在两个路由器部署之间有效分发您的路由。

在上面的场景中,分片成为分区的一种特殊情况,没有重叠的子集。路由在路由器分片之间划分。

路由选择标准适用于路由的分布方式。有可能在路由器部署之间具有重叠的路由子集。

示例

除了上例中的 finops-routerdev-router 外,您还有 devops-router,它使用标签选择器 NAMESPACE_LABELS="name in (dev, ops)" 配置。

标签为 name=devname=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部门其他标签

a

high

东部

中等

finance

type=static

b

 

西部

 

type=dynamic

cde

 

中等

 

type=static

g 到 k

 

dev

 

l 到 s

high

 

中等

ops

 

t — z

 

西部

  

type=dynamic

以下是一个便捷脚本 mkshard,它演示了如何一起使用 oc adm routeroc set envoc 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
1
创建的路由器具有名称 router-shard-<id>
2
暂时不要进行扩展。
3
路由器的部署配置。
4
使用 oc set env 设置选择表达式。选择表达式是 ROUTE_LABELS 环境变量的值。
5
向上扩展。

运行 mkshard 几次创建多个路由器:

路由器选择表达式Routes

router-shard-1

sla=high

a, l — s

router-shard-2

geo=west

b, t — z

router-shard-3

dept=dev

g 到 k

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.