在 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 控制器會 Proxy 您的要求,並將它轉遞至應用程式所接聽的專用 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 的工作節點的公開 IP 位址。 若在叢集中部署了多個應用程式執行個體,路由器會將請求在各應用程式 Pod 之間進行分發。
-
當應用程式傳回回應封包時,它會使用轉發客戶端請求的路由器所處的工作節點之 IP 位址。 然後,路由器會透過負載平衡器服務將回應封包傳送至用戶端。
經典多區域叢集中的流量流動
下圖說明了路由器如何在多區域的經典叢集環境中,將來自網際網路的網路流量導向某個應用程式。
-
對應用程式的要求會使用您為應用程式設定的路徑主機名稱。
-
DNS 服務會將路由子網域解析為多區域負載平衡器 (MZLB) 報告為性能良好的路由器服務的可攜式公用 IP 位址。 MZLB 會持續檢查您叢集內各區域中,那些將路由器對外公開的服務所使用的可攜式公共 IP 位址。 各區域中的路由器服務會以輪詢方式處理請求。
-
根據路由器服務的已解析 IP 位址,路由器會接收要求。
-
路由器會透過私有網路,將該請求轉發至應用程式 Pod 的私有 IP 位址。 請求封包的來源 IP 位址已變更為執行路由器 Pod 的工作節點的公開 IP 位址。 每個路由器會將請求傳送至其所在區域內的應用程式實例,以及其他區域內的應用程式實例。 此外,如果在一個區域中部署多個應用程式實例,則路由器會在應用程式 Pod 之間交換要求。
-
當應用程式傳回回應封包時,它會使用轉發客戶端請求的路由器所處的工作節點之 IP 位址。 然後,路由器會透過負載平衡器服務將回應封包傳送至用戶端。
具有公用雲端服務端點的多區域 VPC 叢集裡的資料傳輸流
當您建立已啟用公用雲端服務端點的多區域 VPC 叢集時,依預設會建立公用 Ingress 控制器。 Ingress 控制器會為應用程式指派可公開存取的路徑,並在公用主機網路介面上接聽應用程式的要求。
下圖說明了 Ingress 控制器如何將來自網際網路的網路流量導向多區域 VPC 叢集中的應用程式。
-
對應用程式的要求會使用您為應用程式設定的路徑主機名稱。
-
DNS 服務會將路徑子網域解析為指派給 Ingress 控制器服務的 VPC 負載平衡器主機名稱。 在 VPC 叢集裡,Ingress 控制器服務的外部 IP 位址是浮動的,並且保留在 VPC 指派的主機名稱後面。
-
VPC 負載平衡器會將 VPC 主機名稱解析為報告為性能良好的 Ingress 控制器服務的可用外部 IP 位址。 VPC 負載平衡器會持續檢查叢集裡每個區域中公開 Ingress 控制器之服務的外部 IP 位址。
-
根據已解析的 IP 位址,VPC 負載平衡器會將要求傳送至 Ingress 控制器服務。
-
Ingress 控制器會透過私有網路,將請求轉發至應用程式 Pod 的私有 IP 位址。 請求封包的來源 IP 位址會變更為 Ingress 控制器 Pod 所執行的工作節點的 IP 位址。 每個 Ingress 控制器都會向其所在區域內的應用程式實例,以及其他區域內的應用程式實例發送請求。 此外,如果在一個區域中部署多個應用程式實例,則 Ingress 控制器會在應用程式 Pod 之間交換要求。
-
當應用程式傳回回應封包時,它會使用轉發客戶端請求的 Ingress 控制器所在的工作節點的 IP 位址。 然後,Ingress 控制器會透過 VPC 負載平衡器將回應封包傳送至用戶端。
多區域 VPC 叢集裡僅具有專用雲端服務端點的資料傳輸流
當您建立僅具有專用雲端服務端點的多區域 VPC 叢集時,依預設會建立專用 Ingress 控制器。 Ingress 控制器會為您的應用程式指派專用可存取的路徑,並在專用主機網路介面上接聽。 只有連接至專用 VPC 網路的用戶端才能存取專用路徑所公開的應用程式。
下圖顯示 Ingress 控制器如何將網路資料流量從專用網路引導至多區域 VPC 叢集裡的應用程式。
-
連接至專用 VPC 網路的用戶端會使用應用程式的專用路徑,將要求傳送至應用程式。 例如,您可以使用 Virtual Private 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 控制器服務。
-
Ingress 控制器會透過私有網路,將請求轉發至應用程式 Pod 的私有 IP 位址。 請求封包的來源 IP 位址會變更為 Ingress 控制器 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 時,請建立直通路由。 路由器不參與 TLS 終止加密的 HTTPS 流量,因此應用程式 Pod 必須終止 TLS 連線。 此類型也可用於 HTTP/2 以及非 HTTP TLS 端點。 |
| 邊緣 | 當您的應用程式 Pod 暴露在非加密的 HTTP 端點上,但您必須處理加密的 HTTPS 流量時,請建立邊緣路由。 用戶端與路由器服務之間的 TLS 連線會終止,而路由器服務與您的應用程式 Pod 之間的連線則未加密。 如需詳細資訊,請參閱 Red Hat OpenShift edge route 文件。 |
| 重新加密 | 當您的應用程式 Pod 暴露在加密的 HTTPS 端點上,且您必須處理 HTTPS 流量時,請建立重新加密路由。 用戶端與路由器服務之間的 TLS 連線會終止,路由器服務與您的應用程式 Pod 之間會建立新的 TLS 連線。 如需詳細資訊,請參閱 Red Hat OpenShift re-encrypt route 文件。 |
如果您不需要使用自訂網域,則可以使用 IBM提供的路徑主機名稱,格式為 <service_name>-<project>.<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud。
Ingress 控制器性能檢查
容許透過網路原則或其他防火牆規則進行存取,以便 Ingress 控制器性能檢查可以呼叫到您的 Ingress 控制器服務。
經典:如果您使用 Calico pre-DNAT 網路政策或其他自訂防火牆來封鎖群集的入站流量,您必須允許從 Ingress 網域健康監控來源 IP 位址 到您的 Ingress Controller 服務 IP 位址的 443 埠入站存取,這樣網域提供者才能監控註冊位址的健康狀況,並只傳回健康的端點。
VPC:如果您設定 VPC 安全群組或 VPC 存取控制清單 (ACL) 以確保叢集網路的安全,請確保允許從 Ingress 網域健康監控來源 IP 位址 到您的 Ingress Controller 服務 IP 位址的連接埠 443 的入站存取,以便網域提供者可以監控註冊位址的健康狀況,並只傳回健康的端點。
設定公用路徑
使用公用 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 ``` 1. 請透過您的 DNS 服務供應商建立自訂網域。 如果您想要對叢集裡的多個服務使用相同的子網域,則可以登錄萬用字元子網域,例如 `*.example.com`。 {: tip} 1. 透過將 IP 位址新增為 A 記錄,將自訂網域對映至 Ingress 控制器的公用 IP 位址。 - 取得 EXTERNAL-IP 直欄中每個區域中公用 Ingress 控制器服務的公用 IP 位址。 請注意,第一個具有工作者節點之區域中的 Ingress 控制器服務一律命名為
-
根據 您的應用程式所需的 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>] ``` -
驗證已建立應用程式服務的路徑。
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_IDmycluster-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設定自動建立公共 Ingress 控制器並將其部署在openshift-ingress命名空間中。 此外,還會建立 Ingress 控制器服務,以公開 Ingress 控制器。oc create -f public.yaml -n openshift-ingress-operator -
在
router-public服務的 外部 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 控制器服務的 IP 位址 (保留在 VPC 主機名稱後面) 向您為 Ingress 控制器選擇的網域登錄。
- 自訂網域: 使用 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 控制器處理 (例如,專用路徑只允許專用路由器使用),則可以使用路徑標籤或名稱空間標籤來指定分區方法。 若要在建立期間新增選取器,請將它併入
ingresscontrolleryaml 中的spec下。 例如,若要容許 Ingress 控制器僅處理標籤為type=sharded的入口/路徑,您可以新增routeSelector。 如需相關資訊,請參閱 Ingress 控制器 Shard。routeSelector: matchLabels: type: sharded- 若要將選取器新增至現有的 Ingress 控制器,請取得 Ingress 控制器的清單。
oc get ingresscontroller -n openshift-ingress-operator ``` 1. 將選取器新增至您要使用 Shard 處理的 Ingress 控制器。 ```sh {: pre} oc patch -n openshift-ingress-operator IngressController/<name> --type='merge' -p '{"spec":{"routeSelector":{"matchLabels":{"type":"sharded"}}}}' ``` 1. 請注意,沒有選擇器新增至預設IngressController,因此所有路由仍允許進入叢集上的預設 Ingress 控制器。 您可以使用相關路徑或名稱空間標籤選取元來變更此行為。 例如,若要調整預設路由器以跳過標籤為 `type=sharded` 的進入/路徑,請執行下列修補程式指令。 ```sh {: pre} oc patch -n openshift-ingress-operator IngressController/default --type='merge' -p '{"spec":{"routeSelector":{"matchExpressions":[{"key":"type","operator":"NotIn","values":["sharded"]}]}}}' ``` 叢集上的數個路徑及 Ingresses 取決於預設公用 Ingress 控制器。 在編輯預設 Ingress 控制器之前,請確定變更是正確的。 如需的相關資訊,請參閱 [Ingress 控制器 Shard](https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/networking_overview/index#nw-ingress-sharding_configuring-ingress){: external}。 {: note} -
為應用程式部署建立 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>] ``` * 透通: ```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>] ``` -
驗證已建立應用程式的路徑。
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服務的 外部 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 3mVPC 叢集的輸出範例:
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 控制器處理 (例如,專用路徑只允許專用路由器使用),則可以使用路徑標籤或名稱空間標籤來指定分區方法。 若要在建立期間新增選取器,請將它併入
ingresscontrolleryaml 中的spec下。 例如,若要容許 Ingress 控制器僅處理標籤為type=sharded的入口/路徑,您可以新增routeSelector。 如需相關資訊,請參閱 Ingress 控制器 Shard。routeSelector: matchLabels: type: sharded- 若要將選取器新增至現有的 Ingress 控制器,請取得 Ingress 控制器的清單。
oc get ingresscontroller -n openshift-ingress-operator ``` 1. 將選取器新增至您要使用 Shard 處理的 Ingress 控制器。 ```sh {: pre} oc patch -n openshift-ingress-operator IngressController/<name> --type='merge' -p '{"spec":{"routeSelector":{"matchLabels":{"type":"sharded"}}}}' ``` 1. 請注意,沒有選擇器新增至預設IngressController,因此所有路由仍允許進入叢集上的預設 Ingress 控制器。 您可以使用相關路徑或名稱空間標籤選取元來變更此行為。 例如,若要調整預設路由器以跳過標籤為 `type=sharded` 的進入/路徑,請執行下列修補程式指令。 ```sh {: pre} 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> ``` * 透通: ```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>] ``` -
驗證已建立應用程式的路徑。
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>] ``` * 透通: ```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>] ``` -
驗證已建立應用程式服務的路徑。
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 ``` 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 控制器服務。 - 為新的 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 上的子網路,則可以移除子網路。
管理 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>