使用 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,請參閱 啟用 VRF。 若要檢查是否已啟用 VRF,請使用
ibmcloud account show指令。 如果您無法或不想啟用 VRF,請啟用 VLAN Spanning。 當啟用 VRF 或 VLAN 跨域功能時,Ingress 控制器即可將封包路由至該帳戶中的各個子網。
使用公用雲端服務端點在叢集裡公開應用程式
{: tag-classic-inf} [經典叢集] 虛擬私有雲
如果叢集建立在標準基礎架構上,或者如果叢集建立在 VPC 基礎架構上,且您已在建立公用雲端服務端點時啟用它,則可以使用預設公用 Ingress 控制器來公開叢集裡的應用程式,以接收來自公用網路的要求。
開始之前:
- 檢閱 Ingress 必要條件。
- 存取您的 Red Hat OpenShift 叢集。
步驟 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: - <domain> secretName: <secret_name> rules: - host: <domain> http: paths: - path: /<app1_path> pathType: Prefix backend: service: name: test port: number: 80 - path: /<app2_path> backend: service: name: <app2_service> port: number: 80tls- 若要使用 TLS,請在您的資源中加入此 TLS 區段。 請將
<domain>替換為您的子網域。 請勿將*用作主機名稱,亦請勿將host屬性留空,以免在建立 Ingress 時發生錯誤。 請將<tls_secret_name>替換為您先前建立的、存放自訂網域用TLS憑證與金鑰的機密,或是針對 IBM 提供的子網域而自動生成的TLS機密。 host- 請將
替換為 IBM 所提供的 Ingress 子網域,或您自訂的網域。 如果您的叢集中有多個專案,且這些專案中都有應用程式對外公開,則每個專案都需要一個 Ingress 資源。 您可以在每一個資源中使用相同的子網域,或在每一個資源中使用不同的子網域。 例如,如果您使用萬用字元網域,則可以將萬用字元子網域附加至網域的開頭,例如subdomain1.custom_domain.net或subdomain1.mycluster-<hash>-0000.us-south.containers.appdomain.cloud。 請勿在主機名稱中使用 *,亦請勿將主機屬性留空,以免在建立 Ingress 時發生錯誤。 path- 將
<app_path>取代為應用程式接聽所在的路徑。 此路徑會附加至 IBM 提供的網域或您的自訂網域,以建立應用程式的唯一路徑。 當您將此路徑輸入 Web 瀏覽器時,會將網路資料流量遞送至 Ingress 控制器。 Ingress 控制器會查閱相關聯的服務,且 Ingress 控制器會將網路資料流量傳送至服務。 接著,該服務會將流量轉發至應用程式所運行的 Pod。 許多應用程式並非在特定路徑上監聽,而是使用根路徑和特定埠號。 在這種情況下,請將根路徑設定為/,且無需為您的應用程式指定個別路徑。 對於「http://domain/」,請輸入/作為路徑。 對於「http://domain/app1_path」,請輸入/app1_path作為路徑。 pathType- URL 路徑比對方法。 支援的值為
ImplementationSpecific、Exact或Prefix。 如需各路徑類型的詳細資訊及範例,請參閱 社群 Kubernetes 文件。 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。
僅使用專用雲端服務端點在 VPC 叢集裡公開應用程式
虛擬私有雲
如果叢集建立在 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 自訂 Ingress 網域的秘訣
若要使用您自行建立的網域(例如向外部供應商註冊的網域),請參閱《 為自訂子網域設定 TLS 機密資訊 》。
TLS IBM 所管理的 Ingress 網域的秘訣
請依照以下步驟,為由 IBM 管理的 Ingress 網域設定 TLS 機密資訊。
- 列出叢集裡的現有子網域。 在輸出的 子網域 直欄中,複製具有最高
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: public-ingress-controller namespace: openshift-ingress-operator spec: 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-ingress-controller.yaml -n openshift-ingress-operator -
執行
oc get指令,並在router-public-ingress-controller服務的 外部 IP 欄位中尋找 VPC 主機名稱。 在 VPC 叢集裡,服務的外部 IP 位址不是靜態的,而是保留在 VPC 指派的主機名稱後面。oc get svc router-public-ingress-controller -n openshift-ingress輸出範例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-public-ingress-controller LoadBalancer 172.21.57.132 1234abcd-us-south.lb.appdomain.cloud 80/TCP,443/TCP,1940/TCP 3m -
向您先前選擇的網域登錄服務的 VPC 主機名稱。
- 自訂網域: 使用 DNS 提供者,將
router-public-ingress-controller服務的 VPC 主機名稱新增為對映至自訂網域的 CNAME。 - IBM提供的網域: 為
router-public-ingress-controller服務的 VPC 主機名稱建立 DNS 項目。 當您執行下列指令時,會自動產生您在public-ingress-controller.yaml檔案中指定的子網域,並向router-public-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> pathType: Prefix 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- 請將
<domain>替換為您的子網域。 如果您的叢集中有多個專案,且這些專案中都有應用程式對外公開,則每個專案都需要一個 Ingress 資源。 您可以在每一個資源中使用相同的子網域,或在每一個資源中使用不同的子網域。 例如,如果您使用萬用字元網域,則可以將萬用字元子網域附加至網域的開頭,例如subdomain1.custom_domain.net。 請勿在主機名稱中使用 *,亦請勿將主機屬性留空,以免在建立 Ingress 時發生錯誤。 path- 將
<app_path>取代為應用程式接聽所在的路徑。 此路徑會附加至 IBM 提供的網域或您的自訂網域,以建立應用程式的唯一路徑。 當您將此路徑輸入 Web 瀏覽器時,會將網路資料流量遞送至 Ingress 控制器。 Ingress 控制器會查詢相關的服務,並將網路流量傳送至該服務。 接著,該服務會將流量轉發至應用程式所運行的 Pod。 許多應用程式並非在特定路徑上監聽,而是使用根路徑和特定埠號。 在這種情況下,請將根路徑設定為/,且無需為您的應用程式指定個別路徑。 例如,若要使用http://domain/,請輸入/作為路徑。 對於「http://domain/app1_path」,請輸入/app1_path作為路徑。 pathType- URL 路徑比對方法。 支援的值為
ImplementationSpecific、Exact或Prefix。 如需各路徑類型的詳細資訊及範例,請參閱 社群 Kubernetes 文件。 name- 請將
<app1_service>和<app2_service>等網址,替換為您為公開應用程式所建立的服務名稱。 如果您的應用程式是由叢集內不同專案中的服務所提供,請僅包含位於同一專案中的應用程式服務。 對於每個包含您想要公開的應用程式的專案,您都必須建立一個 Ingress 資源。 port- 您的服務所接聽的埠。 請使用您為應用程式建立 Kubernetes 服務時所定義的相同埠。
-
建立叢集的 Ingress 資源。 請確保該資源部署至與您在資源中指定的應用程式服務位於同一專案中。
oc apply -f myingressresource.yaml -n <project> -
驗證已順利建立 Ingress 資源。 如果事件中的訊息指出您的資源配置出現錯誤,請修正資源檔案中的數值,並重新套用該資源檔案。
oc describe ingress myingressresource
您的 Ingress 資源會建立在與應用程式服務相同的專案中,且您的應用程式會向 Ingress 控制器登錄。
步驟 5:從網際網路存取您的應用程式
在 Web 瀏覽器中,輸入要存取的應用程式服務的 URL。
https://<domain>/<app1_path>
如果您已公開多個應用程式,請變更附加至 URL 的路徑來存取那些應用程式。
https://<domain>/<app2_path>
如果您使用萬用字元網域,請使用自己的子網域來存取那些應用程式。
http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>
無法透過 Ingress 連接至您的應用程式? 請嘗試 疑難排解 Ingress。
公開叢集外部的應用程式
將位於叢集外的應用程式納入公開的 Ingress 負載平衡機制中,使其對外公開。 IBM 提供的網域或自訂網域上的送入公用要求,會自動轉遞給外部應用程式。
開始之前,請確認您要納入叢集負載平衡的外部應用程式,能否透過公共 IP 位址存取。
若要將叢集外部的應用程式公開給大眾使用,請遵循下列步驟。
-
為 Ingress 控制器公開的應用程式定義 Kubernetes 服務配置檔。 此服務會將送入的要求轉遞至您在後續步驟中建立的外部端點。
apiVersion: v1 kind: Service metadata: name: myexternalservice spec: ports: - protocol: TCP port: <app_port> -
在叢集裡建立服務。
oc apply -f myexternalservice.yaml -
定義外部端點配置檔。 請包含您可用來存取外部應用程式的所有公用 IP 位址及埠。 請注意,端點名稱必須與您在前一個步驟中建立的服務名稱相同,例如
myexternalservice。kind: Endpoints apiVersion: v1 metadata: name: myexternalservice subsets: - addresses: - ip: <external_IP1> - ip: <external_IP2> ports: - port: <external_port>name- 請將「
<myexternalendpoint>」替換為您先前建立的「Kubernetes」服務名稱。 ip- 請將
<external_IP>替換為要連線至您外部應用程式的公開 IP 位址。 port- 請將
<external_port>替換為您的外部應用程式所監聽的埠號。
-
在您的叢集中建立該端點。
oc apply -f myexternalendpoint.yaml -
繼續 僅在具有專用雲端服務端點的 VPC 叢集裡公開應用程式 或 在具有公用雲端服務端點的叢集裡公開應用程式 中的第二個步驟。