在 Red Hat OpenShift 4 中公开具有路径的应用程序
使用路由在路由器的外部 IP 地址上的 Red Hat® OpenShift® on IBM Cloud® 集群中公开服务。
此信息适用于运行 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 负载均衡器的请求。
经典单区集群中的交通流
下图显示了路由器如何将网络流量从互联网引导到单区经典集群中的应用程序。
-
对应用程序的请求使用为应用程序设置的路径主机名。
-
DNS 服务会将子域解析为路由器服务的可移植公共 IP 地址。
-
路由器收到请求后,会通过专用网络将其转发到应用程序 pod 的专用 IP 地址。 请求包的源 IP 地址会更改为运行路由器 pod 的 Worker 节点的公共 IP 地址。 如果集群中部署了多个应用程序实例,路由器会在应用程序 pod 之间发送请求。
-
当应用程序返回响应数据包时,它会使用转发客户端请求的路由器所在的工作节点的 IP 地址。 然后,路由器通过负载均衡器服务将响应包发送到客户机。
经典多区集群中的交通流
下图显示了路由器如何将网络流量从互联网引导到多区经典集群中的应用程序。
-
对应用程序的请求使用为应用程序设置的路径主机名。
-
DNS 服务将路由子域解析为由多专区负载均衡器 (MZLB) 报告为正常运行的路由器服务的可移植公共 IP 地址。 MZLB 会持续检查群集中每个区域中暴露路由器的服务的可移植公共 IP 地址。 请求由不同区域的路由器服务轮流处理。
-
根据路由器服务的解析 IP 地址,路由器接收请求。
-
路由器通过专用网络将请求转发到应用程序 pod 的专用 IP 地址。 请求包的源 IP 地址会更改为运行路由器 pod 的 Worker 节点的公共 IP 地址。 每个路由器向自己区域内的应用程序实例和其他区域内的应用程序实例发送请求。 此外,如果在一个专区中部署了多个应用程序实例,那么路由器会在应用程序 pod 之间交替发出请求。
-
当应用程序返回响应数据包时,它会使用转发客户端请求的路由器所在的工作节点的 IP 地址。 然后,路由器通过负载均衡器服务将响应包发送到客户机。
具有公共云服务端点的多专区 VPC 集群中的流量流
在启用公共云服务端点的情况下创建多专区 VPC 集群时,缺省情况下会创建公共 Ingress 控制器。 Ingress 控制器为应用程序分配可公开访问的路径,并在公共主机网络接口上侦听对应用程序的请求。
下图显示了入口控制器如何将网络流量从互联网引导到多区 VPC 集群中的应用程序。
-
对应用程序的请求使用为应用程序设置的路径主机名。
-
DNS 服务将路由子域解析为分配给 Ingress 控制器的服务的 VPC 负载均衡器主机名。 在 VPC 集群中,Ingress 控制器服务的外部 IP 地址是浮动的,并且保留在 VPC 分配的主机名后面。
-
VPC 负载均衡器将 VPC 主机名解析为报告为正常运行的 Ingress 控制器服务的可用外部 IP 地址。 VPC 负载均衡器会持续检查在集群中的每个专区中公开 Ingress 控制器的服务的外部 IP 地址。
-
根据解析的 IP 地址,VPC 负载均衡器将请求发送到 Ingress 控制器服务。
-
入口控制器通过专用网络将请求转发到应用程序 pod 的专用 IP 地址。 请求数据包的源 IP 地址会更改为运行入口控制器 pod 的工作节点的 IP 地址。 每个 Ingress 控制器都会向自己区域内的应用程序实例和其他区域内的应用程序实例发送请求。 此外,如果在一个区域中部署了多个应用程序实例,那么 Ingress 控制器会在应用程序 pod 之间交换请求。
-
当应用程序返回响应数据包时,它会使用转发客户端请求的 Ingress 控制器所在工作节点的 IP 地址。 然后,Ingress 控制器通过 VPC 负载均衡器将响应包发送到客户机。
仅具有私有云服务端点的多专区 VPC 集群中的流量流
当您仅使用私有云服务端点创建多专区 VPC 集群时,缺省情况下会创建私有 Ingress 控制器。 Ingress 控制器为应用程序分配专用可访问路径,并在专用主机网络接口上进行侦听。 只有连接到专用 VPC 网络的客户机才能访问由专用路由公开的应用程序。
下图显示了 Ingress 控制器如何将网络流量从专用网络定向到多专区 VPC 集群中的应用程序。
-
连接到专用 VPC 网络的客户机通过使用应用程序的专用路由向应用程序发送请求。 例如,您可以使用虚拟专用 Cloud VPN,IBM Cloud Transit Gateway或 IBM Cloud Direct Link 来允许来自本地网络,另一个 VPC 或 IBM Cloud 经典基础结构的请求到集群中运行的应用程序。
-
DNS 服务将路由子域解析为分配给 Ingress 控制器的服务的 VPC 负载均衡器主机名。 在 VPC 集群中,Ingress 控制器服务的 IP 地址是浮动的,并且保留在 VPC 分配的主机名之后。 请注意,虽然路由子域的 DNS 记录是在公共 DNS 系统中注册的,但可从 VPC 访问 DNS 解析服务器。
-
专用 VPC 负载均衡器将 VPC 主机名解析为报告为正常运行的 Ingress 控制器服务的可用专用 IP 地址。 VPC 负载均衡器会持续检查集群中每个专区中公开 Ingress 控制器的服务的 IP 地址。
-
根据解析的 IP 地址,VPC 负载均衡器将请求发送到 Ingress 控制器服务。
-
入口控制器通过专用网络将请求转发到应用程序 pod 的专用 IP 地址。 请求数据包的源 IP 地址会更改为运行入口控制器 pod 的工作节点的 IP 地址。 每个 Ingress 控制器都会向自己区域内的应用程序实例和其他区域内的应用程序实例发送请求。 此外,如果在一个区域中部署了多个应用程序实例,那么 Ingress 控制器会在应用程序 pod 之间交换请求。
-
当应用程序返回响应数据包时,它会使用转发客户端请求的 Ingress 控制器所在工作节点的 IP 地址。 然后,Ingress 控制器通过 VPC 负载均衡器并通过 IBM Cloud VPC VPN,Transit Gateway或 Direct Link 将响应包发送到客户机。
路由类型和 TLS 终止
Red Hat OpenShift 根据应用程序所需的 TLS 终止类型提供四种类型的路由。 公共和专用路由支持每种路由类型。
路由类型 | 用例 |
---|---|
简单 | 如果您不需要 TLS 加密,请创建一个简单的路由来处理未加密的 HTTP 流量。 |
PassThrough | 当您希望 TLS 连接不间断地从客户机传递到应用程序 pod 时,请创建传递路径。 路由器不参与加密的 HTTPS 流量的TLS终止,因此应用程序容器必须终止TLS连接。 这种类型也可用于 HTTP/2 和非 HTTP TLS端点。 |
边 | 当您的应用程序容器暴露在未加密的 HTTP 端点上,但您必须处理加密的 HTTPS 流量时,请创建边缘路由。 客户机与路由器服务之间的 TLS 连接已终止,并且路由器服务与应用程序 pod 之间的连接未加密。 更多信息,请参阅 Red Hat OpenShift 边缘路线文档。 |
重新加密 | 当您的应用程序容器暴露在加密的 HTTPS 端点上,且您必须处理 HTTPS 流量时,请创建一个重新加密的路由。 将终止客户机与路由器服务之间的 TLS 连接,并在路由器服务与应用程序 pod 之间创建新的 TLS 连接。 更多信息,请参阅 Red Hat OpenShift 重新加密路由文档。 |
如果不需要使用定制域,那么可以使用格式为 <service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud
的 IBM提供的路由主机名。
入口控制器运行状况检查
允许通过网络策略或其他防火墙规则进行访问,以便 Ingress 控制器运行状况检查可访问 Ingress 控制器服务。
经典: 如果使用 Calico DNAT 之前的网络策略或其他定制防火墙来阻止到集群的入局流量,您必须允许从 Red Hat OpenShift 控制平面和 Akamai 的 IPv4 IP 地址对 Ingress 控制器服务的 IP 地址进行入站访问,以便 Red Hat OpenShift 控制平面可以检查 Ingress 控制器的运行状况。 例如,如果使用 Calico 策略,那么 创建 Calico DNAT 前策略 以允许从 Akamai 的源 IP 地址 对 Ingress 控制器进行入站访问,这些 IP 地址用于检查端口 80 上的 Ingress 控制器的运行状况以及集群所在区域的 控制平面子网。 继续执行下一步以获取 Ingress 控制器服务 IP 地址。
VPC: 如果设置 VPC 安全组 或 VPC 访问控制表(ACL) 以保护集群网络,请确保创建规则以允许来自 Red Hat OpenShift 控制平面 IP 地址的必需流量。 或者,为了允许入站流量进行入口控制器健康检查,您可以创建一个规则,允许所有入站流量通过端口 80。
设置公共路径
使用公共 Ingress 控制器来公开集群中的应用程序。
根据集群的基础架构提供者和服务端点设置,用于设置公共路由的方法有所不同。
在经典集群或具有公共云服务端点的 VPC 集群中设置公共路由
如果集群是在经典基础架构上创建的,或者如果集群是在 VPC 基础架构上创建的,并且您在集群创建期间启用了公共云服务端点,那么缺省情况下将使用公共 Ingress 控制器创建集群。 您可以使用此 Ingress 控制器为应用程序创建公共路径。
-
为应用程序部署创建 Kubernetes
ClusterIP
服务。 该服务为 Ingress 控制器可将流量发送到的应用程序提供内部 IP 地址。oc expose deploy <app_deployment_name> --name my-app-svc
-
选择应用程序的域。 请注意,路由 URL 必须不超过 130 个字符 IBM提供的域: 如果不需要使用定制域,那么将以
<service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud
格式为您生成路由主机名。 定制域: 要指定定制域,请使用 DNS 提供程序或 IBM Cloud® Internet Services。-
获取 EXTERNAL-IP 列中每个专区中公共 Ingress 控制器服务的公共 IP 地址。 请注意,具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为
router-default
,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如router-dal12
之类的名称。oc get svc -n openshift-ingress
-
通过 DNS 提供商创建自定义域名。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如
*.example.com
。 -
通过添加 IP 地址作为 A 记录,将定制域映射到 Ingress 控制器的公共 IP 地址。
-
-
设置基于应用程序需要的 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>]
- 传递:
需要处理 HTTP/2 连接吗? 创建路由后,运行oc create route passthrough --service <app_service_name> [--hostname <subdomain>]
oc edit route <app_service_name>
并将路由的targetPort
值更改为https
。 您可以通过运行curl -I --http2 https://<route> --insecure
来测试路由。 - Edge: 如果使用定制域,请包括
--hostname
,--cert
和--key
选项以及 (可选)--ca-cert
选项。 有关 TLS 证书需求的更多信息,请参阅 Red Hat OpenShift 边缘路由文档。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 重新加密路由文档。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>]
- 简单:
-
验证是否已创建应用程序服务的路径。
oc get routes
-
可选: 使用 可选配置定制缺省路由规则。 例如,您可以使用 特定于路由的 HAProxy 注释。
仅使用私有云服务端点在 VPC 集群中设置公共路由
如果集群是在 VPC 基础结构上创建的,并且在集群创建期间仅启用了私有云服务端点,那么缺省情况下仅使用专用路由器创建集群。 要公开公开应用程序,必须首先创建公共 IngressController 资源并使用子域进行配置。 Ingress 操作员会根据 IngressController, 自动创建和配置一个新的公共 Ingress 控制器,您可以使用它为应用程序创建公共路由。
请注意,即使在以下步骤中创建 IngressController 资源,IngressController 也仅需要为您创建和配置必需的 Ingress 控制器。 创建 Ingress 控制器后,可直接使用 Ingress 控制器来创建路径。
-
准备要用于 Ingress 控制器的域。
- 定制域: 要注册定制域,请使用域名服务 (DNS) 提供程序或 IBM Cloud DNS。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如
*.example.com
。 如果使用定制域,那么还必须在IngressController
规范中指定域证书。 有关更多信息,请参阅 设置定制缺省证书 - IBM提供的域:
- 列出集群中的现有子域。 在输出的 子域 列中,复制具有最高
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
- 在复制的子域中,将子域中的
000<n>
值更改为000<n+1>
。 例如,mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud
子域将更改为mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.us-south.containers.appdomain.cloud
。 您可以在后续步骤中注册此子域。
- 列出集群中的现有子域。 在输出的 子域 列中,复制具有最高
- 定制域: 要注册定制域,请使用域名服务 (DNS) 提供程序或 IBM Cloud DNS。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如
-
创建 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
-
在集群的
openshift-ingress-operator
名称空间中创建 IngressController 资源。 创建 IngressController, 会根据 IngressController 设置在openshift-ingress
命名空间中自动创建和部署公共 Ingress 控制器。 此外,将创建 Ingress 控制器服务以公开 Ingress 控制器。oc create -f public.yaml -n openshift-ingress-operator
-
获取
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
-
向步骤 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>
-
-
可选: 如果要使用 Ingress 控制器分片,以便特定路由由特定 Ingress 控制器处理 (例如,仅允许专用路由进入专用路由器),那么可以使用路由标签或名称空间标签来指定分片方法。 要在创建期间添加选择器,请将其包含在
spec
下的ingresscontroller
yaml 中。 例如,要允许 Ingress 控制器仅处理标签为type=sharded
的入口/路由,可以添加routeSelector
。 有关更多信息,请参阅 Ingress 控制器分片。routeSelector: matchLabels: type: sharded
-
要向现有 Ingress 控制器添加选择器,请获取 Ingress 控制器的列表。
oc get ingresscontroller -n openshift-ingress-operator
-
将选择器添加到要在其中使用分片的 Ingress 控制器。
oc patch -n openshift-ingress-operator IngressController/<name> --type='merge' -p '{"spec":{"routeSelector":{"matchLabels":{"type":"sharded"}}}}'
-
请注意,没有向默认 IngressController, 添加选择器,因此所有路由仍会被接入群集上的默认 Ingress 控制器。 您可以使用相关路由或名称空间标签选择器来更改此行为。 例如,要调整缺省路由器以跳过标签为
type=sharded
的入口/路由,请运行以下 patch 命令。oc patch -n openshift-ingress-operator IngressController/default --type='merge' -p '{"spec":{"routeSelector":{"matchExpressions":[{"key":"type","operator":"NotIn","values":["sharded"]}]}}}'
集群上的多个路由和 Ingresses 依赖于缺省公共入口控制器。 确保更改正确无误后再编辑默认入口控制器。 有关更多信息,请参阅 Ingress 控制器分片。
-
-
为应用程序部署创建 Kubernetes
ClusterIP
服务。 该服务为 Ingress 控制器可将流量发送到的应用程序提供内部 IP 地址。oc expose deploy <app_deployment_name> --name <app_service_name> -n <app_project>
-
设置基于应用程序需要的 TLS 终止类型 的路由。 如果不包含
--hostname
选项,那么将以<app_service_name>-<app_project>.<router-subdomain>
格式为您生成路径主机名。- 简单:
oc expose service <app_service_name> [--hostname <subdomain>]
- 传递:
需要处理 HTTP/2 连接吗? 创建路由后,运行oc create route passthrough --service <app_service_name> [--hostname <subdomain>]
oc edit route <app_service_name>
并将路由的targetPort
值更改为https
。 您可以通过运行curl -I --http2 https://<route> --insecure
来测试路由。 - Edge: 如果使用定制域,请包括
--hostname
,--cert
和--key
选项以及 (可选)--ca-cert
选项。 有关 TLS 证书需求的更多信息,请参阅 Red Hat OpenShift 边缘路由文档。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 重新加密路由文档。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>]
- 简单:
-
验证是否已创建应用程序的路径。
oc get routes
-
可选: 使用 可选配置定制公共 Ingress 控制器的路由规则。 例如,您可以使用 特定于路由的 HAProxy 注释。
-
要使用同一子域为更多应用程序创建路径,可以重复步骤 7-10,以便由同一公共 Ingress 控制器生成该路径。 如果要使用其他子域为更多应用程序创建路径,请重复此部分中的所有步骤以创建具有其他域的新的公共 Ingress 控制器。
设置专用路由
使用专用 Ingress 控制器在专用网络上公开集群中的应用程序。
用于设置专用路由的方法根据集群的基础架构提供者和服务端点设置而有所不同。
在经典集群或具有公共云服务端点的 VPC 集群中设置专用路由
如果集群是在经典基础架构上创建的,或者如果集群是在 VPC 基础架构上创建的,并且您在集群创建期间启用了公共云服务端点,那么缺省情况下将仅使用公共 Ingress 控制器来创建集群。 要以专用方式公开应用程序,必须首先创建专用 IngressController 资源,并使用子域配置控制器。 Ingress 操作程序会自动创建并配置新的专用 Ingress 控制器,您可以使用该控制器为应用程序创建专用路径。
请注意,即使在以下步骤中创建 IngressController 资源,IngressController 资源也仅需要为您创建和配置必需的 Ingress 控制器。 创建 Ingress 控制器后,可直接使用路由器来创建路由。
-
准备要用于 Ingress 控制器的域。
- 定制域,经典或 VPC 集群: 要注册定制域,请使用域名服务 (DNS) 提供程序或 IBM Cloud DNS。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如
*.example.com
。 - IBM提供的域,仅限 VPC 集群:
- 列出集群中的现有子域。 在输出的 子域 列中,复制具有最高
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
- 在复制的子域中,将子域中的
000<n>
值更改为000<n+1>
。 例如,mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud
子域将更改为mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.us-south.containers.appdomain.cloud
。 您可以在后续步骤中注册此子域。
- 列出集群中的现有子域。 在输出的 子域 列中,复制具有最高
- 定制域,经典或 VPC 集群: 要注册定制域,请使用域名服务 (DNS) 提供程序或 IBM Cloud DNS。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如
-
创建配置文件,以通过步骤 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
-
在集群的
openshift-ingress-operator
名称空间中创建 IngressController 资源。 创建 IngressController 资源时,将根据 IngressController 设置在openshift-ingress
名称空间中自动创建并部署专用 Ingress 控制器。 此外,将创建 Ingress 控制器服务以使用 IP 地址 (经典集群) 或 VPC 主机名 (VPC 集群) 来公开 Ingress 控制器。oc create -f private.yaml -n openshift-ingress-operator
-
获取
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
-
向步骤 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>
-
可选: 如果要使用 Ingress 控制器分片,以便特定路由由特定 Ingress 控制器处理 (例如,仅允许专用路由进入专用路由器),那么可以使用路由标签或名称空间标签来指定分片方法。 要在创建期间添加选择器,请将其包含在
spec
下的ingresscontroller
yaml 中。 例如,要允许 Ingress 控制器仅处理标签为type=sharded
的入口/路由,可以添加routeSelector
。 有关更多信息,请参阅 Ingress 控制器分片。routeSelector: matchLabels: type: sharded
-
要向现有 Ingress 控制器添加选择器,请获取 Ingress 控制器的列表。
oc get ingresscontroller -n openshift-ingress-operator
-
将选择器添加到要在其中使用分片的 Ingress 控制器。
oc patch -n openshift-ingress-operator IngressController/<name> --type='merge' -p '{"spec":{"routeSelector":{"matchLabels":{"type":"sharded"}}}}'
-
请注意,没有向默认 IngressController, 添加选择器,因此所有路由仍会被接入群集上的默认 Ingress 控制器。 您可以使用相关路由或名称空间标签选择器来更改此行为。 例如,要调整缺省路由器以跳过标签为
type=sharded
的入口/路由,请运行以下 patch 命令。oc patch -n openshift-ingress-operator IngressController/default --type='merge' -p '{"spec":{"routeSelector":{"matchExpressions":[{"key":"type","operator":"NotIn","values":["sharded"]}]}}}'
-
-
为应用程序部署创建 Kubernetes
ClusterIP
服务。 该服务为 Ingress 控制器可将流量发送到的应用程序提供内部 IP 地址。oc expose deploy <app_deployment_name> --name <app_service_name> -n <app_project>
-
设置基于应用程序需要的 TLS 终止类型 的路由。 指定在步骤 5 中设置的主机名。
- 简单:
oc expose service <app_service_name> --hostname <subdomain>
- 传递:
需要处理 HTTP/2 连接吗? 创建路由后,运行oc create route passthrough --service <app_service_name> --hostname <subdomain>
oc edit route <app_service_name>
并将路由的targetPort
值更改为https
。 您可以通过运行curl -I --http2 https://<route> --insecure
来测试路由。 - Edge: 如果使用定制域,请包含
--cert
和--key
选项以及 (可选)--ca-cert
选项。 有关 TLS 证书需求的更多信息,请参阅 Red Hat OpenShift 边缘路由文档。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 重新加密路由文档。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>]
- 简单:
-
验证是否已创建应用程序的路径。
oc get routes
-
可选: 使用 可选配置定制专用 Ingress 控制器的路由规则。 例如,您可以使用 特定于路由的 HAProxy 注释。
-
要使用同一子域为更多应用程序创建路径,可以重复步骤 7-10,以便由同一专用 Ingress 控制器生成该路径。 如果要使用其他子域为更多应用程序创建路径,请重复此部分中的所有步骤以创建新的专用 Ingress 控制器。
在仅具有私有云服务端点的 VPC 集群中设置私有路由
如果集群是在 VPC 基础结构上创建的,并且在集群创建期间启用了唯一的私有云服务端点,那么缺省情况下将使用专用 Ingress 控制器创建集群。 您可以使用此 Ingress 控制器为应用程序创建专用路径。
-
为应用程序部署创建 Kubernetes
ClusterIP
服务。 该服务为 Ingress 控制器可将流量发送到的应用程序提供内部 IP 地址。oc expose deploy <app_deployment_name> --name my-app-svc
-
选择应用程序的域。
- IBM提供的域: 如果不需要定制域,将以
<service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud
格式为您生成路由子域。 - 定制域: 要指定定制域,请使用 DNS 提供程序或 IBM Cloud® Internet Services。
-
获取 EXTERNAL-IP 列中每个专区中专用 Ingress 控制器服务的外部 IP 地址。 请注意,具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为
router-default
,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如router-dal12
之类的名称。oc get svc -n openshift-ingress
-
通过 DNS 提供商创建自定义域名。 如果要将同一子域用于集群中的多个服务,那么可以注册通配符子域,例如
*.example.com
。 -
通过添加 IP 地址作为 A 记录,将定制域映射到 Ingress 控制器服务的专用 IP 地址。
-
- IBM提供的域: 如果不需要定制域,将以
-
根据应用程序需要的 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>]
-
传递:
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 边缘路由文档。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 重新加密路由文档。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>]
-
-
验证是否已创建应用程序服务的路径。
oc get routes
-
可选: 使用 可选配置定制缺省路由规则。 例如,您可以使用 特定于路由的 HAProxy 注释。
在经典集群中的 VLAN 之间移动 Ingress 控制器服务
更改工作节点 VLAN 连接时,工作节点将连接到新的 VLAN 并分配新的公用或专用 IP 地址。 但是,Ingress 控制器服务无法自动迁移到新 VLAN,因为从属于旧 VLAN 的子网为其分配了稳定,可移植的公共或专用 IP 地址。 当工作程序节点和 Ingress 控制器连接到不同的 VLAN 时,Ingress 控制器无法将入局网络流量转发到工作程序节点上的应用程序 pod。 要将 Ingress 控制器服务移至其他 VLAN,必须在新 VLAN 上创建 Ingress 控制器服务,并删除旧 VLAN 上的 Ingress 控制器服务。
-
在新 VLAN 上创建 Ingress 控制器服务。
- 为新的 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
- 公共 Ingress 控制器服务:
- 创建新的 Ingress 控制器服务。
oc apply -f router-new-<zone>.yaml -n openshift-ingress
- 获取新 Ingress 控制器服务的 EXTERNAL-IP 地址。 此 IP 地址来自新 VLAN 上的子网。
公共 Ingress 控制器服务的示例输出:oc get svc router-new -n openshift-ingress
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
- 多专区集群: 如果更改了多个专区中工作程序节点的 VLAN,请重复这些步骤以在每个专区中的新 VLAN 上创建 Ingress 控制器服务。
- 为新的 Ingress 控制器服务创建 YAML 配置文件。 指定 Ingress 控制器服务部署到的区域。 将文件另存为
-
记下 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 ...
-
将在步骤 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 控制器的域注册,并且可以将入局请求转发到应用程序。
-
获取旧 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
-
从 Ingress 控制器的主机名中除去在步骤 2 中找到的旧 Ingress 控制器服务的 IP 地址。 多专区集群: 在重复的
--ip
选项中单独包含每个 IP 地址。ibmcloud oc nlb-dns rm classic -c <cluster_name_or_ID> --ip <old_IP> --nlb-host <hostname>
-
验证 Ingress 控制器的主机名现在是否已向新 IP 地址注册。 使用新服务的 IP 地址更新 Ingress 控制器主机名后,无需对 Ingress 控制器或路径进行进一步更改。
ibmcloud oc nlb-dns ls -c <cluster_name_or_ID>
-
删除旧 VLAN 上的 Ingress 控制器服务。
oc delete svc <old_router_svc> -n openshift-ingress
-
可选:如果不再需要旧 VLAN 上的子网,那么可以除去子网。