在 Red Hat OpenShift 4 中公开具有路径的应用程序

通过路由将 Red Hat® OpenShift® on IBM Cloud® 集群中的服务暴露在路由器的外部IP地址上。

此信息适用于运行 Red Hat OpenShift 第4版的集群。

不确定是该使用 Red Hat OpenShift 路由还是Ingress? 请查看在不同负载均衡解决方案之间进行选择

概述

默认情况下,一个 Red Hat OpenShift Ingress 控制器会被部署到您的集群中,该控制器作为外部网络流量的入口点端点运行。

您可以使用 Red Hat OpenShift Ingress 控制器为应用程序创建路径。 将从 Ingress 控制器子域为路由分配一个公用或专用可访问的主机名,外部客户机可以使用该主机名将请求发送到应用程序。 您可以选择创建不安全或安全路由,方法是使用 Ingress 控制器的 TLS 证书来保护您的主机名。 当外部请求到达主机名时,Ingress 控制器会代理您的请求,并将其转发到应用程序侦听的专用 IP 地址。

缺省情况下创建的 Ingress 控制器的类型因集群的基础架构提供程序和服务端点设置而异。

  • 具有公共云服务端点的经典集群 /VPC 集群: 缺省情况下,将使用公共 Ingress 控制器创建集群。 Ingress 控制器为应用程序分配可公开访问的路径,并在公共主机网络接口上侦听对应用程序的请求。 接收到请求时,Ingress 控制器会将请求定向到应用程序侦听的专用 IP 地址。 如果要改为私下公开应用程序,那么必须先创建专用 Ingress 控制器,然后创建专用路由。
  • 仅具有私有云服务端点的 VPC 集群: 缺省情况下,将使用私有 Ingress 控制器创建集群。 Ingress 控制器为应用程序分配专用可访问路径,并在专用主机网络接口上进行侦听。 只有连接到专用 VPC 网络的客户机才能访问由专用路由公开的应用程序。 如果要改为公开应用程序,那么必须首先创建公共 Ingress 控制器,然后创建公共路径。

如果您具有多专区集群,那么会将一个高可用性 Ingress 控制器部署到集群,并在每个专区中创建一个 Ingress 控制器服务。 每个专区需要两个工作程序节点,以便可以正确部署和更新 Ingress 控制器的两个副本。 请注意,具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为 router-default,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如 router-dal12 之类的名称。

  • 要查看集群的每个专区中的 Ingress 控制器服务,请运行 oc get svc -n openshift-ingress
  • 要查看集群的 Ingress 控制器子域以及每个专区中 Ingress 控制器服务的 IP 地址,请运行 ibmcloud oc nlb-dns ls -c <cluster_name_or_ID> 并查找格式类似于 <cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud 的子域。

在 VPC 基础结构仪表板中,VPC 负载均衡器仅将运行 Ingress 控制器副本 pod 的两个工作程序节点报告为正常运行状态,因为这些工作程序节点配置为 VPC 负载均衡器的侦听器。 尽管仅报告监听器工作节点处于健康状态,但监听器的后端工作节点池仍会保持最新状态 Red Hat OpenShift on IBM Cloud,因此集群中的所有工作节点仍可接收来自VPC负载均衡器的请求。

经典单区域集群中的流量流向

下图展示了路由器如何将来自互联网的网络流量引导至单区域经典集群中的某个应用程序。

路由器流量图
使用路由器在单区群集中公开应用程序

  1. 对应用程序的请求使用为应用程序设置的路径主机名。

  2. DNS 服务将该子域名解析为路由器服务的可移植公共 IP 地址。

  3. 路由器接收该请求,并通过私有网络将其转发至应用 Pod 的私有 IP 地址。 请求数据包的源 IP 地址被更改为运行路由器 Pod 的工作节点上的公共 IP 地址。 如果集群中部署了多个应用实例,路由器会在应用 Pod 之间转发请求。

  4. 当应用程序返回响应数据包时,它会使用转发了客户端请求的路由器所在的工作节点IP地址。 然后,路由器通过负载均衡器服务将响应包发送到客户机。

经典多区域集群中的流量流向

下图展示了路由器如何在多区域经典集群中将来自互联网的网络流量引导至某个应用程序。

多区路由器流量图
使用路由器在多区集群中公开应用程序

  1. 对应用程序的请求使用为应用程序设置的路径主机名。

  2. DNS 服务将路由子域解析为由多专区负载均衡器 (MZLB) 报告为正常运行的路由器服务的可移植公共 IP 地址。 MZLB 会持续检查集群中每个区域内、将路由器对外暴露的服务所使用的可移植公共 IP 地址。 各区域的路由器服务会按照轮询机制处理请求。

  3. 根据路由器服务的解析 IP 地址,路由器接收请求。

  4. 路由器通过私有网络将请求转发到应用 Pod 的私有 IP 地址。 请求数据包的源 IP 地址被更改为运行路由器 Pod 的工作节点上的公共 IP 地址。 每个路由器都会向其所在区域内的应用实例以及其他区域的应用实例发送请求。 此外,如果在一个专区中部署了多个应用程序实例,那么路由器会在应用程序 pod 之间交替发出请求。

  5. 当应用程序返回响应数据包时,它会使用转发了客户端请求的路由器所在的工作节点IP地址。 然后,路由器通过负载均衡器服务将响应包发送到客户机。

具有公共云服务端点的多专区 VPC 集群中的流量流

在启用公共云服务端点的情况下创建多专区 VPC 集群时,缺省情况下会创建公共 Ingress 控制器。 Ingress 控制器为应用程序分配可公开访问的路径,并在公共主机网络接口上侦听对应用程序的请求。

下图展示了 Ingress 控制器如何将来自互联网的网络流量引导至多区域 VPC 集群中的某个应用。

VPC 输入控制器流量图
使用输入控制器在多区域 VPC 集群中公开应用程序

  1. 对应用程序的请求使用为应用程序设置的路径主机名。

  2. DNS 服务将路由子域解析为分配给 Ingress 控制器的服务的 VPC 负载均衡器主机名。 在 VPC 集群中,Ingress 控制器服务的外部 IP 地址是浮动的,并且保留在 VPC 分配的主机名后面。

  3. VPC 负载均衡器将 VPC 主机名解析为报告为正常运行的 Ingress 控制器服务的可用外部 IP 地址。 VPC 负载均衡器会持续检查在集群中的每个专区中公开 Ingress 控制器的服务的外部 IP 地址。

  4. 根据解析的 IP 地址,VPC 负载均衡器将请求发送到 Ingress 控制器服务。

  5. Ingress 控制器通过私有网络将请求转发到应用 Pod 的私有 IP 地址。 请求数据包的源 IP 地址被更改为运行 Ingress 控制器 Pod 的工作节点 IP 地址。 每个 Ingress 控制器都会向其所在区域内的应用实例以及其他区域的应用实例发送请求。 此外,如果在一个区域中部署了多个应用程序实例,那么 Ingress 控制器会在应用程序 pod 之间交换请求。

  6. 当应用程序返回响应数据包时,它会使用转发了客户端请求的 Ingress 控制器所在的工作节点 IP 地址。 然后,Ingress 控制器通过 VPC 负载均衡器将响应包发送到客户机。

仅具有私有云服务端点的多专区 VPC 集群中的流量流

当您仅使用私有云服务端点创建多专区 VPC 集群时,缺省情况下会创建私有 Ingress 控制器。 Ingress 控制器为应用程序分配专用可访问路径,并在专用主机网络接口上进行侦听。 只有连接到专用 VPC 网络的客户机才能访问由专用路由公开的应用程序。

下图显示了 Ingress 控制器如何将网络流量从专用网络定向到多专区 VPC 集群中的应用程序。

通过使用 Ingress 控制器,在私有、多区、VPC 集群中公开应用程序
通过使用 Ingress 控制器,在私有、多区、VPC 集群中公开应用程序* 通过使用 Ingress
,在私有、多区、VPC 集群中公开应用程序* 通过使用 Ingress 控制器,在私有、多区、VPC 集群中公开应用程序* 通过使用 Ingress 控制器,在私有、多区、VPC 集群中公开应用程序

  1. 连接到专用 VPC 网络的客户机通过使用应用程序的专用路由向应用程序发送请求。 例如,您可以使用虚拟专用 Cloud VPN,IBM Cloud Transit Gateway或 IBM Cloud Direct Link 来允许来自本地网络,另一个 VPC 或 IBM Cloud 经典基础结构的请求到集群中运行的应用程序。

  2. DNS 服务将路由子域解析为分配给 Ingress 控制器的服务的 VPC 负载均衡器主机名。 在 VPC 集群中,Ingress 控制器服务的 IP 地址是浮动的,并且保留在 VPC 分配的主机名之后。 请注意,虽然路由子域的 DNS 记录是在公共 DNS 系统中注册的,但可从 VPC 访问 DNS 解析服务器。

  3. 专用 VPC 负载均衡器将 VPC 主机名解析为报告为正常运行的 Ingress 控制器服务的可用专用 IP 地址。 VPC 负载均衡器会持续检查集群中每个专区中公开 Ingress 控制器的服务的 IP 地址。

  4. 根据解析的 IP 地址,VPC 负载均衡器将请求发送到 Ingress 控制器服务。

  5. Ingress 控制器通过私有网络将请求转发到应用 Pod 的私有 IP 地址。 请求数据包的源 IP 地址被更改为运行 Ingress 控制器 Pod 的工作节点 IP 地址。 每个 Ingress 控制器都会向其所在区域内的应用实例以及其他区域的应用实例发送请求。 此外,如果在一个区域中部署了多个应用程序实例,那么 Ingress 控制器会在应用程序 pod 之间交换请求。

  6. 当应用程序返回响应数据包时,它会使用转发了客户端请求的 Ingress 控制器所在的工作节点 IP 地址。 然后,Ingress 控制器通过 VPC 负载均衡器并通过 IBM Cloud VPC VPN,Transit Gateway或 Direct Link 将响应包发送到客户机。

路由类型和 TLS 终止

Red Hat OpenShift 根据应用程序所需的 TLS 终止类型,提供四种类型的路线。 公共和专用路由支持每种路由类型。

基于 TLS 终端的路由类型
路由类型 用例
简单 如果不需要 TLS 加密,可创建一个简单路由来处理未加密的 HTTP 流量。
PassThrough 当您希望 TLS 连接从客户端不间断地传递到应用程序 pod 时,请创建直通路由。 路由器不参与 TLS 加密 HTTPS 流量的终止,因此应用程序 pod 必须终止 TLS 连接。 这种类型也可用于 HTTP/2 和非 HTTP TLS 端点。
当您的应用程序容器暴露在未加密的 HTTP 端点上,但您必须处理加密的 HTTPS 流量时,请创建边缘路由。 客户端与路由器服务之间的 TLS 连接将被终止,路由器服务与应用程序 pod 之间的连接将不加密。 更多信息,请参阅 Red Hat OpenShift 边缘路由文档
重新加密 当您的应用程序容器暴露在加密的 HTTPS 端点上,且您必须处理 HTTPS 流量时,请创建一个重新加密的路由。 客户端与路由器服务之间的 TLS 连接将被终止,路由器服务与应用程序 pod 之间的新 TLS 连接将被创建。 更多信息,请参阅 Red Hat OpenShift re-encrypt route 文档

如果不需要使用定制域,那么可以使用格式为 <service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud 的 IBM提供的路由主机名。

入口控制器运行状况检查

允许通过网络策略或其他防火墙规则进行访问,以便 Ingress 控制器运行状况检查可访问 Ingress 控制器服务。

经典:如果使用 Calico pre-DNAT 网络策略或其他自定义防火墙阻止传入群集的流量,则必须允许从 Ingress 域健康监控源 IP 地址 到 Ingress 控制器服务 IP 地址的 443 端口入站访问,这样域提供商才能监控注册地址的健康状况,并只返回健康的端点。

VPC:如果设置了 VPC 安全组或 VPC 访问控制列表 (ACL) 来保护群集网络,请确保允许从 Ingress 域健康监控源 IP 地址 到 Ingress 控制器服务 IP 地址的 443 端口入站访问,这样域提供商就可以监控注册地址的健康状况,并只返回健康的端点。

设置公共路径

使用公共 Ingress 控制器来公开集群中的应用程序。

根据集群的基础架构提供者和服务端点设置,用于设置公共路由的方法有所不同。

在经典集群或具有公共云服务端点的 VPC 集群中设置公共路由

如果集群是在经典基础架构上创建的,或者如果集群是在 VPC 基础架构上创建的,并且您在集群创建期间启用了公共云服务端点,那么缺省情况下将使用公共 Ingress 控制器创建集群。 您可以使用此 Ingress 控制器为应用程序创建公共路径。

  1. 为应用程序部署创建 Kubernetes ClusterIP 服务。 该服务为 Ingress 控制器可将流量发送到的应用程序提供内部 IP 地址。

    oc expose deploy <app_deployment_name> --name my-app-svc
    
  2. 选择应用程序的域。 请注意,路由 URL 必须不超过 130 个字符 IBM提供的域: 如果不需要使用定制域,那么将以 <service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud 格式为您生成路由主机名。 定制域: 要指定定制域,请使用 DNS 提供程序或 IBM Cloud® Internet Services

    1. 获取 EXTERNAL-IP 列中每个专区中公共 Ingress 控制器服务的公共 IP 地址。 请注意,具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为 router-default,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如 router-dal12 之类的名称。
        oc get svc -n openshift-ingress
        ```
    1. 请通过您的 DNS 服务商创建一个自定义域名。
            如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如 `*.example.com`。
    {: tip}
    
    1. 通过添加 IP 地址作为 A 记录,将定制域映射到 Ingress 控制器的公共 IP 地址。
    
    
  3. 根据 应用程序所需的 TLS 终止类型 设置路线。 如果您没有定制域,请不要包含 --hostname 选项。 将为您生成格式为 <service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud 的路径主机名。 如果已注册通配符子域,请在创建的每个路由中指定唯一的子域。 例如,可以在此路由中指定 --hostname svc1.example.com,在另一个路由中指定 --hostname svc2.example.com

    • 简单:
        oc expose service <app_service_name> [--hostname <subdomain>]
        ```
    * 传递:
    ```sh {: pre}
        oc create route passthrough --service <app_service_name> [--hostname <subdomain>]
        ```
        需要处理 HTTP/2 连接吗? 创建路由后,运行 `oc edit route <app_service_name>` 并将路由的 `targetPort` 值更改为 `https`。 您可以通过运行 `curl -I --http2 https://<route> --insecure` 来测试路由。
    * Edge: 如果使用定制域,请包括 `--hostname`,`--cert` 和 `--key` 选项以及 (可选) `--ca-cert` 选项。 有关 TLS 证书要求的更多信息,请参阅 [Red Hat OpenShift 边缘路由文档](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/routes#nw-ingress-creating-an-edge-route-with-a-custom-certificate_secured-routes){: external}。
    ```sh {: pre}
        oc create route edge --service <app_service_name> [--hostname <subdomain> --cert <tls.crt> --key <tls.key> --ca-cert <ca.crt>]
        ```
    * 重新加密: 如果使用定制域,请包括 `--hostname`,`--cert` 和 `--key` 选项以及 (可选) `--ca-cert` 选项。 有关 TLS 证书要求的更多信息,请参阅 [Red Hat OpenShift re-encrypt route 文档](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/routes#nw-ingress-creating-a-reencrypt-route-with-a-custom-certificate_secured-routes){: external}。
    ```sh {: pre}
        oc create route reencrypt --service <app_service_name> --dest-ca-cert <destca.crt> [--hostname <subdomain> --cert <tls.crt> --key <tls.key> --ca-cert <ca.crt>]
        ```
    
  4. 验证是否已创建应用程序服务的路径。

    oc get routes
    
  5. 可选: 使用 可选配置定制缺省路由规则。 例如,您可以使用特定于路由的 HAProxy 注释。

仅使用私有云服务端点在 VPC 集群中设置公共路由

如果集群是在 VPC 基础结构上创建的,并且在集群创建期间仅启用了私有云服务端点,那么缺省情况下仅使用专用路由器创建集群。 要公开发布您的应用,您必须先创建一个公共资源 IngressController,并为其配置子域名。 Ingress 操作员会根据配置自动创建并配置新的公共 IngressController, Ingress 控制器,您可利用该控制器为应用创建公共路由。

请注意,即使在以下步骤中创建 IngressController 资源,IngressController 也仅需要为您创建和配置必需的 Ingress 控制器。 创建 Ingress 控制器后,可直接使用 Ingress 控制器来创建路径。

  1. 准备要用于 Ingress 控制器的域。

    • 定制域: 要注册定制域,请使用域名服务 (DNS) 提供程序或 IBM Cloud DNS。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如 *.example.com。 如果使用定制域,那么还必须在 IngressController 规范中指定域证书。 有关更多信息,请参阅 设置定制缺省证书
    • IBM提供的域:
      1. 列出集群中的现有子域。 在输出的 子域 列中,复制具有最高 000<n> 值的子域。
        ibmcloud oc nlb-dns ls --cluster CLUSTER_NAME_OR_ID
        
        在此示例输出中, mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud 子域具有最高 000<n>0002
        Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0000
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["5678efgh-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0001
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud     ["9012ijkl-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0002
        
      2. 在复制的子域中,将子域中的 000<n> 值更改为 000<n+1>。 例如,mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud 子域将更改为 mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.us-south.containers.appdomain.cloud。 您可以在后续步骤中注册此子域。
  2. 创建 YAML 文件,该文件通过步骤 1 中的域配置公共 Ingress 控制器。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: public
      namespace: openshift-ingress-operator
    spec:
      # defaultCertificate: If you are using a custom domain, specify the domain certificate
        # name: custom-certs-default
      replicas: 2
      domain: <domain>
      endpointPublishingStrategy:
        loadBalancer:
          scope: External
        type: LoadBalancerService
    
  3. 在集群的 openshift-ingress-operator 名称空间中创建 IngressController 资源。 创建 IngressController, 会根据 IngressController 设置在 openshift-ingress 命名空间中自动创建和部署公共 Ingress 控制器。 此外,将创建 Ingress 控制器服务以公开 Ingress 控制器。

    oc create -f public.yaml -n openshift-ingress-operator
    
  4. 获取 router-public 服务的 EXTERNAL IP 字段中的 VPC 主机名。 在 VPC 集群中,路由器服务的外部 IP 地址是浮动的,而是保留在 VPC 分配的主机名后面。

    oc get svc router-public -n openshift-ingress
    

    示例输出

    NAME                         TYPE           CLUSTER-IP       EXTERNAL-IP                             PORT(S)                      AGE
    router-public                LoadBalancer   172.21.57.132    1234abcd-us-south.lb.appdomain.cloud    80/TCP,443/TCP,1940/TCP      3m
    
  5. 向步骤 1 中选择的域注册服务的 VPC 主机名。 此步骤确保向您为 Ingress 控制器选择的域注册 Ingress 控制器服务的 IP 地址 (保留在 VPC 主机名后面)。

    • 定制域: 使用 DNS 提供程序将服务的 VPC 主机名添加为映射到定制域的 CNAME。
    • IBM提供的域: 为服务的 VPC 主机名创建 DNS 条目。 运行以下命令时,将自动生成在步骤 2 中指定的子域,并向 Ingress 控制器服务注册该子域。
        ibmcloud oc nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <router_VPC_hostname>
        ```
    
  6. 可选: 如果要使用 Ingress 控制器分片,以便特定路由由特定 Ingress 控制器处理 (例如,仅允许专用路由进入专用路由器),那么可以使用路由标签或名称空间标签来指定分片方法。 要在创建期间添加选择器,请将其包含在 spec 下的 ingresscontroller yaml 中。 例如,要允许 Ingress 控制器仅处理标签为 type=sharded 的入口/路由,可以添加 routeSelector。 有关更多信息,请参阅 Ingress 控制器分片

      routeSelector:
        matchLabels:
          type: sharded
    
    1. 要向现有 Ingress 控制器添加选择器,请获取 Ingress 控制器的列表。
        oc get ingresscontroller -n openshift-ingress-operator
        ```
    1. 将选择器添加到要在其中使用分片的 Ingress 控制器。
    
    ```sh {: pre}
        oc patch  -n openshift-ingress-operator IngressController/<name>   --type='merge'   -p '{"spec":{"routeSelector":{"matchLabels":{"type":"sharded"}}}}'
        ```
    
    1. 请注意,没有向默认 IngressController, 添加选择器,因此所有路由仍会被接入群集上的默认 Ingress 控制器。 您可以使用相关路由或名称空间标签选择器来更改此行为。 例如,要调整缺省路由器以跳过标签为 `type=sharded` 的入口/路由,请运行以下 patch 命令。
    ```sh {: pre}
        oc patch -n openshift-ingress-operator IngressController/default --type='merge'   -p '{"spec":{"routeSelector":{"matchExpressions":[{"key":"type","operator":"NotIn","values":["sharded"]}]}}}'
        ```
        集群上的多个路由和 Ingresses 依赖于缺省公共入口控制器。 确保更改正确无误后再编辑默认入口控制器。 有关更多信息,请参阅 [Ingress 控制器分片](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/networking_overview/index#nw-ingress-sharding_configuring-ingress){: external}。
        {: note}
    
    
    
  7. 为应用程序部署创建 Kubernetes ClusterIP 服务。 该服务为 Ingress 控制器可将流量发送到的应用程序提供内部 IP 地址。

    oc expose deploy <app_deployment_name> --name <app_service_name> -n <app_project>
    
  8. 根据 应用程序所需的 TLS 终止类型 设置路线。 如果不包含 --hostname 选项,那么将以 <app_service_name>-<app_project>.<router-subdomain> 格式为您生成路径主机名。

    • 简单:
        oc expose service <app_service_name> [--hostname <subdomain>]
        ```
    * 传递:
    ```sh {: pre}
        oc create route passthrough --service <app_service_name> [--hostname <subdomain>]
        ```
        需要处理 HTTP/2 连接吗? 创建路由后,运行 `oc edit route <app_service_name>` 并将路由的 `targetPort` 值更改为 `https`。 您可以通过运行 `curl -I --http2 https://<route> --insecure` 来测试路由。
    * Edge: 如果使用定制域,请包括 `--hostname`,`--cert` 和 `--key` 选项以及 (可选) `--ca-cert` 选项。 有关 TLS 证书要求的更多信息,请参阅 [Red Hat OpenShift 边缘路由文档](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/routes#nw-ingress-creating-an-edge-route-with-a-custom-certificate_secured-routes){: external}。
    ```sh {: pre}
        oc create route edge --service <app_service_name> [--hostname <subdomain> --cert <tls.crt> --key <tls.key> --ca-cert <ca.crt>]
        ```
    * 重新加密: 如果使用定制域,请包括 `--hostname`,`--cert` 和 `--key` 选项以及 (可选) `--ca-cert` 选项。 有关 TLS 证书要求的更多信息,请参阅 [Red Hat OpenShift re-encrypt route 文档](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/routes#nw-ingress-creating-a-reencrypt-route-with-a-custom-certificate_secured-routes){: external}。
    ```sh {: pre}
        oc create route reencrypt --service <app_service_name> --dest-ca-cert <destca.crt> [--hostname <subdomain> --cert <tls.crt> --key <tls.key> --ca-cert <ca.crt>]
        ```
    
  9. 验证是否已创建应用程序的路径。

    oc get routes
    
  10. 可选: 使用 可选配置定制公共 Ingress 控制器的路由规则。 例如,您可以使用特定于路由的 HAProxy 注释。

  11. 要使用同一子域为更多应用程序创建路径,可以重复步骤 7-10,以便由同一公共 Ingress 控制器生成该路径。 如果要使用其他子域为更多应用程序创建路径,请重复此部分中的所有步骤以创建具有其他域的新的公共 Ingress 控制器。

设置专用路由

使用专用 Ingress 控制器在专用网络上公开集群中的应用程序。

用于设置专用路由的方法根据集群的基础架构提供者和服务端点设置而有所不同。

在经典集群或具有公共云服务端点的 VPC 集群中设置专用路由

如果集群是在经典基础架构上创建的,或者如果集群是在 VPC 基础架构上创建的,并且您在集群创建期间启用了公共云服务端点,那么缺省情况下将仅使用公共 Ingress 控制器来创建集群。 要私有化暴露您的应用,您必须先创建一个私有 IngressController 资源,并使用子域名配置控制器。 Ingress 操作程序会自动创建并配置新的专用 Ingress 控制器,您可以使用该控制器为应用程序创建专用路径。

请注意,即使在以下步骤中创建 IngressController 资源,IngressController 资源也仅需要为您创建和配置必需的 Ingress 控制器。 创建 Ingress 控制器后,可直接使用路由器来创建路由。

  1. 准备要用于 Ingress 控制器的域。

    • 定制域,经典或 VPC 集群: 要注册定制域,请使用域名服务 (DNS) 提供程序或 IBM Cloud DNS。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如 *.example.com
    • IBM提供的域,仅限 VPC 集群:
      1. 列出集群中的现有子域。 在输出的 子域 列中,复制具有最高 000<n> 值的子域。
        ibmcloud oc nlb-dns ls --cluster <cluster_name_or_id>
        
        在此示例输出中, mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud 子域具有最高 000<n>0002
        Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0000
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["5678efgh-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0001
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud     ["9012ijkl-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0002
        
      2. 在复制的子域中,将子域中的 000<n> 值更改为 000<n+1>。 例如,mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud 子域将更改为 mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.us-south.containers.appdomain.cloud。 您可以在后续步骤中注册此子域。
  2. 创建配置文件,以通过步骤 1 中的域来配置专用 Ingress 控制器。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: private
      namespace: openshift-ingress-operator
    spec:
      replicas: 2
      domain: <domain>
      endpointPublishingStrategy:
        loadBalancer:
          scope: Internal
        type: LoadBalancerService
    
  3. 在集群的 openshift-ingress-operator 名称空间中创建 IngressController 资源。 创建 IngressController 资源时,将根据 IngressController 设置在 openshift-ingress 名称空间中自动创建并部署专用 Ingress 控制器。 此外,将创建 Ingress 控制器服务以使用 IP 地址 (经典集群) 或 VPC 主机名 (VPC 集群) 来公开 Ingress 控制器。

    oc create -f private.yaml -n openshift-ingress-operator
    
  4. 获取 router-private 服务的 EXTERNAL IP 字段中的 IP 地址或 VPC 主机名。

    oc get svc router-private -n openshift-ingress
    

    经典集群的输出示例:

    NAME                         TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
    router-private               LoadBalancer   172.21.57.132    10.XX.XX.XX    80/TCP,443/TCP,1940/TCP      3m
    

    VPC 集群的输出示例:

    NAME                         TYPE           CLUSTER-IP       EXTERNAL-IP                             PORT(S)                      AGE
    router-private               LoadBalancer   172.21.57.132    1234abcd-us-south.lb.appdomain.cloud    80/TCP,443/TCP,1940/TCP      3m
    
  5. 向步骤 1 中选择的域注册服务的外部 IP 地址或 VPC 主机名。

    • 定制域,经典或 VPC 集群: 使用 DNS 提供程序将服务的外部 IP 地址添加为映射到定制域的 A 记录 (经典集群) 或 VPC 主机名作为 CNAME (VPC 集群)。
    • IBM提供的域,仅 VPC 集群: 为服务的 VPC 主机名创建 DNS 条目。 运行以下命令时,将自动生成在步骤 2 中指定的子域,并向 Ingress 控制器服务注册该子域。
        ibmcloud oc nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <router_VPC_hostname>
        ```
    
  6. 可选: 如果要使用 Ingress 控制器分片,以便特定路由由特定 Ingress 控制器处理 (例如,仅允许专用路由进入专用路由器),那么可以使用路由标签或名称空间标签来指定分片方法。 要在创建期间添加选择器,请将其包含在 spec 下的 ingresscontroller yaml 中。 例如,要允许 Ingress 控制器仅处理标签为 type=sharded 的入口/路由,可以添加 routeSelector。 有关更多信息,请参阅 Ingress 控制器分片

      routeSelector:
        matchLabels:
          type: sharded
    
    1. 要向现有 Ingress 控制器添加选择器,请获取 Ingress 控制器的列表。
        oc get ingresscontroller -n openshift-ingress-operator
        ```
    1. 将选择器添加到要在其中使用分片的 Ingress 控制器。
    
    ```sh {: pre}
        oc patch  -n openshift-ingress-operator IngressController/<name>   --type='merge'   -p '{"spec":{"routeSelector":{"matchLabels":{"type":"sharded"}}}}'
        ```
    
    1. 请注意,没有向默认 IngressController, 添加选择器,因此所有路由仍会被接入群集上的默认 Ingress 控制器。 您可以使用相关路由或名称空间标签选择器来更改此行为。 例如,要调整缺省路由器以跳过标签为 `type=sharded` 的入口/路由,请运行以下 patch 命令。
    ```sh {: pre}
        oc patch -n openshift-ingress-operator IngressController/default --type='merge'   -p '{"spec":{"routeSelector":{"matchExpressions":[{"key":"type","operator":"NotIn","values":["sharded"]}]}}}'
        ```
    
  7. 为应用程序部署创建 Kubernetes ClusterIP 服务。 该服务为 Ingress 控制器可将流量发送到的应用程序提供内部 IP 地址。

    oc expose deploy <app_deployment_name> --name <app_service_name> -n <app_project>
    
  8. 根据 应用程序所需的 TLS 终止类型 设置路线。 指定在步骤 5 中设置的主机名。

    • 简单:
        oc expose service <app_service_name> --hostname <subdomain>
        ```
    * 传递:
    ```sh {: pre}
        oc create route passthrough --service <app_service_name> --hostname <subdomain>
        ```
        需要处理 HTTP/2 连接吗? 创建路由后,运行 `oc edit route <app_service_name>` 并将路由的 `targetPort` 值更改为 `https`。 您可以通过运行 `curl -I --http2 https://<route> --insecure` 来测试路由。
    * Edge: 如果使用定制域,请包含 `--cert` 和 `--key` 选项以及 (可选) `--ca-cert` 选项。 有关 TLS 证书要求的更多信息,请参阅 [Red Hat OpenShift 边缘路由文档](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/routes#nw-ingress-creating-an-edge-route-with-a-custom-certificate_secured-routes){: external}。
    ```sh {: pre}
        oc create route edge --service <app_service_name> --hostname <subdomain> [--cert <tls.crt> --key <tls.key> --ca-cert <ca.crt>]
        ```
    * 重新加密: 如果使用定制域,请包含 `--cert` 和 `--key` 选项以及 (可选) `--ca-cert` 选项。 有关 TLS 证书要求的更多信息,请参阅 [Red Hat OpenShift re-encrypt route 文档](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/routes#nw-ingress-creating-a-reencrypt-route-with-a-custom-certificate_secured-routes){: external}。
    ```sh {: pre}
        oc create route reencrypt --service <app_service_name> --dest-ca-cert <destca.crt> --hostname <subdomain> [--cert <tls.crt> --key <tls.key> --ca-cert <ca.crt>]
        ```
    
  9. 验证是否已创建应用程序的路径。

    oc get routes
    
  10. 可选: 使用 可选配置定制专用 Ingress 控制器的路由规则。 例如,您可以使用特定于路由的 HAProxy 注释。

  11. 要使用同一子域为更多应用程序创建路径,可以重复步骤 7-10,以便由同一专用 Ingress 控制器生成该路径。 如果要使用其他子域为更多应用程序创建路径,请重复此部分中的所有步骤以创建新的专用 Ingress 控制器。

在仅具有私有云服务端点的 VPC 集群中设置私有路由

如果集群是在 VPC 基础结构上创建的,并且在集群创建期间启用了唯一的私有云服务端点,那么缺省情况下将使用专用 Ingress 控制器创建集群。 您可以使用此 Ingress 控制器为应用程序创建专用路径。

  1. 为应用程序部署创建 Kubernetes ClusterIP 服务。 该服务为 Ingress 控制器可将流量发送到的应用程序提供内部 IP 地址。

    oc expose deploy <app_deployment_name> --name my-app-svc
    
  2. 选择应用程序的域。

    • IBM提供的域: 如果不需要定制域,将以 <service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud 格式为您生成路由子域。
    • 定制域: 要指定定制域,请使用 DNS 提供程序或 IBM Cloud® Internet Services
      1. 获取 EXTERNAL-IP 列中每个专区中专用 Ingress 控制器服务的外部 IP 地址。 请注意,具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为 router-default,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如 router-dal12 之类的名称。

        oc get svc -n openshift-ingress
        
      2. 请通过您的 DNS 服务商创建一个自定义域名。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如 *.example.com

      3. 通过添加 IP 地址作为 A 记录,将定制域映射到 Ingress 控制器服务的专用 IP 地址。

  3. 根据 应用程序所需的 TLS 终止类型 设置路线。 如果您没有定制域,请不要包含 --hostname 选项。 将为您生成格式为 <service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud 的路由子域。 如果已注册通配符子域,请在创建的每个路由中指定唯一的子域。 例如,可以在此路由中指定 --hostname svc1.example.com,在另一个路由中指定 --hostname svc2.example.com

    • 简单:
        oc expose service <app_service_name> [--hostname <subdomain>]
        ```
    * 传递:
    ```sh {: pre}
        oc create route passthrough --service <app_service_name> [--hostname <subdomain>]
        ```
        需要处理 HTTP/2 连接吗? 创建路由后,运行 `oc edit route <app_service_name>` 并将路由的 `targetPort` 值更改为 `https`。 您可以通过运行 `curl -I --http2 https://<route> --insecure` 来测试路由。
    
    * Edge: 如果使用定制域,请包括 `--hostname`,`--cert` 和 `--key` 选项以及 (可选) `--ca-cert` 选项。 有关 TLS 证书要求的更多信息,请参阅 [Red Hat OpenShift 边缘路由文档](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/routes#nw-ingress-creating-an-edge-route-with-a-custom-certificate_secured-routes){: external}。
    ```sh {: pre}
        oc create route edge --service <app_service_name> [--hostname <subdomain> --cert <tls.crt> --key <tls.key> --ca-cert <ca.crt>]
        ```
    * 重新加密: 如果使用定制域,请包括 `--hostname`,`--cert` 和 `--key` 选项以及 (可选) `--ca-cert` 选项。 有关 TLS 证书要求的更多信息,请参阅 [Red Hat OpenShift re-encrypt route 文档](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/routes#nw-ingress-creating-a-reencrypt-route-with-a-custom-certificate_secured-routes){: external}。
    ```sh {: pre}
        oc create route reencrypt --service <app_service_name> --dest-ca-cert <destca.crt> [--hostname <subdomain> --cert <tls.crt> --key <tls.key> --ca-cert <ca.crt>]
        ```
    
  4. 验证是否已创建应用程序服务的路径。

    oc get routes
    
  5. 可选: 使用 可选配置定制缺省路由规则。 例如,您可以使用特定于路由的 HAProxy 注释。

在经典集群中的 VLAN 之间移动 Ingress 控制器服务

更改工作节点 VLAN 连接时,工作节点将连接到新的 VLAN 并分配新的公用或专用 IP 地址。 但是,Ingress 控制器服务无法自动迁移到新 VLAN,因为从属于旧 VLAN 的子网为其分配了稳定,可移植的公共或专用 IP 地址。 当工作程序节点和 Ingress 控制器连接到不同的 VLAN 时,Ingress 控制器无法将入局网络流量转发到工作程序节点上的应用程序 pod。 要将 Ingress 控制器服务移至其他 VLAN,必须在新 VLAN 上创建 Ingress 控制器服务,并删除旧 VLAN 上的 Ingress 控制器服务。

  1. 在新 VLAN 上创建 Ingress 控制器服务。

    1. 为新的 Ingress 控制器服务创建 YAML 配置文件。 指定 Ingress 控制器服务部署到的区域。 将文件另存为 router-new-<zone>.yaml
      • 公共 Ingress 控制器服务:
        apiVersion: v1
        kind: Service
        metadata:
          annotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: <zone>
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
          finalizers:
          - service.kubernetes.io/load-balancer-cleanup
          labels:
            app: router
            ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
            router: router-default
          name: router-new-<zone>
          namespace: openshift-ingress
        spec:
          externalTrafficPolicy: Local
          ports:
          - name: http
            port: 80
            protocol: TCP
            targetPort: http
          - name: https
            port: 443
            protocol: TCP
            targetPort: https
          selector:
            ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
          sessionAffinity: None
          type: LoadBalancer
        
      • 专用 Ingress 控制器服务:
        apiVersion: v1
        kind: Service
        metadata:
          annotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: <zone>
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private
          finalizers:
          - service.kubernetes.io/load-balancer-cleanup
          labels:
            app: router
            ingresscontroller.operator.openshift.io/deployment-ingresscontroller: private
            router: router-private
          name: router-new-<zone>
          namespace: openshift-ingress
        spec:
          externalTrafficPolicy: Local
          ports:
          - name: http
            port: 80
            protocol: TCP
            targetPort: http
          - name: https
            port: 443
            protocol: TCP
            targetPort: https
          selector:
            ingresscontroller.operator.openshift.io/deployment-ingresscontroller: private
          sessionAffinity: None
          type: LoadBalancer
        
    2. 创建新的 Ingress 控制器服务。
        oc apply -f router-new-<zone>.yaml -n openshift-ingress
        ```
    1. 获取新 Ingress 控制器服务的 **EXTERNAL-IP** 地址。 此 IP 地址来自新 VLAN 上的子网。
    ```sh {: pre}
        oc get svc router-new -n openshift-ingress
        ```
        公共 Ingress 控制器服务的示例输出:
        ```sh {: screen}
        NAME                         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                     AGE
        router-new                   LoadBalancer   172.21.XX.XX     169.XX.XXX.XX   80:31049/TCP,443:30219/TCP                  2m
        ```
    1. **多专区集群**: 如果更改了多个专区中工作程序节点的 VLAN,请重复这些步骤以在每个专区中的新 VLAN 上创建 Ingress 控制器服务。
    
    
  2. 记下 Ingress 控制器的 主机名。 在输出中,查找格式类似于 <cluster_name>-<random_hash>-0001.<region>.containers.appdomain.cloud 的主机名。

    ibmcloud oc nlb-dns ls -c <cluster_name_or_ID>
    

    示例输出

    Hostname                                                                             IP(s)           Health Monitor   SSL Cert Status   SSL Cert Secret Name                            Secret Namespace
    mycluster-35366fb2d3d90fd50548180f69e7d12a-0001.us-east.containers.appdomain.cloud   169.XX.XXX.XX   None             created           roks-ga-35366fb2d3d90fd50548180f69e7d12a-0001   default
    ...
    
  3. 将在步骤 1 中找到的新 Ingress 控制器服务的 IP 地址添加到 Ingress 控制器的主机名。 如果在步骤 1 中为多个专区创建了服务,请在重复的 --ip 选项中单独包含每个 IP 地址。

    ibmcloud oc nlb-dns add -c <cluster_name_or_ID> --ip <new_IP> --nlb-host <subdomain>
    

    现在,新 VLAN 上的 Ingress 控制器服务已向集群中缺省 Ingress 控制器的域注册,并且可以将入局请求转发到应用程序。

  4. 获取旧 VLAN 上旧 Ingress 控制器服务的 IP 地址。 多专区集群: 如果更改了多个专区中工作程序节点的 VLAN,请获取更改了这些 VLAN 的每个专区中 Ingress 控制器服务的 IP 地址。 请注意,您具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为 router-default,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如 router-dal12 之类的名称。

    oc get svc -n openshift-ingress
    

    多专区集群的示例输出:

    NAME                          TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE
    router-dal12                  LoadBalancer   172.21.190.62    169.XX.XX.XX     80:32318/TCP,443:30915/TCP   51d
    router-default                LoadBalancer   172.21.47.119    169.XX.XX.XX     80:31311/TCP,443:32561/TCP   78d
    router-internal-default       ClusterIP      172.21.51.30     <none>           80/TCP,443/TCP,1936/TCP      78d
    
  5. 从 Ingress 控制器的主机名中除去在步骤 2 中找到的旧 Ingress 控制器服务的 IP 地址。 多专区集群: 在重复的 --ip 选项中单独包含每个 IP 地址。

    ibmcloud oc nlb-dns rm classic -c <cluster_name_or_ID> --ip <old_IP> --nlb-host <hostname>
    
  6. 验证 Ingress 控制器的主机名现在是否已向新 IP 地址注册。 使用新服务的 IP 地址更新 Ingress 控制器主机名后,无需对 Ingress 控制器或路径进行进一步更改。

    ibmcloud oc nlb-dns ls -c <cluster_name_or_ID>
    
  7. 删除旧 VLAN 上的 Ingress 控制器服务。

    oc delete svc <old_router_svc> -n openshift-ingress
    
  8. 可选:如果不再需要旧 VLAN 上的子网,那么可以除去子网

管理 OpenShift 默认路由器上的 80 端口

在2026年1月26日或之后创建的VPC集群中,默认情况下所有应用程序层负载均衡器(ALB)的80端口均被阻止。 在此日期之前创建的群集不受影响。

您可以在 OpenShift 默认路由器上管理 80 端口。 请注意,您所做的任何更改都适用于集群中的所有 OpenShift 默认路由器。

  • 要获取 OpenShift 默认路由器上 80 端口的状态,请运行以下命令。

    ibmcloud oc ingress security port80 get --cluster <cluster_name_or_ID>
    
  • 要在 OpenShift 默认路由器上启用端口 80,请运行以下命令。

    ibmcloud oc ingress security port80 enable --cluster <cluster_name_or_ID>
    
  • 要在 OpenShift 默认路由器上禁用端口 80,请运行以下命令。

    ibmcloud oc ingress security port80 disable --cluster <cluster_name_or_ID>