×

OpenShift Container Platform 提供了与集群外部运行在集群中的服务进行通信的方法。此方法使用AWS上的负载均衡器,特别是网络负载均衡器 (NLB) 或经典负载均衡器 (CLB)。两种类型的负载均衡器都可以将客户端的IP地址转发到节点,但CLB需要代理协议支持,OpenShift Container Platform会自动启用此协议。

有两种方法可以配置入口控制器以使用NLB

  1. 强制替换当前使用CLB的入口控制器。这将删除IngressController对象,并且在新的DNS记录传播和NLB正在配置期间会发生中断。

  2. 编辑现有使用CLB的入口控制器以使用NLB。这会更改负载均衡器,而无需删除和重新创建IngressController对象。

这两种方法都可以用于从NLB切换到CLB。

您可以在新的或现有的AWS集群上配置这些负载均衡器。

配置AWS上的经典负载均衡器超时

OpenShift Container Platform提供了一种方法,可以为特定路由或入口控制器设置自定义超时时间段。此外,AWS经典负载均衡器 (CLB) 具有其自身的超时时间段,默认时间为60秒。

如果CLB的超时时间段短于路由超时或入口控制器超时,则负载均衡器可能会过早终止连接。您可以通过增加路由和CLB的超时时间段来防止此问题。

配置路由超时

当您需要低超时时间的服务(服务级别可用性 (SLA) 所需)或高超时时间(针对后端速度慢的情况)时,您可以配置现有路由的默认超时时间。

先决条件
  • 您需要在正在运行的集群上部署入口控制器。

步骤
  1. 使用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) 的默认超时时间以延长空闲连接。

先决条件
  • 您必须在正在运行的集群上部署入口控制器。

步骤
  1. 通过运行以下命令,为默认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"}}}}}}}'
  2. 可选:通过运行以下命令恢复超时的默认值

    $ oc -n openshift-ingress-operator patch ingresscontroller/default \
        --type=merge --patch='{"spec":{"endpointPublishingStrategy": \
        {"loadBalancer":{"providerParameters":{"aws":{"classicLoadBalancer": \
        {"connectionIdleTimeout":null}}}}}}}'

更改连接超时值时,必须指定scope字段,除非当前范围已设置。设置scope字段后,如果恢复默认超时值,则无需再次设置。

使用网络负载均衡器在 AWS 上配置入口集群流量

OpenShift Container Platform 提供了与集群中运行的服务进行集群外部通信的方法。一种这样的方法是使用网络负载均衡器 (NLB)。您可以在新的或现有的 AWS 集群上配置 NLB。

将入口控制器从使用经典负载均衡器切换到网络负载均衡器

您可以将使用经典负载均衡器 (CLB) 的入口控制器切换到在 AWS 上使用网络负载均衡器 (NLB) 的入口控制器。

在这些负载均衡器之间切换不会删除IngressController对象。

此过程可能会导致以下问题:

  • 由于新的 DNS 记录传播、新的负载均衡器预配和其他因素,可能会导致持续数分钟的停机。应用此过程后,入口控制器负载均衡器的 IP 地址和规范名称可能会更改。

  • 由于服务的注释更改而导致负载均衡器资源泄漏。

步骤
  1. 修改要切换为使用 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

    如果不为spec.endpointPublishingStrategy.loadBalancer.providerParameters.aws.type字段指定值,则入口控制器将使用安装期间设置的集群Ingress配置中的spec.loadBalancer.platform.aws.type值。

    如果您的入口控制器有其他您想更新的自定义项,例如更改域名,请考虑强制替换入口控制器定义文件。

  2. 通过运行以下命令将更改应用于入口控制器 YAML 文件:

    $ oc apply -f ingresscontroller.yaml

    入口控制器更新期间,预计会有几分钟的停机。

将入口控制器从使用网络负载均衡器切换到经典负载均衡器

您可以将使用网络负载均衡器 (NLB) 的入口控制器切换到在 AWS 上使用经典负载均衡器 (CLB) 的入口控制器。

在这些负载均衡器之间切换不会删除IngressController对象。

此过程可能会导致停机,持续时间可能为几分钟,原因是新的 DNS 记录传播、新的负载均衡器预配和其他因素。应用此过程后,入口控制器负载均衡器的 IP 地址和规范名称可能会更改。

步骤
  1. 修改要切换为使用 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

    如果不为spec.endpointPublishingStrategy.loadBalancer.providerParameters.aws.type字段指定值,则入口控制器将使用安装期间设置的集群Ingress配置中的spec.loadBalancer.platform.aws.type值。

    如果您的入口控制器有其他您想更新的自定义项,例如更改域名,请考虑强制替换入口控制器定义文件。

  2. 通过运行以下命令将更改应用于入口控制器 YAML 文件:

    $ oc apply -f ingresscontroller.yaml

    入口控制器更新期间,预计会有几分钟的停机。

将入口控制器经典负载均衡器替换为网络负载均衡器

您可以将使用经典负载均衡器 (CLB) 的入口控制器替换为在 AWS 上使用网络负载均衡器 (NLB) 的入口控制器。

此过程可能会导致以下问题:

  • 由于新的 DNS 记录传播、新的负载均衡器预配和其他因素,可能会导致持续数分钟的停机。应用此过程后,入口控制器负载均衡器的 IP 地址和规范名称可能会更改。

  • 由于服务的注释更改而导致负载均衡器资源泄漏。

步骤
  1. 创建一个包含新的默认入口控制器的文件。以下示例假设您的默认入口控制器具有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

    如果您的默认入口控制器具有其他自定义项,请确保相应地修改文件。

    如果您的入口控制器没有其他自定义项,并且您只更新负载均衡器类型,请考虑遵循“将入口控制器从使用经典负载均衡器切换到网络负载均衡器”中详细介绍的过程。

  2. 强制替换入口控制器 YAML 文件。

    $ oc replace --force --wait -f ingresscontroller.yml

    等待入口控制器替换完成。预计会有几分钟的停机。

在现有 AWS 集群上配置入口控制器网络负载均衡器

您可以在现有集群上创建由 AWS 网络负载均衡器 (NLB) 支持的入口控制器。

先决条件
  • 您必须安装了 AWS 集群。

  • 基础设施资源的PlatformStatus必须为 AWS。

    • 要验证PlatformStatus是否为 AWS,请运行:

      $ oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.type}'
      AWS
步骤

在现有集群上创建由 AWS NLB 支持的入口控制器。

  1. 创建入口控制器清单

     $ 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。
  2. 在集群中创建资源

    $ oc create -f ingresscontroller-aws-nlb.yaml

在新的 AWS 集群上配置入口控制器 NLB 之前,必须完成创建安装配置文件过程。

在新 AWS 集群上配置入口控制器网络负载均衡器

您可以在新集群上创建由 AWS 网络负载均衡器 (NLB) 支持的入口控制器。

先决条件
  • 创建install-config.yaml文件并完成对其的任何修改。

步骤

在新集群上创建由 AWS NLB 支持的入口控制器。

  1. 更改到包含安装程序的目录并创建清单:

    $ ./openshift-install create manifests --dir <installation_directory> (1)
    1 对于<installation_directory>,指定包含集群install-config.yaml文件的目录名称。
  2. <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
  3. 在编辑器中打开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
  4. 保存cluster-ingress-default-ingresscontroller.yaml文件并退出文本编辑器。

  5. 可选:备份manifests/cluster-ingress-default-ingresscontroller.yaml文件。安装程序在创建集群时会删除manifests/目录。

创建 LoadBalancerService 入口控制器时选择子网

您可以手动为现有集群中的入口控制器指定负载均衡器子网。默认情况下,负载均衡器子网由 AWS 自动发现,但将其指定在入口控制器中会覆盖此设置,从而允许手动控制。

先决条件
  • 您必须安装了 AWS 集群。

  • 您必须知道要将其映射到IngressController的子网的名称或 ID。

步骤
  1. 创建一个自定义资源 (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
  2. 创建一个自定义资源 (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,则指定名称)。

    每个可用区最多可以指定一个子网。对于外部入口控制器,只提供公共子网;对于内部入口控制器,只提供私有子网。

  3. 应用 CR 文件。

    1. 保存文件并使用 OpenShift CLI (oc) 应用它。

      $  oc apply -f sample-ingress.yaml
    2. 通过检查IngressController条件确认负载均衡器已成功预配。

      $ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC

更新现有 Ingress Controller 上的子网

您可以更新 OpenShift Container Platform 中具有手动指定负载均衡器子网的IngressController,以避免任何中断,维护服务的稳定性,并确保您的网络配置符合您的特定要求。以下步骤说明如何选择和应用新的子网、验证配置更改以及确认负载均衡器已成功配置。

此过程可能会导致几分钟的停机,因为需要新的DNS记录传播、新的负载均衡器配置和其他因素。应用此过程后,Ingress Controller 负载均衡器的IP地址和规范名称可能会发生更改。

步骤

要更新具有手动指定负载均衡器子网的IngressController,您可以按照以下步骤操作

  1. 修改现有的 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,则更新名称)。

    每个可用区最多可以指定一个子网。对于外部入口控制器,只提供公共子网;对于内部入口控制器,只提供私有子网。

  2. 检查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
  3. 要应用更新,请删除与 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

更多资源