7.2. 配置集群入口流量
7.2.1. 集群入口流量配置概述 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了以下从集群外部与集群中运行的服务进行通信的方法。
建议采用以下方法,它们按顺序或首选程度排列:
- 如果您有 HTTP/HTTPS,请使用 Ingress Controller。
- 如果您有 HTTPS 之外的 TLS 加密协议。比如对于使用 SNI 标头的 TLS,请使用 Ingress Controller。
-
否则,请使用负载均衡器、外部 IP 或
NodePort
。
方法 | 用途 |
---|---|
允许访问 HTTP/HTTPS 流量和 HTTPS 以外的 TLS 加密协议(例如,使用 SNI 标头的 TLS)。 | |
允许流量通过从池分配的 IP 地址传到非标准端口。大多数云平台都提供了一种使用负载平衡器 IP 地址启动服务的方法。 | |
允许从机器网络中的一个池到特定 IP 地址的流量。对于裸机安装或类似于裸机的平台,MetalLB 提供了使用负载平衡器 IP 地址启动服务的途径。 | |
允许流量通过特定的 IP 地址传到非标准端口。 | |
在集群中的所有节点上公开某一服务。 |
7.2.1.1. 比较:对外部 IP 地址的容错访问 复制链接链接已复制到粘贴板!
对于提供对外部 IP 地址访问权限的通信方法,另一个考虑因素是对 IP 地址的容错访问。以下功能提供对外部 IP 地址的容错访问。
- IP 故障切换
- IP 故障切换管理一组节点的虚拟 IP 地址池。它通过 Keepalived 和虚拟路由器冗余协议 (VRRP) 实施。IP 故障转移仅仅是第 2 层机制,它依赖于多播。对于某些网络,多播可能有缺点。
- MetalLB
- MetalLB 具有 2 层模式,但它不使用多播。第 2 层模式有一个缺点,它会通过一个节点传输外部 IP 地址的所有流量。
- 手动分配外部 IP 地址
- 您可以使用 IP 地址块配置集群,用于为服务分配外部 IP 地址。默认情况下禁用此功能。此功能非常灵活,但给集群或网络管理员带来了最大的负担。集群已准备好接收目标为外部 IP 的流量,但每个客户必须决定如何将流量路由到节点。
7.2.2. 为服务配置 ExternalIP 复制链接链接已复制到粘贴板!
作为集群管理员,您可以指定可向集群中服务发送流量的集群外部 IP 地址块。
这个功能通常最适用于在裸机硬件上安装的集群。
7.2.2.1. 先决条件 复制链接链接已复制到粘贴板!
- 您的网络基础架构必须将外部 IP 地址的流量路由到集群。
7.2.2.2. 关于 ExternalIP 复制链接链接已复制到粘贴板!
对于非云环境,OpenShift Container Platform 支持使用 ExternalIP 工具在 Service
对象的 spec.externalIPs[]
参数中指定外部 IP 地址。使用 ExternalIP 功能配置的服务与具有 type=NodePort
的服务相似,通过流量定向到本地节点以进行负载均衡。
对于云环境,使用负载均衡器服务自动部署云负载均衡器,以服务端点为目标。
为参数指定值后,OpenShift Container Platform 会为该服务分配额外的虚拟 IP 地址。IP 地址可以存在于您为集群定义的服务网络之外。
因为默认情况下会禁用 ExternalIP,所以启用 ExternalIP 功能可能会给该服务带来安全风险,因为集群内到外部 IP 地址的流量会定向到该服务。此配置意味着集群用户可以截获用于外部资源的敏感流量。
您可以使用 MetalLB 实现或 IP 故障转移部署,将 ExternalIP 资源附加到服务:
- 自动分配一个外部 IP
-
当创建了一个带有
spec.type=LoadBalancer
设置的Service
对象时,OpenShift Container Platform 会从autoAssignCIDRs
CIDR 块中自动为spec.externalIPs[]
分配一个 IP 地址。对于此配置,OpenShift Container Platform 实施负载均衡器服务类型的云版本,并为服务分配 IP 地址。默认情况下,自动分配被禁用,必须由集群管理员配置,如 "Configuration for ExternalIP" 部分所述。 - 手动分配外部 IP
-
OpenShift Container Platform 在创建
Service
对象时使用分配给spec.externalIPs[]
数组的 IP 地址。您不能指定已经被其他服务使用的 IP 地址。
在使用 MetalLB 实现或 IP 故障转移部署来托管外部 IP 地址块后,您必须配置网络基础架构,以确保外部 IP 地址块路由到集群。此配置意味着,IP 地址没有在来自节点的网络接口中配置。要处理流量,您必须使用方法配置路由和访问外部 IP,如静态地址解析协议(ARP)条目。
OpenShift Container Platform 通过添加以下功能来扩展 Kubernetes 中的 ExternalIP 功能:
- 通过可配置策略对用户使用外部 IP 地址的限制
- 根据请求自动将外部 IP 地址分配给服务
7.2.2.3. 其他资源 复制链接链接已复制到粘贴板!
7.2.2.4. 配置 ExternalIP 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中使用外部 IP 地址取决于名为 cluster
的 Network.config.openshift.io
自定义资源(CR)中的以下参数:
-
spec.externalIP.autoAssignCIDRs
定义了一个负载均衡器在为服务选择外部 IP 地址时使用的 IP 地址块。OpenShift Container Platform 只支持单个 IP 地址块进行自动分配。这个配置需要较少的步骤,而不是手动为服务分配 ExternalIP,这需要管理有限共享 IP 地址的端口空间。如果您启用自动分配,则会为带有spec.type=LoadBalancer
的Service
对象分配一个外部 IP 地址。 -
在手动指定 IP 地址时,
spec.externalIP.policy
定义了允许的 IP 地址块。OpenShift Container Platform 不将策略规则应用到您在spec.externalIP.autoAssignCIDRs
参数中定义的 IP 地址块。
如果路由正确,来自配置的外部 IP 地址块的外部流量可以通过服务公开的任何 TCP 或 UDP 端口访问服务端点。
作为集群管理员,您必须配置到 externalIPs 的路由。您还必须确保分配的 IP 地址块在集群中的一个或多个节点上终止。如需更多信息,请参阅 Kubernetes 外部 IP。
OpenShift Container Platform 支持自动和手动分配 IP 地址,保证每个地址都被分配到最多一个服务。这个配置可保证,无论由其他服务公开的端口是什么,每个服务都可以公开选择的端口。
要使用 OpenShift Container Platform 中由 autoAssignCIDRs
定义 的 IP 地址块,您必须为主机网络配置必要的 IP 地址分配和路由。
以下 YAML 描述了配置了外部 IP 地址的服务:
带有 spec.externalIPs[]
设置的示例 Service
对象
7.2.2.5. 对外部 IP 地址分配的限制 复制链接链接已复制到粘贴板!
作为集群管理员,您可以指定 IP 地址块来允许和拒绝服务的 IP 地址。限制只针对没有 cluster-admin
权限的用户。集群管理员始终可以将服务 spec.externalIPs[]
字段设置为任何 IP 地址。
您可以通过在策略对象中为 spec.ExternalIP.policy
参数指定无类别域间路由(CIDR)地址块来配置 IP 地址 policy
。
policy
对象及其 CIDR 参数的 JSON 格式示例
在配置策略限制时,会应用以下规则:
-
如果
policy
设置为{}
,创建带有spec.ExternalIPs[]
的Service
对象会导致服务失败。此设置是 OpenShift Container Platform 的默认设置。相同的行为存在于policy: null
。 如果设置了
policy
,并且设置了policy.allowedCIDRs[]
或policy.rejectedCIDRs[]
,则应用以下规则:-
如果同时设置了
allowedCIDRs[]
和rejectedCIDRs[]
,则rejectedCIDRs[]
优先于allowedCIDRs[]
。 -
如果设置了
allowedCIDRs[]
,只有在允许指定的 IP 地址时,创建带有spec.ExternalIPs[]
的Service
对象才能成功。 -
如果设置了
rejectedCIDRs[]
,只有在指定的 IP 地址未被拒绝时,创建带有spec.ExternalIPs[]
的Service
对象才能成功。
-
如果同时设置了
7.2.2.6. 策略对象示例 复制链接链接已复制到粘贴板!
本节中的示例显示不同的 spec.externalIP.policy
配置。
在以下示例中,策略会阻止 OpenShift Container Platform 使用指定的外部 IP 地址创建任何服务。
拒绝为
Service
对象spec.externalIPs[]
指定的任何值的策略示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例中,设置了
allowedCIDRs
和rejectedCIDRs
字段。包括允许和拒绝 CIDR 块的策略示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例中,
policy
设置为{}
。使用这个配置,使用oc get network.config.openshift.io -o yaml
命令查看配置意味着policy
参数不会显示在命令输出上。相同的行为存在于policy: null
。允许为
Service
对象spec.externalIPs[]
指定的任何值的示例策略Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.2.7. ExternalIP 地址块配置 复制链接链接已复制到粘贴板!
ExternalIP 地址块的配置由名为 cluster
的网络自定义资源(CR)定义。Network CR 是 config.openshift.io
API 组的一部分。
在集群安装过程中,Cluster Version Operator(CVO)会自动创建一个名为 cluster
的网络 CR。不支持创建此类型的任何其他 CR 对象。
以下 YAML 描述了 ExternalIP 配置:
network.config.openshift.io CR 名为 cluster
以下 YAML 描述了 policy
小节的字段:
network.config.openshift.io policy
小节
policy: allowedCIDRs: [] rejectedCIDRs: []
policy:
allowedCIDRs: []
rejectedCIDRs: []
外部 IP 配置示例
以下示例中显示了外部 IP 地址池的一些可能配置:
以下 YAML 描述了启用自动分配外部 IP 地址的配置:
带有
spec.externalIP.autoAssignCIDRs
的配置示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下 YAML 为允许的和被拒绝的 CIDR 范围配置策略规则:
带有
spec.externalIP.policy
的示例配置Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.2.8. 为集群配置外部 IP 地址块 复制链接链接已复制到粘贴板!
作为集群管理员,可以配置以下 ExternalIP 设置:
-
OpenShift Container Platform 用来自动填充
Service
对象的spec.clusterIP
字段的 ExternalIP 地址块。 -
用于限制可手动分配给
Service
对象的spec.clusterIP
数组的 IP 地址的策略对象。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
角色的用户访问集群。
流程
可选: 要显示当前的外部 IP 配置,请输入以下命令:
oc describe networks.config cluster
$ oc describe networks.config cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要编辑配置,请输入以下命令:
oc edit networks.config cluster
$ oc edit networks.config cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 修改 ExternalIP 配置,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定
externalIP
小节的配置。
要确认更新的 ExternalIP 配置,请输入以下命令:
oc get networks.config cluster -o go-template='{{.spec.externalIP}}{{"\n"}}'
$ oc get networks.config cluster -o go-template='{{.spec.externalIP}}{{"\n"}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.2.9. 后续步骤 复制链接链接已复制到粘贴板!
7.2.3. 使用 Ingress Controller 配置集群入口流量 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了从集群外部与集群中运行的服务进行通信的方法。此方法使用了 Ingress Controller。
7.2.3.1. 使用 Ingress Controller 和路由 复制链接链接已复制到粘贴板!
Ingress Operator 管理 Ingress Controller 和通配符 DNS。
使用 Ingress Controller 是允许从外部访问 OpenShift Container Platform 集群的最常用方法。
Ingress Controller 配置为接受外部请求并根据配置的路由进行代理。这仅限于 HTTP、使用 SNI 的 HTTPS 以及使用 SNI 的 TLS,对于通过使用 SNI 的 TLS 工作的 Web 应用程序和服务而言已经足够。
与管理员合作将 Ingress Controller 配置为接受外部请求并根据配置的路由进行代理。
管理员可以创建通配符 DNS 条目,再设置 Ingress Controller。然后,您可以处理边缘 Ingress Controller,无需与管理员联系。
默认情况下,集群中的每个 Ingress Controller 都可以接受集群中任何项目中创建的所有路由。
Ingress Controller:
- 默认有两个副本;即,它应该在两个 worker 节点上运行。
- 可以纵向扩张,以在更多节点上具有更多副本。
这部分中的流程需要由集群管理员执行先决条件。
7.2.3.2. 先决条件 复制链接链接已复制到粘贴板!
在开始以下流程前,管理员必须:
- 设置集群联网环境的外部端口,使请求能够到达集群。
确定至少有一个用户具有集群管理员角色。要将此角色添加到用户,请运行以下命令:
oc adm policy add-cluster-role-to-user cluster-admin username
$ oc adm policy add-cluster-role-to-user cluster-admin username
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 有一个 OpenShift Container Platform 集群,其至少有一个 master 和至少一个节点,并且集群外有一个对集群具有网络访问权限的系统。此流程假设外部系统与集群位于同一个子网。不同子网上外部系统所需要的额外联网不在本主题的讨论范围内。
7.2.3.3. 创建项目和服务 复制链接链接已复制到粘贴板!
如果要公开的项目和服务不存在,请创建项目,然后创建该服务。
如果项目和服务都已存在,跳到公开服务以创建路由这一步。
先决条件
-
安装 OpenShift CLI (
oc
),并以集群管理员身份登录。
流程
运行
oc new-project
命令为您的服务创建一个新项目:oc new-project <project_name>
$ oc new-project <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc new-app
命令来创建服务:oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证该服务是否已创建,请运行以下命令:
oc get svc -n <project_name>
$ oc get svc -n <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意默认情况下,新服务没有外部 IP 地址。
7.2.3.4. 通过创建路由公开服务 复制链接链接已复制到粘贴板!
您可以使用 oc expose
命令,将服务公开为路由。
先决条件
- 已登陆到 OpenShift Container Platform。
流程
登录您想公开的服务所在的项目:
oc project <project_name>
$ oc project <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
oc expose service
命令以公开路由:oc expose service nodejs-ex
$ oc expose service nodejs-ex
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
route.route.openshift.io/nodejs-ex exposed
route.route.openshift.io/nodejs-ex exposed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证该服务是否已公开,您可以使用
curl
等工具来检查该服务是否可从集群外部访问。要查找路由的主机名,请输入以下命令:
oc get route
$ oc get route
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD nodejs-ex nodejs-ex-myproject.example.com nodejs-ex 8080-tcp None
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD nodejs-ex nodejs-ex-myproject.example.com nodejs-ex 8080-tcp None
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要检查主机是否响应 GET 请求,请输入以下命令:
curl
命令示例curl --head nodejs-ex-myproject.example.com
$ curl --head nodejs-ex-myproject.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
HTTP/1.1 200 OK ...
HTTP/1.1 200 OK ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.3.5. OpenShift Container Platform 中的 Ingress 分片 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,Ingress Controller 可以服务所有路由,也可以提供路由的子集。默认情况下,Ingress Controller 提供集群中任何命名空间中创建的任何路由。您可以在集群中添加额外的 Ingress Controller,以通过创建 分片来优化路由,这些分片是基于所选特征的路由子集。要将路由标记为分片的成员,请使用 route 或 namespace metadata
字段中的标签。Ingress Controller 使用选择器 (也称为 选择表达式 )从要提供服务的整个路由池中选择路由子集。
当您希望在多个 Ingress Controller 之间负载平衡传入的流量时,当您要隔离到特定 Ingress Controller 的流量或下一部分中描述的各种其他原因时,Ingress 分片很有用。
默认情况下,每个路由都使用集群的默认域。但是,可以将路由配置为使用路由器的域。
7.2.3.6. Ingress Controller 分片 复制链接链接已复制到粘贴板!
您可以通过向路由、命名空间或两者添加标签,使用 Ingress 分片(也称为路由器分片)在多个路由器之间分发一组路由。Ingress Controller 使用一组对应的选择器来只接受具有指定标签的路由。每个 Ingress 分片都由使用给定选择表达式过滤的路由组成。
Ingress Controller 是网络流量进入集群的主要机制,因此对它们的需求可能非常大。作为集群管理员,您可以对路由进行分片,以达到以下目的:
- 在 Ingress Controller 或路由器与一些路由之间实现平衡,由此加快对变更的响应。
- 分配特定的路由,使其具有不同于其它路由的可靠性保证。
- 允许特定的 Ingress Controller 定义不同的策略。
- 只允许特定的路由使用其他功能。
- 在不同的地址上公开不同的路由,例如使内部和外部用户能够看到不同的路由。
- 在蓝绿部署期间,将流量从应用的一个版本转移到另一个版本。
当 Ingress Controller 被分片时,一个给定路由被接受到组中的零个或多个 Ingress Controller。路由的状态描述了 Ingress Controller 是否已接受它。只有一个路由对一个分片是唯一的时,Ingress Controller 才会接受路由。
使用分片,您可以在多个 Ingress Controller 上分发路由子集。这些子集可以是非重叠的,也称为 传统 分片,或是重叠的,也称为 overlapped 分片。
下表概述了三分片方法:
分片方法 | 描述 |
---|---|
命名空间选择器 | 将命名空间选择器添加到 Ingress Controller 后,在与命名空间选择器匹配的命名空间中的所有路由都包含在 Ingress shard 中。当 Ingress Controller 提供在命名空间中创建的所有路由时,请考虑此方法。 |
路由选择器 | 将路由选择器添加到 Ingress Controller 后,所有与路由选择器匹配的标签的路由都包含在 Ingress shard 中。当您希望 Ingress Controller 仅服务命名空间中的路由子集或特定路由时,请考虑此方法。 |
命名空间和路由选择器 | 为命名空间选择器和路由选择器方法提供 Ingress Controller 范围。当您想获得命名空间选择器和路由选择器方法的灵活性时,请考虑此方法。 |
7.2.3.6.1. 传统分片示例 复制链接链接已复制到粘贴板!
配置了 Ingress Controller finops-router
的示例,其标签选择器 spec.namespaceSelector.matchExpressions
,其键值为 finance
和 ops
:
finops-router
的 YAML 定义示例
配置了 Ingress Controller dev-router
的示例,其标签选择器 spec.namespaceSelector.matchLabels.name
,其键值为 dev
:
dev-router
的 YAML 定义示例
如果所有应用程序路由都位于单独的命名空间中,每个命名空间都分别使用 name:finance
、name:ops
和 name:dev
标记,此配置会在两个 Ingress Controller 之间有效分发您的路由。不应处理用于控制台、身份验证和其他目的的 OpenShift Container Platform 路由。
在前面的场景中,分片成为分区的一种特殊情况,没有重叠的子集。路由在路由器分片之间划分。
默认
Ingress Controller 继续提供所有路由,除非 namespaceSelector
或 routeSelector
字段包含用于排除的路由。有关如何从默认 Ingress Controller 中排除路由的更多信息,请参阅这个 红帽知识库解决方案 和"分片默认 Ingress Controller"。
7.2.3.6.2. 重叠的分片示例 复制链接链接已复制到粘贴板!
配置了 Ingress Controller devops-router
的示例,其标签选择器 spec.namespaceSelector.matchExpressions
,其键值为 finance
和 ops
:
devops-router
的 YAML 定义示例
标签为 name:dev
和 name:ops
的命名空间中的路由现在由两个不同的 Ingress Controller 服务。使用这个配置,您有重叠的路由子集。
通过重叠的路由子集,您可以创建更复杂的路由规则。例如,您可以在向 devops-router
发送较低优先级的流量时,将优先级更高的流量放入专用的 finops-router
。
7.2.3.6.3. 分片默认 Ingress Controller 复制链接链接已复制到粘贴板!
创建新的 Ingress shard 后,可能会接受到默认 Ingress Controller 接受的新 Ingress 分片的路由。这是因为默认 Ingress Controller 没有选择器,并默认接受所有路由。
您可以使用命名空间选择器或路由选择器来限制 Ingress Controller 使用特定标签提供路由。以下流程限制默认 Ingress Controller,使用命名空间选择器为新分片的 finance
、ops
和 dev
提供。这为 Ingress 分片增加了额外的隔离。
您必须在同一 Ingress Controller 上保留所有 OpenShift Container Platform 管理路由。因此,避免在排除这些基本路由的默认 Ingress Controller 中添加额外的选择器。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 您以项目管理员身份登录。
流程
运行以下命令来修改默认 Ingress Controller:
oc edit ingresscontroller -n openshift-ingress-operator default
$ oc edit ingresscontroller -n openshift-ingress-operator default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑 Ingress Controller 以包含一个
namespaceSelector
,它排除了任何finance
、ops
和dev
标签的路由:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
默认 Ingress Controller 不再提供标记为 name:finance
、name:ops
和 name:dev
的命名空间。
7.2.3.6.4. Ingress 分片和 DNS 复制链接链接已复制到粘贴板!
集群管理员负责为项目中的每个路由器生成单独的 DNS 条目。路由器不会将未知路由转发到另一个路由器。
考虑以下示例:
-
路由器 A 驻留在主机 192.168.0.5 上,并且具有
*.foo.com
的路由。 -
路由器 B 驻留在主机 192.168.1.9 上,并且具有
*.example.com
的路由。
单独的 DNS 条目必须将 *.foo.com
解析为托管 Router A 和 *.example.com
的节点到托管路由器 B 的节点:
-
*.foo.com A IN 192.168.0.5
-
*.example.com A IN 192.168.1.9
7.2.3.6.5. 通过路由标签(label)配置 Ingress Controller 分片 复制链接链接已复制到粘贴板!
使用路由标签进行 Ingress Controller 分片,意味着 Ingress Controller 提供由路由选择器选择的任意命名空间中的所有路由。
图 7.1. 使用路由标签进行 Ingress 分片
在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。
流程
编辑
router-internal.yaml
文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定 Ingress Controller 使用的域。此域必须与默认 Ingress Controller 域不同。
应用 Ingress Controller
router-internal.yaml
文件:oc apply -f router-internal.yaml
# oc apply -f router-internal.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress Controller 选择具有
type: sharded
标签的任意命名空间中的路由。使用
router-internal.yaml
中配置的域创建新路由:oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
$ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.3.6.6. 使用命名空间标签配置 Ingress Controller 分片 复制链接链接已复制到粘贴板!
使用命名空间标签进行 Ingress Controller 分片,意味着 Ingress Controller 提供由命名空间选择器选择的任意命名空间中的所有路由。
图 7.2. 使用命名空间标签进行 Ingress 分片
在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。
流程
编辑
router-internal.yaml
文件:cat router-internal.yaml
$ cat router-internal.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定 Ingress Controller 使用的域。此域必须与默认 Ingress Controller 域不同。
应用 Ingress Controller
router-internal.yaml
文件:oc apply -f router-internal.yaml
$ oc apply -f router-internal.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress Controller 选择由命名空间选择器选择的具有
type: sharded
标签的任意命名空间中的路由。使用
router-internal.yaml
中配置的域创建新路由:oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
$ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.3.6.7. 为 Ingress Controller 分片创建路由 复制链接链接已复制到粘贴板!
通过使用路由,您可以通过 URL 托管应用程序。在这种情况下,主机名没有被设置,路由会使用子域。当您指定子域时,会自动使用公开路由的 Ingress Controller 域。对于由多个 Ingress Controller 公开路由的情况,路由由多个 URL 托管。
以下流程描述了如何为 Ingress Controller 分片创建路由,使用 hello-openshift
应用程序作为示例。
在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 您以项目管理员身份登录。
- 您有一个 web 应用来公开端口,以及侦听端口流量的 HTTP 或 TLS 端点。
- 您已为分片配置了 Ingress Controller。
流程
运行以下命令,创建一个名为
hello-openshift
的项目:oc new-project hello-openshift
$ oc new-project hello-openshift
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在项目中创建 pod:
oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json
$ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,创建名为
hello-openshift
的服务:oc expose pod/hello-openshift
$ oc expose pod/hello-openshift
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
hello-openshift-route.yaml
的路由定义:为分片创建的路由的 YAML 定义
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过运行以下命令,使用
hello-openshift-route.yaml
创建到hello-openshift
应用程序的路由:oc -n hello-openshift create -f hello-openshift-route.yaml
$ oc -n hello-openshift create -f hello-openshift-route.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用以下命令获取路由的状态:
oc -n hello-openshift get routes/hello-openshift-edge -o yaml
$ oc -n hello-openshift get routes/hello-openshift-edge -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 生成的
Route
资源应类似以下示例:输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
7.2.4. 配置 Ingress Controller 端点发布策略 复制链接链接已复制到粘贴板!
endpointPublishingStrategy
用于向其他网络发布 Ingress Controller 端点,以启用负载均衡器集成,并提供对其他系统的访问。
在 Red Hat OpenStack Platform (RHOSP) 上,只有云供应商配置为创建运行状况监视器时,才会支持 LoadBalancerService
端点发布策略。对于 RHOSP 16.2,只有在您使用 Amphora Octavia 供应商时,才能使用此策略。
如需更多信息,请参阅 RHOSP 安装文档中的"设置 RHOSP Cloud Controller Manager 选项"部分。
7.2.4.1. Ingress Controller 端点发布策略 复制链接链接已复制到粘贴板!
NodePortService
端点发布策略
NodePortService
端点发布策略使用 Kubernetes NodePort 服务发布 Ingress Controller。
在这个配置中,Ingress Controller 部署使用容器网络。创建了一个
NodePortService 来发布部署。特定的节点端口由 OpenShift Container Platform 动态分配; 但是,为了支持静态端口分配,您会保留对受管 NodePortService 的节点端口字段的更改
。
图 7.3. NodePortService 图表
上图显示了与 OpenShift Container Platform Ingress NodePort 端点发布策略相关的以下概念:
- 集群中的所有可用节点均有自己的外部可访问 IP 地址。集群中运行的服务绑定到所有节点的唯一 NodePort。
-
当客户端连接到停机的节点时,例如,通过连接图形中的
10.0.128.4
IP 地址,节点端口将客户端直接连接到运行该服务的可用节点。在这种情况下,不需要负载平衡。如图形中所显,10.0.128.4
地址已不可用,必须使用另一个 IP 地址。
Ingress Operator 忽略对服务的 .spec.ports[].nodePort
字段的任何更新。
默认情况下,端口会自动分配,您可以访问集成的端口分配。但是,有时需要静态分配端口来与现有基础架构集成,这些基础架构可能无法根据动态端口进行重新配置。要实现与静态节点端口的集成,您可以直接更新受管服务资源。
如需有关 daemonset 的更多信息,请参阅关于 NodePort
的 Kubernetes 服务文档。
HostNetwork
端点发布策略
HostNetwork
端点发布策略会在部署 Ingress Controller 的节点端口上发布 Ingress Controller。
带有 HostNetwork
端点发布策略的 Ingress Controller 每个节点只能有一个 pod 副本。如果您想要 n 个副本,则必须至少使用可调度这些副本的 n 个节点。因为每个 Pod 副本都会通过调度的节点主机上的端口 80
和 443
进行请求,所以如果同一节点上的其他 pod 使用这些端口,则无法将副本调度到该节点。
HostNetwork
对象有一个 hostNetwork
字段,它有以下用于可选绑定端口的默认值:httpPort: 80
, httpsPort: 443
, 和 statsPort: 1936
。通过为您的网络指定不同的绑定端口,您可以为 HostNetwork
策略在同一节点上部署多个 Ingress Controller。
Example
7.2.4.1.1. 将 Ingress Controller 端点发布范围配置为 Internal 复制链接链接已复制到粘贴板!
当集群管理员在没有指定集群为私有的情况下安装新集群时,将默认 Ingress Controller 创建,并将 scope
设置为 External
。集群管理员可以将 External
范围的 Ingress Controller 更改为 Internal
。
先决条件
-
已安装
oc
CLI。
流程
要将
External
范围的 Ingress Controller 更改为Internal
,请输入以下命令:oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'
$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要检查 Ingress Controller 的状态,请输入以下命令:
oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
$ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Progressing
状态条件指示您必须执行进一步的操作。例如,状态条件可以通过输入以下命令来指示需要删除该服务:oc -n openshift-ingress delete services/router-default
$ oc -n openshift-ingress delete services/router-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果删除了该服务,Ingress Operator 会重新创建为
Internal
。
7.2.4.1.2. 配置 Ingress Controller 端点发布范围到外部 复制链接链接已复制到粘贴板!
当集群管理员在没有指定集群为私有的情况下安装新集群时,将默认 Ingress Controller 创建,并将 scope
设置为 External
。
Ingress Controller 的范围可以在安装过程中或之后配置为 Internal
,集群管理员可以将 内部
Ingress Controller 更改为 External
。
在某些平台上,需要删除并重新创建服务。
更改范围可能会导致 Ingress 流量中断,这可能会持续几分钟。这适用于需要删除和重新创建服务的平台,因为流程可能会导致 OpenShift Container Platform 取消置备现有服务负载均衡器、置备一个新服务负载均衡器并更新 DNS。
先决条件
-
已安装
oc
CLI。
流程
要将
内部
范围的 Ingress Controller 更改为外部
,请输入以下命令:oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'
$ oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要检查 Ingress Controller 的状态,请输入以下命令:
oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
$ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Progressing
状态条件指示您必须执行进一步的操作。例如,状态条件可以通过输入以下命令来指示需要删除该服务:oc -n openshift-ingress delete services/router-default
$ oc -n openshift-ingress delete services/router-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果删除了该服务,Ingress Operator 会重新创建为
External
。
7.2.4.1.3. 在 Ingress Controller 中添加单个 NodePort 服务 复制链接链接已复制到粘贴板!
您可以创建自定义 Ingress Controller 以使用 NodePortService
端点发布策略,而不是为各个项目创建 NodePort
类型 Service
。要防止端口冲突,在您要通过 Ingress 分片将一组路由应用到可能具有 HostNetwork
Ingress Controller 的节点时,请考虑 Ingress Controller 的此配置。
在为每个项目设置 NodePort
类型 Service
前,请阅读以下注意事项:
- 您必须为 Nodeport Ingress Controller 域创建一个通配符 DNS 记录。Nodeport Ingress Controller 路由可以从 worker 节点的地址访问。有关路由所需的 DNS 记录的更多信息,请参阅"用户置备 DNS 要求"。
-
您必须为您的服务公开路由,并为自定义 Ingress Controller 域指定
--hostname
参数。 -
您必须在路由中附加分配给
NodePort
类型Service
的端口,以便您可以访问应用容器集。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
权限的用户身份登录。 - 您创建了通配符 DNS 记录。
流程
为 Ingress Controller 创建自定义资源 (CR) 文件:
定义
IngressController
对象的信息的 CR 文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为
IngressController
CR 指定一个自定义名称
。 - 2
- Ingress Controller 服务的 DNS 名称。例如,默认的 ingresscontroller 域是
apps.ipi-cluster.example.com
,因此您要将<custom_ic_domain_name>
指定为nodeportsvc.ipi-cluster.example.com
。 - 3
- 指定包含自定义 Ingress Controller 的节点的标签。
- 4
- 指定一组命名空间的标签。使用键值对替换
<key>:<value>
,其中<key>
是新标签的唯一名称,<value>
是它的值。例如:ingresscontroller: custom-ic
。
使用
oc label node
命令给节点添加标签:oc label node <node_name> <key>=<value>
$ oc label node <node_name> <key>=<value>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 其中
<value>
必须与IngressController
CR 的nodePlacement
部分中指定的键值对匹配。
创建
IngressController
对象:oc create -f <ingress_controller_cr>.yaml
$ oc create -f <ingress_controller_cr>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查找为
IngressController
CR 创建的服务的端口:oc get svc -n openshift-ingress
$ oc get svc -n openshift-ingress
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示
router-nodeport-custom-ic3
服务的端口80:32432/TCP
的示例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-internal-default ClusterIP 172.30.195.74 <none> 80/TCP,443/TCP,1936/TCP 223d router-nodeport-custom-ic3 NodePort 172.30.109.219 <none> 80:32432/TCP,443:31366/TCP,1936:30499/TCP 155m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-internal-default ClusterIP 172.30.195.74 <none> 80/TCP,443/TCP,1936/TCP 223d router-nodeport-custom-ic3 NodePort 172.30.109.219 <none> 80:32432/TCP,443:31366/TCP,1936:30499/TCP 155m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要创建新项目,请输入以下命令:
oc new-project <project_name>
$ oc new-project <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要标记新命名空间,请输入以下命令:
oc label namespace <project_name> <key>=<value>
$ oc label namespace <project_name> <key>=<value>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 其中
<key>=<value>
需要与 Ingress Controller CR 的namespaceSelector
部分中的值匹配。
在集群中创建新应用程序:
oc new-app --image=<image_name>
$ oc new-app --image=<image_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 一个
<image_name>
的示例是quay.io/openshifttest/hello-openshift:multiarch
。
为服务创建
Route
对象,以便 pod 可以使用该服务向集群外部公开应用程序。oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name>
$ oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您必须在
--hostname
参数中指定自定义 Ingress Controller 的域名。如果没有这样做,Ingress Operator 会使用默认的 Ingress Controller 来提供集群的所有路由。检查路由是否具有
Admitted
状态,并且包含自定义 Ingress Controller 的元数据:oc get route/hello-openshift -o json | jq '.status.ingress'
$ oc get route/hello-openshift -o json | jq '.status.ingress'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新默认的
IngressController
CR,以防止默认 Ingress Controller 管理NodePort
类型Service
。默认 Ingress Controller 将继续监控所有其他集群流量。oc patch --type=merge -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"namespaceSelector":{"matchExpressions":[{"key":"<key>","operator":"NotIn","values":["<value>]}]}}}'
$ oc patch --type=merge -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"namespaceSelector":{"matchExpressions":[{"key":"<key>","operator":"NotIn","values":["<value>]}]}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
输入以下命令验证 DNS 条目是否可以在集群内部和外部路由。命令输出之前从运行
oc label node
命令接收标签的节点的 IP 地址。dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
$ dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证集群是否使用来自外部 DNS 服务器的 IP 地址进行 DNS 解析,请输入以下命令检查集群的连接:
curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port>
$ curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Hello OpenShift!
Hello OpenShift!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.5. 使用负载均衡器配置集群入口流量 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了从集群外部与集群中运行的服务进行通信的方法。此方法使用了负载均衡器。
7.2.5.1. 使用负载均衡器使流量进入集群 复制链接链接已复制到粘贴板!
如果不需要具体的外部 IP 地址,您可以配置负载均衡器服务,以便从外部访问 OpenShift Container Platform 集群。
负载均衡器服务分配唯一 IP。负载均衡器有单一边缘路由器 IP,它可以是虚拟 IP (VIP),但仍然是一台用于初始负载均衡的计算机。
如果配置了池,则会在基础架构一级进行,而不是由集群管理员完成。
这部分中的流程需要由集群管理员执行先决条件。
7.2.5.2. 先决条件 复制链接链接已复制到粘贴板!
在开始以下流程前,管理员必须:
- 设置集群联网环境的外部端口,使请求能够到达集群。
确定至少有一个用户具有集群管理员角色。要将此角色添加到用户,请运行以下命令:
oc adm policy add-cluster-role-to-user cluster-admin username
$ oc adm policy add-cluster-role-to-user cluster-admin username
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 有一个 OpenShift Container Platform 集群,其至少有一个 master 和至少一个节点,并且集群外有一个对集群具有网络访问权限的系统。此流程假设外部系统与集群位于同一个子网。不同子网上外部系统所需要的额外联网不在本主题的讨论范围内。
7.2.5.3. 创建项目和服务 复制链接链接已复制到粘贴板!
如果要公开的项目和服务不存在,请创建项目,然后创建该服务。
如果项目和服务都已存在,跳到公开服务以创建路由这一步。
先决条件
-
安装 OpenShift CLI (
oc
),并以集群管理员身份登录。
流程
运行
oc new-project
命令为您的服务创建一个新项目:oc new-project <project_name>
$ oc new-project <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc new-app
命令来创建服务:oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证该服务是否已创建,请运行以下命令:
oc get svc -n <project_name>
$ oc get svc -n <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意默认情况下,新服务没有外部 IP 地址。
7.2.5.4. 通过创建路由公开服务 复制链接链接已复制到粘贴板!
您可以使用 oc expose
命令,将服务公开为路由。
先决条件
- 已登陆到 OpenShift Container Platform。
流程
登录您想公开的服务所在的项目:
oc project <project_name>
$ oc project <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
oc expose service
命令以公开路由:oc expose service nodejs-ex
$ oc expose service nodejs-ex
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
route.route.openshift.io/nodejs-ex exposed
route.route.openshift.io/nodejs-ex exposed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证该服务是否已公开,您可以使用
curl
等工具来检查该服务是否可从集群外部访问。要查找路由的主机名,请输入以下命令:
oc get route
$ oc get route
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD nodejs-ex nodejs-ex-myproject.example.com nodejs-ex 8080-tcp None
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD nodejs-ex nodejs-ex-myproject.example.com nodejs-ex 8080-tcp None
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要检查主机是否响应 GET 请求,请输入以下命令:
curl
命令示例curl --head nodejs-ex-myproject.example.com
$ curl --head nodejs-ex-myproject.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
HTTP/1.1 200 OK ...
HTTP/1.1 200 OK ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.5.5. 创建负载均衡器服务 复制链接链接已复制到粘贴板!
使用以下流程来创建负载均衡器服务。
先决条件
- 确保您要公开的项目和服务已经存在。
- 您的云供应商支持负载均衡器。
流程
创建负载均衡器服务:
- 登录 OpenShift Container Platform。
加载您要公开的服务所在的项目。
oc project project1
$ oc project project1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 control plane 节点上打开文本文件并粘贴以下文本,根据需要编辑该文件:
负载均衡器配置文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意要将通过负载均衡器的流量限制到特定的 IP 地址,建议使用 Ingress Controller 字段
spec.endpointPublishingStrategy.loadBalancer.allowedSourceRanges
。不要设置loadBalancerSourceRanges
字段。- 保存并退出 文件。
运行以下命令来创建服务:
oc create -f <file-name>
$ oc create -f <file-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
oc create -f mysql-lb.yaml
$ oc create -f mysql-lb.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 执行以下命令以查看新服务:
oc get svc
$ oc get svc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE egress-2 LoadBalancer 172.30.22.226 ad42f5d8b303045-487804948.example.com 3306:30357/TCP 15m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE egress-2 LoadBalancer 172.30.22.226 ad42f5d8b303045-487804948.example.com 3306:30357/TCP 15m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果启用了云供应商,该服务会自动分配到一个外部 IP 地址。
在 master 上,使用 cURL 等工具来确保您可以通过公共 IP 地址访问该服务:
curl <public-ip>:<port>
$ curl <public-ip>:<port>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
curl 172.29.121.74:3306
$ curl 172.29.121.74:3306
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此部分中的示例使用 MySQL 服务,这需要客户端应用程序。如果您得到一串字符并看到
Got packets out of order
消息,则您已连接到该服务:如果您有 MySQL 客户端,请使用标准 CLI 命令登录:
mysql -h 172.30.131.89 -u admin -p
$ mysql -h 172.30.131.89 -u admin -p
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. MySQL [(none)]>
Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. MySQL [(none)]>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.6. 在 AWS 上配置集群入口流量 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了从集群外部与集群中运行的服务进行通信的方法。此方法使用 AWS 上的负载均衡器,特别是 Network Load Balancer(NLB)或 Classic Load Balancer(CLB)。两种负载均衡器都可以将客户端的 IP 地址转发到节点,但 CLB 需要支持代理协议(OpenShift Container Platform 会自动启用)。
将 Ingress Controller 配置为使用 NLB 的方法有两种:
-
通过强制替换当前使用 CLB 的 Ingress Controller。这会删除
IngressController
对象,并在新的 DNS 记录传播并置备 NLB 时发生停机。 -
通过编辑使用 CLB 的现有 Ingress Controller 以使用 NLB。这会更改负载均衡器而无需删除并重新创建
IngressController
对象。
两种方法都可用于从 NLB 切换到 CLB。
您可以在新的或现有 AWS 集群上配置这些负载均衡器。
7.2.6.1. 在 AWS 中配置 Classic Load Balancer 超时 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了为特定路由或 Ingress Controller 设置自定义超时时间的方法。另外,AWS Classic Load Balancer(CLB)都有自己的超时时间,默认的超时时间为 60 秒。
如果 CLB 的超时时间小于路由超时或 Ingress Controller 超时,负载均衡器可以预先终止连接。您可以通过增加路由和 CLB 的超时周期来防止此问题。
7.2.6.1.1. 配置路由超时 复制链接链接已复制到粘贴板!
如果您的服务需要低超时(满足服务级别可用性 (SLA) 目的)或高超时(具有慢速后端的情况),您可以为现有路由配置默认超时。
如果您在 OpenShift Container Platform 集群前面配置了用户管理的外部负载均衡器,请确保用户管理的外部负载均衡器的超时值高于路由的超时值。此配置可防止集群使用的网络的网络出现网络拥塞问题。
先决条件
- 您需要在运行的集群中部署了 Ingress Controller。
流程
使用
oc annotate
命令,为路由添加超时:oc annotate route <route_name> \ --overwrite haproxy.router.openshift.io/timeout=<timeout><time_unit>
$ oc annotate route <route_name> \ --overwrite haproxy.router.openshift.io/timeout=<timeout><time_unit>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 支持的时间单位是微秒 (us)、毫秒 (ms)、秒钟 (s)、分钟 (m)、小时 (h)、或天 (d)。
以下示例在名为
myroute
的路由上设置两秒的超时:oc annotate route myroute --overwrite haproxy.router.openshift.io/timeout=2s
$ oc annotate route myroute --overwrite haproxy.router.openshift.io/timeout=2s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.6.1.2. 配置 Classic Load Balancer 超时 复制链接链接已复制到粘贴板!
您可以为 Classic Load Balancer(CLB)配置默认超时来扩展闲置连接。
先决条件
- 您必须在正在运行的集群中部署了 Ingress Controller。
流程
运行以下命令,为默认的
ingresscontroller
设置 AWS 连接闲置超时:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:运行以下命令来恢复超时的默认值:
oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"loadBalancer":{"providerParameters":{"aws":{"classicLoadBalancer": \ {"connectionIdleTimeout":null}}}}}}}'
$ oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"loadBalancer":{"providerParameters":{"aws":{"classicLoadBalancer": \ {"connectionIdleTimeout":null}}}}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在更改连接超时值时,您必须指定 scope
字段,除非已经设置了当前范围。设置 scope
字段时,如果恢复默认的超时值,则不需要再次这样做。
7.2.6.2. 使用网络负载平衡器在 AWS 上配置集群入口流量 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了从集群外部与集群中运行的服务进行通信的方法。一个这样的方法是使用 Network Load Balancer(NLB)。您可以在新的或现有 AWS 集群上配置 NLB。
您可以将使用 Classic Load Balancer (CLB) 的 Ingress Controller 切换到使用 AWS 上的网络负载平衡器 (NLB) 的 Ingress Controller。
在这些负载均衡器间切换不会删除 IngressController
对象。
此过程可能会导致以下问题:
- 由于新的 DNS 记录传播、新的负载均衡器置备和其他因素而可能需要几分钟的中断。应用此步骤后,Ingress Controller 负载均衡器的 IP 地址和规范名称可能会改变。
- 由于服务注解的变化,会泄漏负载均衡器资源。
流程
修改您要使用 NLB 切换到的现有 Ingress Controller。这个示例假定您的默认 Ingress Controller 具有
外部
范围,且没有其他自定义:ingresscontroller.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果您没有为
spec.endpointPublishingStrategy.loadBalancer.providerParameters.aws.type
字段指定值,Ingress Controller 会使用在安装过程中设置的集群Ingress
配置中的spec.loadBalancer.platform.aws.type
值。提示如果您的 Ingress Controller 有其他要更新的自定义(如更改域),请考虑强制替换 Ingress Controller 定义文件。
运行以下命令,将更改应用到 Ingress Controller YAML 文件:
oc apply -f ingresscontroller.yaml
$ oc apply -f ingresscontroller.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当 Ingress Controller 更新时,可能会有几分钟的停机。
在 AWS 中,您可以将使用 Network Load Balancer (NLB) 的 Ingress Controller 切换到使用 Classic Load Balancer (CLB) 的 Ingress Controller。
在这些负载均衡器间切换不会删除 IngressController
对象。
此流程会导致预期的中断会因为新的 DNS 记录传播、新的负载均衡器置备和其他因素而可能需要几分钟。应用此步骤后,Ingress Controller 负载均衡器的 IP 地址和规范名称可能会改变。
流程
修改您要切换为使用 CLB 的现有 Ingress Controller。这个示例假定您的默认 Ingress Controller 具有
外部
范围,且没有其他自定义:ingresscontroller.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果您没有为
spec.endpointPublishingStrategy.loadBalancer.providerParameters.aws.type
字段指定值,Ingress Controller 会使用在安装过程中设置的集群Ingress
配置中的spec.loadBalancer.platform.aws.type
值。提示如果您的 Ingress Controller 有其他要更新的自定义(如更改域),请考虑强制替换 Ingress Controller 定义文件。
运行以下命令,将更改应用到 Ingress Controller YAML 文件:
oc apply -f ingresscontroller.yaml
$ oc apply -f ingresscontroller.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当 Ingress Controller 更新时,可能会有几分钟的停机。
您可以将使用 Classic 负载平衡器(CLB)的 Ingress Controller 替换为 AWS 上使用网络负载平衡器(NLB)的 Ingress Controller。
此过程可能会导致以下问题:
- 由于新的 DNS 记录传播、新的负载均衡器置备和其他因素而可能需要几分钟的中断。应用此步骤后,Ingress Controller 负载均衡器的 IP 地址和规范名称可能会改变。
- 由于服务注解的变化,会泄漏负载均衡器资源。
流程
创建一个新的默认 Ingress Controller 文件。以下示例假定您的默认 Ingress Controller 具有
外部
范围,且没有其他自定义:ingresscontroller.yml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的默认 Ingress Controller 有其他自定义,请确定您相应地修改该文件。
提示如果您的 Ingress Controller 没有其他自定义,且您只更新负载均衡器类型,请考虑 "Switch the Ingress Controller from using an Classic Load Balancer to a Network Load Balancer" 中详述的步骤。
强制替换 Ingress Controller YAML 文件:
oc replace --force --wait -f ingresscontroller.yml
$ oc replace --force --wait -f ingresscontroller.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 等待 Ingress Controller 已被替换。预计会有几分钟的停机时间。
7.2.6.2.4. 在现有 AWS 集群上配置 Ingress Controller 网络负载均衡器 复制链接链接已复制到粘贴板!
您可以在当前集群中创建一个由 AWS Network Load Balancer(NLB)支持的 Ingress Controller。
先决条件
- 您必须已安装 AWS 集群。
基础架构资源的
PlatformStatus
需要是 AWS。要验证
PlatformStatus
是否为 AWS,请运行:oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.type}'
$ oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.type}' AWS
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
在现有集群中,创建一个由 AWS NLB 支持的 Ingress Controller。
创建 Ingress Controller 清单:
cat ingresscontroller-aws-nlb.yaml
$ cat ingresscontroller-aws-nlb.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在集群中创建资源:
oc create -f ingresscontroller-aws-nlb.yaml
$ oc create -f ingresscontroller-aws-nlb.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在新 AWS 集群上配置 Ingress Controller NLB 之前,您必须完成 创建安装配置文件的步骤。
7.2.6.2.5. 在新 AWS 集群上配置 Ingress Controller 网络负载平衡 复制链接链接已复制到粘贴板!
您可在新集群中创建一个由 AWS Network Load Balancer(NLB)支持的 Ingress Controller。
先决条件
-
创建
install-config.yaml
文件并完成对其所做的任何修改。
流程
在新集群中,创建一个由 AWS NLB 支持的 Ingress Controller。
进入包含安装程序的目录并创建清单:
./openshift-install create manifests --dir <installation_directory>
$ ./openshift-install create manifests --dir <installation_directory>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 对于
<installation_directory>
,请指定含有集群的install-config.yaml
文件的目录的名称。
在
<installation_directory>/manifests/
目录中创建一个名为cluster-ingress-default-ingresscontroller.yaml
的文件:touch <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml
$ touch <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 对于
<installation_directory>
,请指定包含集群的manifests/
目录的目录名称。
创建该文件后,几个网络配置文件位于
manifests/
目录中,如下所示:ls <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml
$ ls <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
cluster-ingress-default-ingresscontroller.yaml
cluster-ingress-default-ingresscontroller.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在编辑器中打开
cluster-ingress-default-ingresscontroller.yaml
文件,并输入描述您想要的 Operator 配置的自定义资源(CR):Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
保存
cluster-ingress-default-ingresscontroller.yaml
文件并退出文本编辑器。 -
可选:备份
manifests/cluster-ingress-default-ingresscontroller.yaml
文件。创建集群时,安装程序会删除manifests/
目录。
您可以为现有集群中的 Ingress Controller 手动指定负载均衡器子网。默认情况下,AWS 会自动发现负载均衡器子网,但在 Ingress Controller 中指定会覆盖它们,从而允许手动进行控制。
先决条件
- 您必须已安装 AWS 集群。
-
您必须知道要映射
IngressController
的子网的名称或 ID。
流程
创建自定义资源(CR)文件。
使用以下内容创建 YAML 文件(如
sample-ingress.yaml
):Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建自定义资源(CR)文件。
在 YAML 文件中添加子网:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用 CR 文件。
保存文件并使用 OpenShift CLI (
oc
) 应用。oc apply -f sample-ingress.yaml
$ oc apply -f sample-ingress.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过检查
IngressController
条件确认负载均衡器已被成功置备。oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
$ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.6.2.7. 更新现有 Ingress Controller 上的子网 复制链接链接已复制到粘贴板!
您可以使用 OpenShift Container Platform 中手动指定的负载均衡器子网更新 IngressController
,以避免中断,以保持服务的稳定性,并确保网络配置与您的特定要求保持一致。以下流程演示了如何选择和应用新子网,验证配置更改,并确认负载均衡器置备成功。
此流程会导致预期的中断会因为新的 DNS 记录传播、新的负载均衡器置备和其他因素而可能需要几分钟。应用此步骤后,Ingress Controller 负载均衡器的 IP 地址和规范名称可能会改变。
流程
要使用手动指定的负载均衡器子网更新 IngressController
,您可以按照以下步骤执行:
修改现有 IngressController 以更新到新子网。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要您可以为每个可用区最多指定一个子网。仅为内部 Ingress Controller 提供外部 Ingress Controller 和专用子网。
运行以下命令,检查
IngressController
上的Progressing
条件以获取如何应用子网更新的说明:oc get ingresscontroller -n openshift-ingress-operator subnets -o jsonpath="{.status.conditions[?(@.type==\"Progressing\")]}" | yq -PC
$ oc get ingresscontroller -n openshift-ingress-operator subnets -o jsonpath="{.status.conditions[?(@.type==\"Progressing\")]}" | yq -PC
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
lastTransitionTime: "2024-11-25T20:19:31Z" message: 'One or more status conditions indicate progressing: LoadBalancerProgressing=True (OperandsProgressing: One or more managed resources are progressing: The IngressController subnets were changed from [...] to [...]. To effectuate this change, you must delete the service: `oc -n openshift-ingress delete svc/router-<name>`; the service load-balancer will then be deprovisioned and a new one created. This will most likely cause the new load-balancer to have a different host name and IP address and cause disruption. To return to the previous state, you can revert the change to the IngressController: [...]' reason: IngressControllerProgressing status: "True" type: Progressing
lastTransitionTime: "2024-11-25T20:19:31Z" message: 'One or more status conditions indicate progressing: LoadBalancerProgressing=True (OperandsProgressing: One or more managed resources are progressing: The IngressController subnets were changed from [...] to [...]. To effectuate this change, you must delete the service: `oc -n openshift-ingress delete svc/router-<name>`; the service load-balancer will then be deprovisioned and a new one created. This will most likely cause the new load-balancer to have a different host name and IP address and cause disruption. To return to the previous state, you can revert the change to the IngressController: [...]' reason: IngressControllerProgressing status: "True" type: Progressing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 要应用更新,请运行以下命令删除与 Ingress 控制器关联的服务:
oc -n openshift-ingress delete svc/router-<name>
$ oc -n openshift-ingress delete svc/router-<name>
验证
要确认负载均衡器已被成功置备,请运行以下命令来检查
IngressController
条件:oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
$ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.6.2.8. 为网络负载平衡器(NLB)配置 AWS Elastic IP (EIP)地址 复制链接链接已复制到粘贴板!
您可以在 Ingress Controller 中为网络负载均衡器(NLB)指定静态 IP (也称为弹性 IP)。这在您要为集群网络配置适当的防火墙规则时很有用。
先决条件
- 您必须已安装 AWS 集群。
-
您必须知道要映射
IngressController
的子网的名称或 ID。
流程
创建一个包含以下内容的 YAML 文件:
sample-ingress.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要您可以为每个可用区最多指定一个子网。仅为外部 Ingress Controller 提供公共子网。您可以为每个子网关联一个 EIP 地址。
输入以下命令保存并应用 CR 文件:
oc apply -f sample-ingress.yaml
$ oc apply -f sample-ingress.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行以下命令,检查
IngressController
条件来确认负载均衡器是否已成功置备:oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
$ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.7. 为服务外部 IP 配置 ingress 集群流量 复制链接链接已复制到粘贴板!
您可以使用 MetalLB 实现或 IP 故障转移部署,将 ExternalIP 资源附加到服务,以便该服务可用于 OpenShift Container Platform 集群外的流量。以这种方式托管外部 IP 地址仅适用于在裸机硬件上安装的集群。
您必须确保正确配置外部网络基础架构,将流量路由到该服务。
7.2.7.1. 先决条件 复制链接链接已复制到粘贴板!
您的集群被配置为启用了 ExternalIP。如需更多信息,请参阅为服务配置 ExternalIPs。
注意对于 egress IP,不要使用相同的 ExternalIP。
7.2.7.2. 将 ExternalIP 附加到服务 复制链接链接已复制到粘贴板!
您可以将 ExternalIP 资源附加到服务。如果您将集群配置为自动将资源附加到服务,您可能不需要手动将 ExternalIP 附加到该服务。
此流程中的示例使用 IP 故障转移配置手动将 ExternalIP 资源附加到集群中的服务。
流程
在 CLI 中输入以下命令来确认 ExternalIP 资源的兼容 IP 地址范围:
oc get networks.config cluster -o jsonpath='{.spec.externalIP}{"\n"}'
$ oc get networks.config cluster -o jsonpath='{.spec.externalIP}{"\n"}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果设置了
autoAssignCIDRs
,且您没有在 ExternalIP 资源中为spec.externalIPs
指定值,OpenShift Container Platform 会自动将 ExternalIP 分配给新的Service
对象。选择以下选项之一将 ExternalIP 资源附加到服务:
如果要创建新服务,请在
spec.externalIPs
字段中指定一个值,在allowedCIDRs
参数中指定一个包括一个或多个有效 IP 地址的数组。支持 ExternalIP 资源的服务 YAML 配置文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您要将 ExternalIP 附加到现有服务中,请输入以下命令。将
<name>
替换为服务名称。将<ip_address>
替换为有效的 ExternalIP 地址。您可以提供多个以逗号分开的 IP 地址。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
oc patch svc mysql-55-rhel7 -p '{"spec":{"externalIPs":["192.174.120.10"]}}'
$ oc patch svc mysql-55-rhel7 -p '{"spec":{"externalIPs":["192.174.120.10"]}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
"mysql-55-rhel7" patched
"mysql-55-rhel7" patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要确认一个 ExternalIP 地址已附加到该服务,请输入以下命令。如果为新服务指定 ExternalIP,您必须首先创建该服务。
oc get svc
$ oc get svc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql-55-rhel7 172.30.131.89 192.174.120.10 3306/TCP 13m
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql-55-rhel7 172.30.131.89 192.174.120.10 3306/TCP 13m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.8. 使用 NodePort 配置集群入口流量 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了从集群外部与集群中运行的服务进行通信的方法。此方法使用了 NodePort
。
7.2.8.1. 使用 NodePort 使流量进入集群 复制链接链接已复制到粘贴板!
使用 NodePort
类型的 Service
资源,在集群中所有节点的特定端口上公开服务。端口在 Service
资源的 .spec.ports[*].nodePort
字段中指定。
使用节点端口需要额外的端口资源。
NodePort
在节点 IP 地址的静态端口上公开服务。默认情况下,NodePort
在 30000
到 32767
的范围内,这意味着,NodePort
不可能与服务的预期端口匹配。例如:端口 8080
可能会在节点的端口 31020
中公开。
管理员必须确保外部 IP 地址路由到节点。
NodePort
和外部 IP 地址互相独立,可以同时使用它们。
这部分中的流程需要由集群管理员执行先决条件。
7.2.8.2. 先决条件 复制链接链接已复制到粘贴板!
在开始以下流程前,管理员必须:
- 设置集群联网环境的外部端口,使请求能够到达集群。
确定至少有一个用户具有集群管理员角色。要将此角色添加到用户,请运行以下命令:
oc adm policy add-cluster-role-to-user cluster-admin <user_name>
$ oc adm policy add-cluster-role-to-user cluster-admin <user_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 有一个 OpenShift Container Platform 集群,其至少有一个 master 和至少一个节点,并且集群外有一个对集群具有网络访问权限的系统。此流程假设外部系统与集群位于同一个子网。不同子网上外部系统所需要的额外联网不在本主题的讨论范围内。
7.2.8.3. 创建项目和服务 复制链接链接已复制到粘贴板!
如果要公开的项目和服务不存在,请创建项目,然后创建该服务。
如果项目和服务都已存在,跳到公开服务以创建路由这一步。
先决条件
-
安装 OpenShift CLI (
oc
),并以集群管理员身份登录。
流程
运行
oc new-project
命令为您的服务创建一个新项目:oc new-project <project_name>
$ oc new-project <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc new-app
命令来创建服务:oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证该服务是否已创建,请运行以下命令:
oc get svc -n <project_name>
$ oc get svc -n <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意默认情况下,新服务没有外部 IP 地址。
7.2.8.4. 通过创建路由公开服务 复制链接链接已复制到粘贴板!
您可以使用 oc expose
命令,将服务公开为路由。
先决条件
- 已登陆到 OpenShift Container Platform。
流程
登录您想公开的服务所在的项目:
oc project <project_name>
$ oc project <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要为应用程序公开节点端口,请输入以下命令修改服务的自定义资源定义 (CRD):
oc edit svc <service_name>
$ oc edit svc <service_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要使用公开的节点端口确认该服务可用,请输入以下命令:
oc get svc -n myproject
$ oc get svc -n myproject
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.217.127 <none> 3306/TCP 9m44s nodejs-ex-ingress NodePort 172.30.107.72 <none> 3306:31345/TCP 39s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.217.127 <none> 3306/TCP 9m44s nodejs-ex-ingress NodePort 172.30.107.72 <none> 3306:31345/TCP 39s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要删除由
oc new-app
命令自动创建的服务,请输入以下命令:oc delete svc nodejs-ex
$ oc delete svc nodejs-ex
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要检查服务节点端口是否已使用
30000-32767
范围内的端口更新,请输入以下命令:oc get svc
$ oc get svc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例输出中,更新的端口为
30327
:输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE httpd NodePort 172.xx.xx.xx <none> 8443:30327/TCP 109s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE httpd NodePort 172.xx.xx.xx <none> 8443:30327/TCP 109s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.9. 使用负载均衡器允许的源范围配置集群入口流量 复制链接链接已复制到粘贴板!
您可以为 IngressController
指定 IP 地址范围列表。这在 endpointPublishingStrategy
为 LoadBalancerService
时,限制访问负载均衡器服务。
7.2.9.1. 配置负载均衡器允许的源范围 复制链接链接已复制到粘贴板!
您可以启用并配置 spec.endpointPublishingStrategy.loadBalancer.allowedSourceRanges
字段。通过配置负载均衡器允许的源范围,您可以将 Ingress Controller 的负载均衡器的访问限制为指定的 IP 地址范围列表。Ingress Operator 协调负载均衡器服务,并根据 AllowedSourceRanges
设置 spec.loadBalancerSourceRanges
字段。
如果您已经在 OpenShift Container Platform 的早期版本中设置了 spec.loadBalancerSourceRanges
字段或负载均衡器服务 anotation service.beta.kubernetes.io/load-balancer-source-ranges
,Ingress Controller 会在升级后开始报告 Progressing=True
。要解决这个问题,设置覆盖 spec.loadBalancerSourceRanges
字段的 AllowedSourceRanges
,并清除 service.beta.kubernetes.io/load-balancer-source-ranges
注解。Ingress Controller 开始报告 Progressing=False
。
先决条件
- 您需要在正在运行的集群中部署了 Ingress Controller。
流程
运行以下命令,为 Ingress Controller 设置允许的源范围 API:
oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"type":"LoadBalancerService", "loadbalancer": \ {"scope":"External", "allowedSourceRanges":["0.0.0.0/0"]}}}}'
$ oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"type":"LoadBalancerService", "loadbalancer": \ {"scope":"External", "allowedSourceRanges":["0.0.0.0/0"]}}}}'
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 示例值
0.0.0.0/0
指定允许的源范围。
7.2.9.2. 迁移到允许的源范围 复制链接链接已复制到粘贴板!
如果您已经设置了注解 service.beta.kubernetes.io/load-balancer-source-ranges
,您可以迁移到允许负载均衡器的源范围。当您设置 AllowedSourceRanges
时,Ingress Controller 根据 AllowedSourceRanges
值设置 spec.loadBalancerSourceRanges
字段,并取消设置 service.beta.kubernetes.io/load-balancer-source-ranges
注解。
如果您已经在 OpenShift Container Platform 的早期版本中设置了 spec.loadBalancerSourceRanges
字段或负载均衡器服务 anotation service.beta.kubernetes.io/load-balancer-source-ranges
,Ingress Controller 会在升级后开始报告 Progressing=True
。要解决这个问题,设置覆盖 spec.loadBalancerSourceRanges
字段的 AllowedSourceRanges
,并清除 service.beta.kubernetes.io/load-balancer-source-ranges
注解。Ingress Controller 再次开始报告 Progressing=False
。
先决条件
-
您已设置了
service.beta.kubernetes.io/load-balancer-source-ranges
注解。
流程
确保设置了
service.beta.kubernetes.io/load-balancer-source-ranges
:oc get svc router-default -n openshift-ingress -o yaml
$ oc get svc router-default -n openshift-ingress -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/load-balancer-source-ranges: 192.168.0.1/32
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/load-balancer-source-ranges: 192.168.0.1/32
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
spec.loadBalancerSourceRanges
字段已取消设置:oc get svc router-default -n openshift-ingress -o yaml
$ oc get svc router-default -n openshift-ingress -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
... spec: loadBalancerSourceRanges: - 0.0.0.0/0 ...
... spec: loadBalancerSourceRanges: - 0.0.0.0/0 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 将集群更新至 OpenShift Container Platform 4.19。
运行以下命令,为
ingresscontroller
设置允许的源范围 API:oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"loadBalancer":{"allowedSourceRanges":["0.0.0.0/0"]}}}}'
$ oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"loadBalancer":{"allowedSourceRanges":["0.0.0.0/0"]}}}}'
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 示例值
0.0.0.0/0
指定允许的源范围。
7.2.10. 修补现有入口对象 复制链接链接已复制到粘贴板!
您可以在不重新创建对象或中断服务的情况下更新或修改现有 Ingress
对象的以下字段:
- Specifications
- Host
- 路径
- 后端服务
- SSL/TLS 设置
- 注解
7.2.10.1. 修补 Ingress 对象以解析 ingressWithoutClassName 警报 复制链接链接已复制到粘贴板!
ingressClassName
字段指定 IngressClass
对象的名称。您必须为每个 Ingress
对象定义 ingressClassName
字段。
如果您还没有为 Ingress
对象定义 ingressClassName
字段,您可能会遇到路由问题。24 小时后,您将收到 ingressWithoutClassName
警报,以提醒您设置 ingressClassName
字段。
流程
使用完成的 ingressClassName
字段对 Ingress
对象进行补丁,以确保正确路由和功能。
列出所有
IngressClass
对象:oc get ingressclass
$ oc get ingressclass
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有命名空间中的所有
Ingress
对象:oc get ingress -A
$ oc get ingress -A
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对
Ingress
对象进行补丁:oc patch ingress/<ingress_name> --type=merge --patch '{"spec":{"ingressClassName":"openshift-default"}}'
$ oc patch ingress/<ingress_name> --type=merge --patch '{"spec":{"ingressClassName":"openshift-default"}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<ingress_name>
替换为Ingress
对象的名称。此命令对Ingress
对象进行补丁,使其包含所需的入口类名称。
7.2.11. 将 Load Balancers 分配给特定的子网 复制链接链接已复制到粘贴板!
您可以通过分配负载均衡器来有效地管理应用程序流量。网络管理员可以分配负载均衡器来自定义部署,这些部署可以确保最佳流量分布、应用程序高可用性、不间断的服务和网络分段。
7.2.11.1. 将 API 和 Ingress Load Balancers 分配给 AWS 上的特定子网 复制链接链接已复制到粘贴板!
您可以通过显式定义虚拟私有云(VPC)子网,并在 install-config.yaml
文件的 platform.aws.vpc.subnets
部分中直接为其分配特定的角色,从而控制 OpenShift Load Balancers (包括 Ingress Controller 的网络放置)。此方法提供对将哪些子网用于资源(如 Ingress Controller 和其他集群组件)的粒度控制。
7.2.11.1.1. 在安装时为 OpenShift API 和入口负载均衡器指定 AWS 子网 复制链接链接已复制到粘贴板!
执行以下步骤将 API 和入口负载均衡器分配给特定的子网。
先决条件
在开始前,请确定您有:
- 现有的 AWS 虚拟私有云 (VPC)。
预先配置的 AWS 子网供 OpenShift 集群使用,请考虑以下事项:
-
您有一个其子网 ID 列表(例如
subnet-0123456789abcdef0
)。这些 ID 将在install-config.yaml
文件中使用。 - 使用至少跨越两个可用区(AZ)的子网来实现负载均衡器和其他关键组件(如 control plane)的高可用性。
- 您在这些子网中有足够的可用 IP 地址用于所有分配的角色。
- 这些子网的 AWS 配置(包括网络 ACL 和安全组)必须允许分配给它们的所有角色所需的流量。对于托管入口控制器的子网,这通常包括来自所需源的 TCP 端口 80 和 443。
-
您有一个其子网 ID 列表(例如
- 有目标 OpenShift 版本的 OpenShift 安装程序二进制文件。
-
您有一个
install-config.yaml
文件。
流程
准备
install-config.yaml
文件:如果您还没有这样做,请使用 OpenShift 安装程序生成安装配置文件:
openshift-install create install-config --dir=<your_installation_directory>
$ openshift-install create install-config --dir=<your_installation_directory>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令在指定目录中创建
install-config.yaml
文件。定义子网并分配角色:
使用文本编辑器打开位于
<your_installation_directory>
中的install-config.yaml
文件。您将在platform.aws.vpc.subnets
字段中定义您的 VPC 子网及其指定角色。对于您要使用集群的每个 AWS 子网,您将创建一个条目,指定其
id
和roles
列表。每个角色都是带有type
键的对象。要为默认 Ingress Controller 指定子网,请为它分配一个带有type: IngressControllerLB
的角色。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 您的基域。
- 2
- 您的 AWS 区域。
- 3
platform.aws
下的 vpc 对象包含子网列表。- 4
- OpenShift 将要使用的所有子网对象的列表。每个对象定义一个子网 id 及其角色。
- 5
- 使用您的 AWS 子网 ID 替换。
- 6
type: IngressControllerLB
角色专门用于为默认 Ingress Controller 的 LoadBalancer 指定这个子网。在私有/内部集群中,带有IngressControllerLB
角色的子网必须是私有。- 7
type: ClusterNode
角色为 control plane 和计算节点指定这个子网。这些通常是专用子网。- 8
- 您的 pull secret。
- 9
- 您的 SSH 密钥。
subnets
列表中 control plane 负载均衡器的条目遵循类似的模式:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于默认公共 Ingress Controller,在
install-config.yaml
文件中分配了IngressControllerLB
角色的任何子网都必须是公共子网。例如,必须在 AWS 中有一个路由表条目,用于将出站流量定向到互联网网关(IGW)。确保您在 AZ 中列出所有必要的子网、公共和私有子网,并根据集群架构分配适当的角色。
子网 ID 在现有 VPC 中定义子网,并可选择性地指定它们的预期角色。如果在任何子网上没有指定角色,则会自动决定子网角色。在这种情况下,VPC 不得包含没有
kubernetes.io/cluster/<cluster-id>
标签的任何其他非集群子网。如果为子网指定角色,每个子网必须至少有一个分配的角色,并且
ClusterNode
、BootstrapNode
、IngressControllerLB
、ControlPlaneExternalLB
和ControlPlaneInternalLB
角色必须至少分配给一个子网。但是,如果集群范围是内部的,则不需要ControlPlaneExternalLB
。继续集群安装:
将更改保存到
install-config.yaml
文件后,创建集群:openshift-install create cluster --dir=<your_installation_directory>
$ openshift-install create cluster --dir=<your_installation_directory>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安装程序现在使用
install-config.yaml
文件的platform.aws.vpc.subnets
部分中的子网定义和显式角色分配来置备集群资源,包括将 Ingress Controller 的 LoadBalancer 放置到您使用IngressControllerLB
角色指定的子网中。
platform.aws.vpc.subnets
中的角色分配机制,如 IngressControllerLB
,ClusterNode
,ControlPlaneExternalLB
,ControlPlaneInternalLB
,BootstrapNode
是 OpenShift 安装程序标识适合不同集群服务和组件的类型。
7.2.12. 为手动 DNS Management 配置 Ingress Controller 复制链接链接已复制到粘贴板!
作为集群管理员,在创建 Ingress Controller 时,Operator 会自动管理 DNS 记录。当所需的 DNS 区域与集群 DNS 区域不同或 DNS 区域被托管在云供应商时,这有一些限制。
作为集群管理员,您可以将 Ingress Controller 配置为停止自动 DNS 管理并启动手动 DNS 管理。将 dnsManagementPolicy
设置为指定应自动或手动管理的时间。
当您将 Ingress Controller 从 Managed
改为 Unmanaged
DNS 管理策略时,Operator 不会清理在云中置备的以前的通配符 DNS 记录。当您将 Ingress Controller 从 Unmanaged
改为 Managed
DNS 管理策略时,Operator 会尝试在云供应商上创建 DNS 记录(如果不存在),或更新 DNS 记录(如果已存在)。
当您将 dnsManagementPolicy
设置为 unmanaged
时,您必须手动管理云供应商上的通配符 DNS 记录的生命周期。
7.2.12.1. Managed DNS 管理策略 复制链接链接已复制到粘贴板!
Ingress Controller 的 Managed
DNS 管理策略可确保云供应商上通配符 DNS 记录的生命周期由 Operator 自动管理。
7.2.12.2. Unmanaged DNS 管理策略 复制链接链接已复制到粘贴板!
Ingress Controller 的 Unmanaged
DNS 管理策略可确保云供应商上通配符 DNS 记录的生命周期不会自动管理,而是由集群管理员负责。
在 AWS 云平台中,如果 Ingress Controller 上的域与 dnsConfig.Spec.BaseDomain
不匹配,则 DNS 管理策略会自动设置为 Unmanaged
。
7.2.12.3. 使用 Unmanaged DNS 管理策略创建自定义 Ingress Controller 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 Unmanaged
DNS 管理策略创建新的自定义 Ingress Controller。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
创建名为
sample-ingress.yaml
的自定义资源 (CR) 文件,包含以下内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保存文件以使改变生效。
oc apply -f <name>.yaml
oc apply -f <name>.yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.12.4. 修改现有 Ingress Controller 复制链接链接已复制到粘贴板!
作为集群管理员,您可以修改现有 Ingress Controller 以手动管理 DNS 记录生命周期。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
修改所选
IngressController
来设置dnsManagementPolicy
:SCOPE=$(oc -n openshift-ingress-operator get ingresscontroller <name> -o=jsonpath="{.status.endpointPublishingStrategy.loadBalancer.scope}") oc -n openshift-ingress-operator patch ingresscontrollers/<name> --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"dnsManagementPolicy":"Unmanaged", "scope":"${SCOPE}"}}}}'
SCOPE=$(oc -n openshift-ingress-operator get ingresscontroller <name> -o=jsonpath="{.status.endpointPublishingStrategy.loadBalancer.scope}") oc -n openshift-ingress-operator patch ingresscontrollers/<name> --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"dnsManagementPolicy":"Unmanaged", "scope":"${SCOPE}"}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 可选:您可以删除云供应商中的关联的 DNS 记录。
7.2.13. 使用 OpenShift Container Platform 网络的网关 API 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了将网关 API 与 Ingress Operator 搭配使用配置网络流量的额外方法。
网关 API 不支持用户定义的网络 (UDN)。
7.2.13.1. Gateway API 概述 复制链接链接已复制到粘贴板!
网关 API 是一种开源、社区管理的 Kubernetes 网络机制。它侧重于集群的传输层、L4 和应用程序层 L7 中的路由。各种供应商提供许多网关 API 实施。
该项目通过使用具有广泛社区支持的可移植 API 来提供标准化生态系统。通过将网关 API 功能集成到 Ingress Operator 中,它实现了与现有社区和上游开发工作一致的网络解决方案。
gateway API 扩展 Ingress Operator 的功能,以处理更精细的集群流量和路由配置。使用这些功能,您可以创建网关 API 自定义资源定义 (CRD) 的实例。对于 OpenShift Container Platform 集群,Ingress Operator 会创建以下资源:
- 网关
- 这个资源描述了如何将流量转换为集群中的服务。例如,一个特定的负载均衡器配置。
- GatewayClass
-
此资源定义一组共享通用配置和行为的
Gateway
对象。例如,可以创建两个单独的GatewayClass
对象来区分用于公共或私有应用程序的Gateway
资源。 - HTTPRoute
- 此资源指定从网关到服务的 HTTP 请求的路由行为,对于多路 HTTP 或已终止的 HTTPS 连接特别有用。
- GRPCRoute
- 此资源指定 gRPC 请求的路由行为。
- ReferenceGrant
- 此资源启用跨命名空间引用。例如,它允许路由将流量转发到位于不同命名空间中的后端。
在 OpenShift Container Platform 中,网关 API 的实现基于 gateway.networking.k8s.io/v1
,且此版本中的所有字段都被支持。
7.2.13.1.1. 网关 API 的优点 复制链接链接已复制到粘贴板!
网关 API 提供以下优点:
-
可移植性:虽然 OpenShift Container Platform 使用 HAProxy 提高 Ingress 性能,但 Gateway API 不依赖于特定于供应商的注解来提供某些行为。要获得与 HAProxy 相同的性能,
Gateway
对象需要水平扩展,或者需要垂直扩展其关联的节点。 -
关注点:网关 API 对资源使用基于角色的方法,更必要地适合大型机构如何构建职责和团队。平台工程师可能专注于
GatewayClass
资源,集群管理员可能专注于配置Gateway
资源,应用程序开发人员可能会专注于使用HTTPRoute
资源路由其服务。 - 可扩展性:额外的功能是作为标准化 CRD 开发的。
7.2.13.1.2. 网关 API 的限制 复制链接链接已复制到粘贴板!
网关 API 有以下限制:
- 版本不兼容:网关 API 生态系统快速变化,一些实现无法用于其他的实现,因为它们的功能集基于不同的网关 API 版本。
- 资源开销:虽然更灵活,当网关 API 需要使用多种资源类型来实现结果。对于较小的应用程序,传统 Ingress 的简洁性可能更适合。
7.2.13.2. OpenShift Container Platform 的网关 API 实现 复制链接链接已复制到粘贴板!
Ingress Operator 管理网关 API CRD 的生命周期,以便其他厂商实现使用 OpenShift Container Platform 集群中定义的 CRD。
在某些情况下,网关 API 提供一个或多个供应商实现并不支持的字段,但该实现与其余字段在架构中兼容。这些"dead fields"可能会导致 Ingress 工作负载中断、不正确的置备应用程序和服务以及与安全相关的问题。由于 OpenShift Container Platform 使用特定版本的 Gateway API CRD,因此任何使用网关 API 的第三方实现都必须符合 OpenShift Container Platform 的实现,以确保所有字段都能正常工作。
在 OpenShift Container Platform 4.19 集群中创建的任何 CRD 都是兼容版本,并由 Ingress Operator 维护。如果 CRD 已存在但没有由 Ingress Operator 管理,Ingress Operator 会检查这些配置是否与 OpenShift Container Platform 支持的网关 API 版本兼容,并创建一个您需要确认 CRD 的 admin-gate。
如果您要从包含 Gateway API CRD 的以前的 OpenShift Container Platform 版本更新集群,请更改这些资源,以便它们与 OpenShift Container Platform 支持的版本完全匹配。否则,您无法更新集群,因为这些 CRD 不是由 OpenShift Container Platform 管理,并可能包含红帽不支持的功能。
7.2.13.3. Ingress Operator 的 Gateway API 入门 复制链接链接已复制到粘贴板!
当您在第一步中创建 GatewayClass 时,它会配置网关 API 以便在集群中使用。
流程
创建
GatewayClass
对象:创建一个 YAML 文件
openshift-default.yaml
,其中包含以下信息:GatewayClass
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要控制器名称必须与 Ingress Operator 显示完全相同,才能管理它。如果将此字段设置为任何其他对象,Ingress Operator 会忽略
GatewayClass
对象和所有关联的Gateway
、GRPCRoute
和HTTPRoute
对象。控制器名称与 OpenShift Container Platform 中的网关 API 实施关联,openshift.io/gateway-controller/v1
是允许的唯一控制器名称。运行以下命令来创建
GatewayClass
资源:oc create -f openshift-default.yaml
$ oc create -f openshift-default.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
gatewayclass.gateway.networking.k8s.io/openshift-default created
gatewayclass.gateway.networking.k8s.io/openshift-default created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在创建
GatewayClass
资源期间,Ingress Operator 会在openshift-ingress
命名空间中安装一个轻量级版本的 Red Hat OpenShift Service Mesh、Istio 自定义资源和新部署。可选:验证新部署
istiod-openshift-gateway
是否已就绪并可用:oc get deployment -n openshift-ingress
$ oc get deployment -n openshift-ingress
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE istiod-openshift-gateway 1/1 1 1 55s router-default 2/2 2 2 6h4m
NAME READY UP-TO-DATE AVAILABLE AGE istiod-openshift-gateway 1/1 1 1 55s router-default 2/2 2 2 6h4m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令来创建 secret:
oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
$ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,获取 Ingress Operator 的域:
DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
$ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
Gateway
对象 :创建一个 YAML 文件
example-gateway.yaml
,其中包含以下信息:Gateway
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用资源:
oc apply -f example-gateway.yaml
$ oc apply -f example-gateway.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:当您创建
Gateway
对象时,Red Hat OpenShift Service Mesh 会自动置备具有相同名称的部署和服务。运行以下命令验证:要验证部署,请运行以下命令:
oc get deployment -n openshift-ingress example-gateway-openshift-default
$ oc get deployment -n openshift-ingress example-gateway-openshift-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25s
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证该服务,请运行以下命令:
oc get service -n openshift-ingress example-gateway-openshift-default
$ oc get service -n openshift-ingress example-gateway-openshift-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-gateway-openshift-default LoadBalancer 10.1.2.3 <external_ipname> <port_info> 47s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-gateway-openshift-default LoadBalancer 10.1.2.3 <external_ipname> <port_info> 47s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
可选:Ingress Operator 使用监听程序的主机名自动创建
DNSRecord
CR,并添加标签gateway.networking.k8s.io/gateway-name=example-gateway
。运行以下命令,验证 DNS 记录的状态:oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
$ oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建一个
HTTPRoute
资源,将请求定向到您已创建了example-app/example-app
的应用程序:创建一个 YAML 文件
example-route.yaml
,其中包含以下信息:HTTPRoute
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用资源:
oc apply -f example-route.yaml
$ oc apply -f example-route.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
httproute.gateway.networking.k8s.io/example-route created
httproute.gateway.networking.k8s.io/example-route created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行以下命令验证
Gateway
对象是否已部署,并具有条件Programmed
:oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
$ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
gateway.gateway.networking.k8s.io/example-gateway condition met
gateway.gateway.networking.k8s.io/example-gateway condition met
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 向配置的
HTTPRoute
对象主机名发送请求:curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
$ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.13.4. 网关 API 部署拓扑 复制链接链接已复制到粘贴板!
网关 API 设计为使用两个拓扑,即共享网关或专用网关。每个拓扑都有自己的优点和不同的安全影响。
- 专用网关
-
路由和任何负载均衡器或代理都从同一命名空间提供。
Gateway
对象将路由限制到特定的应用程序命名空间。这是在 OpenShift Container Platform 中部署网关 API 资源时的默认拓扑。 - 共享网关
-
路由由多个命名空间提供,或使用多个主机名提供。
Gateway
对象过滤器允许使用spec.listeners.allowedRoutes.namespaces
字段从应用程序命名空间中路由。
7.2.13.4.1. 专用网关示例 复制链接链接已复制到粘贴板!
以下示例显示了专用 Gateway
资源,fin-gateway
:
专用 Gateway
资源示例
- 1
- 在不使用
spec.listeners[].allowedRoutes
的情况下创建一个Gateway
资源,则会隐式设置namespaces.from
字段,使其具有值Same
。
以下示例显示了关联的 HTTPRoute
资源 sales-db
,它附加到专用 Gateway
对象:
HTTPRoute
资源示例
HTTPRoute
资源必须具有 Gateway
对象的名称,作为其 parentRefs
字段的值,才能附加到网关。隐式来说,路由被假定为与 Gateway
对象位于同一个命名空间中。