使用 Ingress 私下公開應用程式
透過建立由 Ingress 控制器管理的 Ingress 資源,可在您的 Red Hat® OpenShift® on IBM Cloud® 叢集中以私有方式對外公開多個應用程式。
必要條件
在開始使用 Ingress 之前,請檢閱下列必要條件。
- 設定 Ingress 需要下列 IBM Cloud IAM 角色:
- IBM Cloud Kubernetes Service中叢集的 管理者 平台存取角色。
- 所有 IBM Cloud Kubernetes Service 名稱空間 (Red Hat OpenShift 專案) 中的 管理員 服務存取角色。
- 如果區域失敗,您可能會在該區域中 Ingress 控制器公開之應用程式的要求中看到間歇性失敗。
- 為了確保高可用性,建議每個區域至少有兩個工作者節點。
- VPC 群集:允許由 Ingress 路由到您的工作節點上的節點埠的流量要求。 如需詳細資訊,請參閱 瞭解安全預設群集 VPC 網路,以及 建立和管理 VPC 安全群組。
- VPC 多區域叢集: 如果您已在 CLI 中建立叢集,並稍後使用
ibmcloud oc zone add vpc-gen2指令手動將區域新增至工作者節點儲存區,則必須 更新用於公開 Ingress 控制器的 VPC 負載平衡器,以包括叢集裡所有區域的子網路。 - 標準叢集:啟用 IBM Cloud 基礎架構帳戶的虛擬路由器功能 (VRF)。 若要檢查是否已啟用 VRF,請使用
ibmcloud account show指令。 如果您無法或不想啟用 VRF,請啟用 VLAN Spanning。 當啟用 VRF 或 VLAN 跨域功能時,Ingress 控制器即可將封包路由至該帳戶中的各個子網。
使用公用雲端服務端點私下公開應用程式
{: tag-classic-inf} [虛擬私有雲的]經典叢集
如果在標準基礎架構上建立叢集,或者如果在 VPC 基礎架構上建立叢集並在叢集建立期間啟用公用雲端服務端點,則依預設只會使用公用 Ingress 控制器來建立叢集。 若要私下公開應用程式,您必須先建立專用 Ingress 控制器。 接著,您必須將 Ingress 控制器註冊至一個子網域,並可選擇匯入您自己的 TLS 憑證。
步驟 1:部署應用程式並建立應用程式服務
首先,部署您的應用程式並建立 Kubernetes 服務來公開它們。
-
將應用程式部署至叢集。 請確定您已將標籤新增至您部署中配置檔的 metadata 區段,例如
app: code。 此標籤是用來識別所有執行您應用程式的 Pod,以便將這些 Pod 納入 Ingress 負載平衡範圍內。 -
針對您要公開的每一個應用程式部署,建立 Kubernetes
ClusterIP服務。 您的應用程式必須透過 Kubernetes 服務對外公開,才能納入 Ingress 負載平衡機制中。
oc expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>
步驟 2:使用 TLS 憑證和 Kubernetes 機密設定 TLS 終端服務
您的 TLS 憑證必須儲存為 Kubernetes 機密,且須位於您的應用程式所處的每個命名空間中。
TLS 自訂網域的秘訣
若要為您自行建立的網域(例如向外部供應商註冊的網域)設定 TLS 機密,請參閱 《為自訂子網域設定 TLS 機密》。 以下步驟適用於經典型和 VPC 叢集。
TLS IBM 所管理的網域的祕訣
-
經典叢集 若要在經典叢集中使用由 IBM 管理的 Ingress 網域,請參閱《為 IBM 提供的 Ingress 子網域設定 TLS 機密 》。
-
VPC 叢集 若要在 VPC 叢集裡使用 IBM管理的 Ingress 網域,請遵循下列步驟。
- 列出叢集裡的現有子網域。 在輸出的 子網域 直欄中,複製具有最高
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。n+1值指出您在此叢集中建立的下一個連續子網域。 您可以在後續步驟中登錄此子網域。 當您註冊網域時,系統會自動為該網域產生一個 TLS 密鑰。 密鑰名稱遵循子網域的截斷格式,例如mycluster-a1b2cdef345678g9hi012j3kl4567890-0003。
步驟 3: 建立及配置專用 Ingress 控制器
在準備好您的網域和 TLS 憑證後,您必須建立一個私有 Ingress 控制器,並將該控制器設定為使用您的網域。
- 建立專用 Ingress 控制器的配置檔。
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: private-ingress-controller 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: Internal type: LoadBalancerService - 在叢集的
openshift-ingress-operator專案中建立 IngressController 資源。 建立IngressController,會根據您在上一個步驟中設定的IngressController設定自動建立私有 Ingress 控制器並部署在openshift-ingress專案中。 此外,還會建立 Ingress 控制器服務,以使用 IP 位址 (標準叢集) 或 VPC 主機名稱 (VPC 叢集) 來公開 Ingress 控制器。oc create -f private-ingress-controller.yaml -n openshift-ingress-operator - 執行
oc get指令,並在router-private-ingress-controller服務的 外部 IP 欄位中尋找 IP 位址或 VPC 主機名稱。
經典叢集的輸出範例。oc get svc router-private-ingress-controller -n openshift-ingress
VPC 叢集的輸出範例:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-private-ingress-controller LoadBalancer 172.21.57.132 10.XX.XX.XX 80/TCP,443/TCP,1940/TCP 3mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-private-ingress-controller LoadBalancer 172.21.57.132 1234abcd-us-south.lb.appdomain.cloud 80/TCP,443/TCP,1940/TCP 3m - 向您先前選擇的網域登錄服務的外部 IP 位址或 VPC 主機名稱。
- 自訂網域: 使用 DNS 提供者,將
router-private-ingress-controller服務的外部 IP 位址新增為對映至自訂網域的 A 記錄 (標準叢集) 或 VPC 主機名稱新增為 CNAME (VPC 叢集)。 - IBM提供的網域: 為
router-private-ingress-controller服務的 VPC 主機名稱建立 DNS 項目。 當您執行下列指令時,會自動產生您在private-ingress-controller.yaml檔案中指定的子網域,並向router-private-ingress-controller服務登錄。 系統會在您指定應用程式執行位置的專案中,自動為該網域產生一個 TLS 祕鑰。 密鑰名稱遵循子網域的截斷格式,例如mycluster-a1b2cdef345678g9hi012j3kl4567890-0003。
ibmcloud oc nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <VPC_hostname> --secret-namespace <project> ``` - 自訂網域: 使用 DNS 提供者,將
步驟 4:建立 Ingress 資源
Ingress 資源會定義 Ingress 控制器用於將流量路由至您的應用程式服務的路由規則。
-
定義一個 Ingress 資源配置檔案,該檔案會使用 IBM 提供的網域或您的自訂網域,將傳入的網路流量路由至您先前建立的服務。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myingressresource spec: tls: - hosts: - <subdomain> secretName: <custom_secret_name> rules: - host: <subdomain> http: paths: - path: /<app1_path> backend: service: name: <app1_service> port: number: 80 - path: /<app2_path> backend: serivce: name: <app2_service> port: number: 80tls-
- 若要使用 TLS,請在您的資源中加入此 TLS 區段。 請將
<domain>替換為您的子網域。 請勿將*用作主機,亦請勿將host屬性留空,以免在建立 Ingress 時發生錯誤。 - 請將
<tls_secret_name>替換為您先前建立的、存放自訂網域的TLS憑證與金鑰的秘密,或是針對 IBM 提供的子網域而自動生成的TLS秘密。
- 若要使用 TLS,請在您的資源中加入此 TLS 區段。 請將
host-
- 請將
<domain>替換為您的子網域。 - 如果您的叢集中有多個專案,且這些專案中都有應用程式對外公開,則每個專案都需要一個 Ingress 資源。 您可以在每一個資源中使用相同的子網域,或在每一個資源中使用不同的子網域。 例如,如果您使用萬用字元網域,則可以將萬用字元子網域附加至網域的開頭,例如
subdomain1.custom_domain.net。 - 請勿將
*用作主機名稱,亦請勿將host屬性留空,以免在建立 Ingress 時發生錯誤。
- 請將
path-
- 將
<app_path>取代為應用程式接聽所在的路徑。 此路徑會附加至 IBM 提供的網域或您的自訂網域,以建立應用程式的唯一路徑。 當您將此路徑輸入 Web 瀏覽器時,會將網路資料流量遞送至 Ingress 控制器。 Ingress 控制器會查詢相關的服務,並將網路流量傳送至該服務。 接著,該服務會將流量轉發至應用程式所執行的 Pod。 許多應用程式並不會監聽特定路徑,而是使用根路徑和特定埠號。 在這種情況下,請將根路徑設定為/,且無需為您的應用程式指定個別路徑。 - 例如,若要使用
http://domain/,請輸入/作為路徑。 對於「http://domain/app1_path」,請輸入/app1_path作為路徑。
- 將
serviceName- 請將
<app1_service>和<app2_service>等網址,替換為您為公開應用程式所建立的服務名稱。 如果您的應用程式是由叢集內不同專案中的服務所提供,請僅包含位於同一專案中的應用程式服務。 您必須為每個包含您想要公開的應用程式的專案,建立一個 Ingress 資源。 servicePort- 您的服務所接聽的埠。 請使用您為應用程式建立 Kubernetes 服務時所定義的相同埠。
-
建立叢集的 Ingress 資源。 請確保該資源部署至與您在資源中指定的應用程式服務位於同一專案中。
oc apply -f myingressresource.yaml -n <project> -
驗證已順利建立 Ingress 資源。 如果事件中的訊息指出您的資源配置出現錯誤,請修正資源檔案中的數值,並重新套用該資源檔案。
oc describe ingress myingressresource
您的 Ingress 資源會建立在與應用程式服務相同的專案中,且您的應用程式會向 Ingress 控制器登錄。
步驟 5:從專用網路存取應用程式
-
經典叢集:在存取您的應用程式之前,請先確認您能夠存取 DNS 服務。 若要使用預設外部 DNS 提供者,您必須 配置具有公用存取權的邊緣節點,並 配置 Virtual Router Appliance。
-
在專用網路中,在 Web 瀏覽器中輸入應用程式服務的 URL。
https://<domain>/<app1_path>如果您已公開多個應用程式,請變更附加至 URL 的路徑來存取那些應用程式。
https://<domain>/<app2_path>如果您使用萬用字元網域,請使用自己的子網域來存取那些應用程式。
http://<subdomain1>.<domain>/<app1_path>http://<subdomain2>.<domain>/<app1_path>
無法透過 Ingress 連接至您的應用程式? 請嘗試 疑難排解 Ingress。
僅使用專用雲端服務端點在 VPC 叢集裡私下公開應用程式
如果在 VPC 基礎架構上建立叢集,並且在建立叢集時僅啟用專用雲端服務端點,則可以使用預設專用 Ingress 控制器將叢集裡的應用程式公開給來自專用網路的要求。
步驟 1:部署應用程式並建立應用程式服務
首先,部署您的應用程式並建立 Kubernetes 服務來公開它們。
-
將應用程式部署至叢集。 請確定您已將標籤新增至您部署中配置檔的 metadata 區段,例如
app: code。 此標籤是用來識別所有執行您應用程式的 Pod,以便將這些 Pod 納入 Ingress 負載平衡範圍內。 -
針對您要公開的每一個應用程式部署,建立 Kubernetes
ClusterIP服務。 您的應用程式必須透過 Kubernetes 服務對外公開,才能納入 Ingress 負載平衡機制中。
oc expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>
步驟 2:使用 TLS 憑證和 Kubernetes 機密設定 TLS 終端服務
您的 TLS 憑證必須儲存為 Kubernetes 機密,且須位於您的應用程式所處的每個命名空間中。
-
若要使用由 IBM 管理的 Ingress 網域,請參閱 《為 IBM 提供的 Ingress 子網域設定 TLS 機密》。
-
若要使用您自行建立的網域(例如向外部供應商註冊的網域),請參閱 《為自訂子網域設定 TLS 機密金鑰》。
步驟 3:建立 Ingress 資源
Ingress 資源會定義 Ingress 控制器用於將流量路由至您的應用程式服務的路由規則。
-
定義一個 Ingress 資源配置檔案,該檔案會使用 IBM 提供的網域或您的自訂網域,將傳入的網路流量路由至您先前建立的服務。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myingressresource spec: tls: - hosts: - <custom_domain> secretName: <custom_secret_name> rules: - host: <domain> http: paths: - path: /<app1_path> backend: service: name: <app1_service> port: number: 80 - path: /<app2_path> backend: service: name: <app2_service> port: number: 80tls-
- 若要使用 TLS,請在您的資源中加入此 TLS 區段。
- 請將
<domain>替換為您的子網域。 請勿在主機名稱中使用 *,亦請勿將主機屬性留空,以免在建立 Ingress 時發生錯誤。 - 請將
<tls_secret_name>替換為您先前建立的、存放自訂網域的TLS憑證與金鑰的祕密,或是針對 IBM 提供的子網域而自動生成的TLS祕密。
host-
- 請將
替換為 IBM 提供的 Ingress 子網域,或您自訂的網域。 - 如果您的叢集中有多個專案,且這些專案中都有應用程式對外公開,則每個專案都需要一個 Ingress 資源。 您可以在每一個資源中使用相同的子網域,或在每一個資源中使用不同的子網域。 例如,如果您使用萬用字元網域,則可以將萬用字元子網域附加至網域的開頭,例如
subdomain1.custom_domain.net或subdomain1.mycluster-<hash>-0000.us-south.containers.appdomain.cloud。 請勿將 ``*用作主機名稱,亦請勿將host屬性留空,以免在建立 Ingress 時發生錯誤。
- 請將
path-
- 將
<app_path>取代為應用程式接聽所在的路徑。 此路徑會附加至 IBM 提供的網域或您的自訂網域,以建立應用程式的唯一路徑。 當您將此路徑輸入 Web 瀏覽器時,會將網路資料流量遞送至 Ingress 控制器。 Ingress 控制器會查詢相關的服務,並將網路流量傳送至該服務。 接著,該服務會將流量轉發至應用程式所執行的 Pod。 許多應用程式並不會監聽特定路徑,而是使用根路徑和特定埠號。 在這種情況下,請將根路徑設定為/,且無需為您的應用程式指定個別路徑。 - 例如,若要使用
http://domain/,請輸入/作為路徑。 對於「http://domain/app1_path」,請輸入/app1_path作為路徑。
- 將
name- 請將
<app1_service>和<app2_service>等網址,替換為您為公開應用程式所建立的服務名稱。 如果您的應用程式是由叢集內不同專案中的服務所提供,請僅包含位於同一專案中的應用程式服務。 對於每個包含您希望對外公開的應用程式的專案,您都必須建立一個 Ingress 資源。 port- 您的服務所接聽的埠。 請使用您為應用程式建立 Kubernetes 服務時所定義的相同埠。
-
建立叢集的 Ingress 資源。 請確保該資源部署至與您在資源中指定的應用程式服務位於同一專案中。
oc apply -f myingressresource.yaml -n <project> -
驗證已順利建立 Ingress 資源。 如果事件中的訊息指出您的資源配置出現錯誤,請修正資源檔案中的數值,並重新套用該資源檔案。
oc describe ingress myingressresource
您的 Ingress 資源會建立在與應用程式服務相同的專案中,且您的應用程式會向 Ingress 控制器登錄。
步驟 4:開啟您的應用程式
在 Web 瀏覽器中,輸入要存取的應用程式服務的 URL。
https://<domain>/<app1_path>
如果您已公開多個應用程式,請變更附加至 URL 的路徑來存取那些應用程式。
https://<domain>/<app2_path>
如果您使用萬用字元網域,請使用自己的子網域來存取那些應用程式。
http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>
無法透過 Ingress 連接至您的應用程式? 請嘗試 疑難排解 Ingress。