$ oc annotate route <route_name> \
--overwrite haproxy.router.openshift.io/timeout=<timeout><time_unit> (1)
OpenShift Container Platform 提供了与集群外部运行在集群中的服务进行通信的方法。此方法使用AWS上的负载均衡器,特别是网络负载均衡器 (NLB) 或经典负载均衡器 (CLB)。两种类型的负载均衡器都可以将客户端的IP地址转发到节点,但CLB需要代理协议支持,OpenShift Container Platform会自动启用此协议。
有两种方法可以配置入口控制器以使用NLB
强制替换当前使用CLB的入口控制器。这将删除IngressController
对象,并且在新的DNS记录传播和NLB正在配置期间会发生中断。
编辑现有使用CLB的入口控制器以使用NLB。这会更改负载均衡器,而无需删除和重新创建IngressController
对象。
这两种方法都可以用于从NLB切换到CLB。
您可以在新的或现有的AWS集群上配置这些负载均衡器。
OpenShift Container Platform提供了一种方法,可以为特定路由或入口控制器设置自定义超时时间段。此外,AWS经典负载均衡器 (CLB) 具有其自身的超时时间段,默认时间为60秒。
如果CLB的超时时间段短于路由超时或入口控制器超时,则负载均衡器可能会过早终止连接。您可以通过增加路由和CLB的超时时间段来防止此问题。
当您需要低超时时间的服务(服务级别可用性 (SLA) 所需)或高超时时间(针对后端速度慢的情况)时,您可以配置现有路由的默认超时时间。
您需要在正在运行的集群上部署入口控制器。
使用oc annotate
命令,将超时添加到路由
$ oc annotate route <route_name> \
--overwrite haproxy.router.openshift.io/timeout=<timeout><time_unit> (1)
1 | 支持的时间单位是微秒 (us)、毫秒 (ms)、秒 (s)、分钟 (m)、小时 (h) 或天 (d)。 |
以下示例在名为myroute
的路由上设置两秒的超时时间
$ oc annotate route myroute --overwrite haproxy.router.openshift.io/timeout=2s
您可以配置经典负载均衡器 (CLB) 的默认超时时间以延长空闲连接。
您必须在正在运行的集群上部署入口控制器。
通过运行以下命令,为默认ingresscontroller
设置五分钟的AWS连接空闲超时
$ oc -n openshift-ingress-operator patch ingresscontroller/default \
--type=merge --patch='{"spec":{"endpointPublishingStrategy": \
{"type":"LoadBalancerService", "loadBalancer": \
{"scope":"External", "providerParameters":{"type":"AWS", "aws": \
{"type":"Classic", "classicLoadBalancer": \
{"connectionIdleTimeout":"5m"}}}}}}}'
可选:通过运行以下命令恢复超时的默认值
$ oc -n openshift-ingress-operator patch ingresscontroller/default \
--type=merge --patch='{"spec":{"endpointPublishingStrategy": \
{"loadBalancer":{"providerParameters":{"aws":{"classicLoadBalancer": \
{"connectionIdleTimeout":null}}}}}}}'
更改连接超时值时,必须指定 |
OpenShift Container Platform 提供了与集群中运行的服务进行集群外部通信的方法。一种这样的方法是使用网络负载均衡器 (NLB)。您可以在新的或现有的 AWS 集群上配置 NLB。
您可以将使用经典负载均衡器 (CLB) 的入口控制器切换到在 AWS 上使用网络负载均衡器 (NLB) 的入口控制器。
在这些负载均衡器之间切换不会删除IngressController
对象。
此过程可能会导致以下问题:
|
修改要切换为使用 NLB 的现有入口控制器。此示例假设您的默认入口控制器具有External
范围且没有其他自定义项。
ingresscontroller.yaml
文件示例apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
creationTimestamp: null
name: default
namespace: openshift-ingress-operator
spec:
endpointPublishingStrategy:
loadBalancer:
scope: External
providerParameters:
type: AWS
aws:
type: NLB
type: LoadBalancerService
如果不为 |
如果您的入口控制器有其他您想更新的自定义项,例如更改域名,请考虑强制替换入口控制器定义文件。 |
通过运行以下命令将更改应用于入口控制器 YAML 文件:
$ oc apply -f ingresscontroller.yaml
入口控制器更新期间,预计会有几分钟的停机。
您可以将使用网络负载均衡器 (NLB) 的入口控制器切换到在 AWS 上使用经典负载均衡器 (CLB) 的入口控制器。
在这些负载均衡器之间切换不会删除IngressController
对象。
此过程可能会导致停机,持续时间可能为几分钟,原因是新的 DNS 记录传播、新的负载均衡器预配和其他因素。应用此过程后,入口控制器负载均衡器的 IP 地址和规范名称可能会更改。 |
修改要切换为使用 CLB 的现有入口控制器。此示例假设您的默认入口控制器具有External
范围且没有其他自定义项。
ingresscontroller.yaml
文件示例apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
creationTimestamp: null
name: default
namespace: openshift-ingress-operator
spec:
endpointPublishingStrategy:
loadBalancer:
scope: External
providerParameters:
type: AWS
aws:
type: Classic
type: LoadBalancerService
如果不为 |
如果您的入口控制器有其他您想更新的自定义项,例如更改域名,请考虑强制替换入口控制器定义文件。 |
通过运行以下命令将更改应用于入口控制器 YAML 文件:
$ oc apply -f ingresscontroller.yaml
入口控制器更新期间,预计会有几分钟的停机。
您可以将使用经典负载均衡器 (CLB) 的入口控制器替换为在 AWS 上使用网络负载均衡器 (NLB) 的入口控制器。
此过程可能会导致以下问题:
|
创建一个包含新的默认入口控制器的文件。以下示例假设您的默认入口控制器具有External
范围且没有其他自定义项。
ingresscontroller.yml
文件示例apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
creationTimestamp: null
name: default
namespace: openshift-ingress-operator
spec:
endpointPublishingStrategy:
loadBalancer:
scope: External
providerParameters:
type: AWS
aws:
type: NLB
type: LoadBalancerService
如果您的默认入口控制器具有其他自定义项,请确保相应地修改文件。
如果您的入口控制器没有其他自定义项,并且您只更新负载均衡器类型,请考虑遵循“将入口控制器从使用经典负载均衡器切换到网络负载均衡器”中详细介绍的过程。 |
强制替换入口控制器 YAML 文件。
$ oc replace --force --wait -f ingresscontroller.yml
等待入口控制器替换完成。预计会有几分钟的停机。
您可以在现有集群上创建由 AWS 网络负载均衡器 (NLB) 支持的入口控制器。
您必须安装了 AWS 集群。
基础设施资源的PlatformStatus
必须为 AWS。
要验证PlatformStatus
是否为 AWS,请运行:
$ oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.type}'
AWS
在现有集群上创建由 AWS NLB 支持的入口控制器。
创建入口控制器清单
$ cat ingresscontroller-aws-nlb.yaml
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: $my_ingress_controller(1)
namespace: openshift-ingress-operator
spec:
domain: $my_unique_ingress_domain(2)
endpointPublishingStrategy:
type: LoadBalancerService
loadBalancer:
scope: External(3)
providerParameters:
type: AWS
aws:
type: NLB
1 | 将$my_ingress_controller 替换为入口控制器的唯一名称。 |
2 | 将$my_unique_ingress_domain 替换为在集群中所有入口控制器中唯一的域名。此变量必须是 DNS 名称<clustername>.<domain> 的子域名。 |
3 | 您可以将External 替换为Internal 以使用内部 NLB。 |
在集群中创建资源
$ oc create -f ingresscontroller-aws-nlb.yaml
在新的 AWS 集群上配置入口控制器 NLB 之前,必须完成创建安装配置文件过程。 |
您可以在新集群上创建由 AWS 网络负载均衡器 (NLB) 支持的入口控制器。
创建install-config.yaml
文件并完成对其的任何修改。
在新集群上创建由 AWS NLB 支持的入口控制器。
更改到包含安装程序的目录并创建清单:
$ ./openshift-install create manifests --dir <installation_directory> (1)
1 | 对于<installation_directory> ,指定包含集群install-config.yaml 文件的目录名称。 |
在<installation_directory>/manifests/
目录中创建一个名为cluster-ingress-default-ingresscontroller.yaml
的文件。
$ touch <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml (1)
1 | 对于<installation_directory> ,指定包含集群manifests/ 目录的目录名称。 |
创建文件后,manifests/
目录中将包含几个网络配置文件,如下所示:
$ ls <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml
cluster-ingress-default-ingresscontroller.yaml
在编辑器中打开cluster-ingress-default-ingresscontroller.yaml
文件,并输入描述所需运算符配置的自定义资源 (CR)。
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
creationTimestamp: null
name: default
namespace: openshift-ingress-operator
spec:
endpointPublishingStrategy:
loadBalancer:
scope: External
providerParameters:
type: AWS
aws:
type: NLB
type: LoadBalancerService
保存cluster-ingress-default-ingresscontroller.yaml
文件并退出文本编辑器。
可选:备份manifests/cluster-ingress-default-ingresscontroller.yaml
文件。安装程序在创建集群时会删除manifests/
目录。
您可以手动为现有集群中的入口控制器指定负载均衡器子网。默认情况下,负载均衡器子网由 AWS 自动发现,但将其指定在入口控制器中会覆盖此设置,从而允许手动控制。
您必须安装了 AWS 集群。
您必须知道要将其映射到IngressController
的子网的名称或 ID。
创建一个自定义资源 (CR) 文件。
使用以下内容创建一个 YAML 文件(例如,sample-ingress.yaml
):
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
namespace: openshift-ingress-operator
name: <name>
spec:
domain: <domain>
endpointPublishingStrategy:
type: LoadBalancerService
loadBalancer:
scope: External
dnsManagementPolicy: Managed
创建一个自定义资源 (CR) 文件。
将子网添加到 YAML 文件中:
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: <name> (1)
namespace: openshift-ingress-operator
spec:
domain: <domain> (2)
endpointPublishingStrategy:
type: LoadBalancerService
loadBalancer:
scope: External
providerParameters:
type: AWS
aws:
type: Classic
classicLoadBalancer: (3)
subnets:
ids: (4)
- <subnet> (5)
- <subnet>
- <subnet>
dnsManagementPolicy: Managed
1 | 将<name> 替换为IngressController 的名称。 |
||
2 | 将<domain> 替换为IngressController 服务的 DNS 名称。 |
||
3 | 如果使用 NLB,也可以使用networkLoadBalancer 字段。 |
||
4 | 您可以选择使用names 字段按名称指定子网,而不是按 ID 指定子网。 |
||
5 | 指定子网 ID(如果使用names ,则指定名称)。
|
应用 CR 文件。
保存文件并使用 OpenShift CLI (oc
) 应用它。
$ oc apply -f sample-ingress.yaml
通过检查IngressController
条件确认负载均衡器已成功预配。
$ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
您可以更新 OpenShift Container Platform 中具有手动指定负载均衡器子网的IngressController
,以避免任何中断,维护服务的稳定性,并确保您的网络配置符合您的特定要求。以下步骤说明如何选择和应用新的子网、验证配置更改以及确认负载均衡器已成功配置。
此过程可能会导致几分钟的停机,因为需要新的DNS记录传播、新的负载均衡器配置和其他因素。应用此过程后,Ingress Controller 负载均衡器的IP地址和规范名称可能会发生更改。 |
要更新具有手动指定负载均衡器子网的IngressController
,您可以按照以下步骤操作
修改现有的 IngressController 以更新到新的子网。
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: <name> (1)
namespace: openshift-ingress-operator
spec:
domain: <domain> (2)
endpointPublishingStrategy:
type: LoadBalancerService
loadBalancer:
scope: External
providerParameters:
type: AWS
aws:
type: Classic (3)
classicLoadBalancer: (4)
subnets:
ids: (5)
- <updated_subnet> (6)
- <updated_subnet>
- <updated_subnet>
1 | 将<name> 替换为IngressController 的名称。 |
2 | 将<domain> 替换为IngressController 服务的 DNS 名称。 |
3 | 指定更新的子网 ID(如果您使用names ,则指定名称)。 |
4 | 如果使用 NLB,也可以使用networkLoadBalancer 字段。 |
5 | 您可以选择使用names 字段按名称指定子网,而不是按 ID 指定子网。 |
6 | 更新子网 ID(如果您使用names ,则更新名称)。 |
每个可用区最多可以指定一个子网。对于外部入口控制器,只提供公共子网;对于内部入口控制器,只提供私有子网。 |
检查IngressController
上的Progressing
状态,以获取有关如何通过运行以下命令应用子网更新的说明
$ oc get ingresscontroller -n openshift-ingress-operator subnets -o jsonpath="{.status.conditions[?(@.type==\"Progressing\")]}" | yq -PC
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
要应用更新,请删除与 Ingress Controller 关联的服务,运行以下命令:
$ oc -n openshift-ingress delete svc/router-<name>
要确认负载均衡器已成功配置,请通过运行以下命令检查IngressController
的状态:
$ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
有关 NLB 支持的更多信息,请参见 AWS 上的网络负载均衡器支持。
有关 CLB 的代理协议支持的更多信息,请参见 为您的经典负载均衡器配置代理协议支持