IBM Cloud Docs
透過 Ingress 公開暴露應用程式

透過 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 控制器公開之應用程式的要求中看到間歇性失敗。
  • 為了確保高可用性,建議每個區域至少有兩個工作者節點。

使用公用雲端服務端點在叢集裡公開應用程式

標準叢集 Virtual Private Cloud

如果叢集建立在標準基礎架構上,或者如果叢集建立在 VPC 基礎架構上,且您已在建立公用雲端服務端點時啟用它,則可以使用預設公用 Ingress 控制器來公開叢集裡的應用程式,以接收來自公用網路的要求。

開始之前:

步驟 1:部署應用程式並建立應用程式服務

首先,部署您的應用程式並建立 Kubernetes 服務來公開它們。

  1. 將應用程式部署至叢集。 請確定您已將標籤新增至您部署中配置檔的 metadata 區段,例如 app: code。 需要此標籤來識別應用程式運行的所有 Pod,以便 Pod 處於 Ingress 負載平衡中。

  2. 針對您要公開的每一個應用程式部署,建立 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 密鑰。

步驟 3:建立 Ingress 資源

Ingress 資源定義 Ingress 控制器用於將流量路由到您的應用服務的路由規則。

  1. 定義一個 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: 80
    
    tls
    如果您要使用 TLS,請在資源中包含此 TLS 區段。 將 <domain> 替換為您的子網域。 不要對您的主機使用 * 或將主機屬性留空,以避免 Ingress 建立期間失敗。 將 <tls_secret_name> 取代為您先前建立的密鑰,該密鑰會保留自訂網域的 TLS 憑證及金鑰,或為 IBM提供的子網域自動產生的 TLS 密鑰。
    host
    <domain> 替換為IBM提供的 Ingress 子網域或您的自訂網域。 如果您的叢集有多個暴露應用程式的項目,則每個項目需要一個 Ingress 資源。 您可以在每一個資源中使用相同的子網域,或在每一個資源中使用不同的子網域。 例如,如果您使用萬用字元網域,則可以將萬用字元子網域附加至網域的開頭,例如 subdomain1.custom_domain.netsubdomain1.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路徑比對方法。 支援的值為 ImplementationSpecificExactPrefix。 有關每種路徑類型的更多資訊和範例,請參閱 社區Kubernetes文件
    name
    <app1_service><app2_service> 等替換為您建立的用於公開應用程式的服務的名稱。 如果您的應用程式由叢集中不同項目中的服務公開,則僅包含相同專案中的應用程式服務。 您必須為每個具有要公開的應用程式的專案建立一個 Ingress 資源。
    port
    您的服務所接聽的埠。 請使用您為應用程式建立 Kubernetes 服務時所定義的相同埠。
  2. 建立叢集的 Ingress 資源。 確保資源部署到與您在資源中指定的應用程式服務相同的專案中。

    oc apply -f myingressresource.yaml -n <project>
    
  3. 驗證已順利建立 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 叢集裡公開應用程式

Virtual Private Cloud

如果叢集建立在 VPC 基礎架構上,且您在建立時僅啟用專用雲端服務端點,則依預設只會使用專用 Ingress 控制器來建立叢集。 若要公開公開應用程式,您必須先建立公用 Ingress 控制器。 然後,您必須向子網域登錄 Ingress 控制器,並選擇性地匯入您自己的 TLS 憑證。

步驟 1:部署應用程式並建立應用程式服務

首先,部署您的應用程式並建立 Kubernetes 服務來公開它們。

  1. 將應用程式部署至叢集。 請確定您已將標籤新增至您部署中配置檔的 metadata 區段,例如 app: code。 需要此標籤來識別應用程式運行的所有 Pod,以便 Pod 處於 Ingress 負載平衡中。

  2. 針對您要公開的每一個應用程式部署,建立 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 密鑰。

自訂 Ingress 網域的 TLS 密碼

若要使用您自行建立的網域 (例如向外部提供者登錄的網域),請參閱 設定自訂子網域的 TLS 密鑰

IBM管理的 Ingress 網域的 TLS 密碼

遵循步驟,為 IBM管理的 Ingress 網域設定 TLS 密碼。

  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.cloudn+1 值指出您在此叢集中建立的下一個連續子網域。 您可以在後續步驟中登錄此子網域。 當您登錄網域時,會自動產生網域的 TLS 密鑰。 密鑰名稱遵循子網域的截斷格式,例如 mycluster-a1b2cdef345678g9hi012j3kl4567890-0003

步驟 3: 建立並配置公用 Ingress 控制器

備妥網域及 TLS 憑證之後,您必須建立公用 Ingress 控制器,並使用您的網域來配置控制器。

  1. 建立公用 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
    
  2. 在叢集的 openshift-ingress-operator 專案中建立 IngressController 資源。 當您建立IngressController,會根據IngressController設定自動建立一個公共 Ingress 控制器並部署在 openshift-ingress 專案中。 此外,還會建立 Ingress 控制器服務,以公開 Ingress 控制器。

    oc create -f public-ingress-controller.yaml -n openshift-ingress-operator
    
  3. 執行 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
    
  4. 向您先前選擇的網域登錄服務的 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>
      

步驟 4:建立 Ingress 資源

Ingress 資源定義 Ingress 控制器用於將流量路由到您的應用服務的路由規則。

  1. 定義一個 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: 80
    
    tls
    如果您要使用 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路徑比對方法。 支援的值為 ImplementationSpecificExactPrefix。 有關每種路徑類型的更多資訊和範例,請參閱 社區Kubernetes文件
    name
    <app1_service><app2_service> 等替換為您建立的用於公開應用程式的服務的名稱。 如果您的應用程式由叢集中不同項目中的服務公開,則僅包含相同專案中的應用程式服務。 您必須為每個具有要公開的應用程式的專案建立一個 Ingress 資源。
    port
    您的服務所接聽的埠。 請使用您為應用程式建立 Kubernetes 服務時所定義的相同埠。
  2. 建立叢集的 Ingress 資源。 確保資源部署到與您在資源中指定的應用程式服務相同的專案中。

    oc apply -f myingressresource.yaml -n <project>
    
  3. 驗證已順利建立 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 位址存取要包含到叢集負載平衡中的外部應用程式。

若要將叢集外部的應用程式公開給大眾使用,請遵循下列步驟。

  1. 為 Ingress 控制器公開的應用程式定義 Kubernetes 服務配置檔。 此服務會將送入的要求轉遞至您在後續步驟中建立的外部端點。

    apiVersion: v1
    kind: Service
    metadata:
      name: myexternalservice
    spec:
      ports:
       - protocol: TCP
         port: <app_port>
    
  2. 在叢集裡建立服務。

    oc apply -f myexternalservice.yaml
    
  3. 定義外部端點配置檔。 請包含您可用來存取外部應用程式的所有公用 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> 替換為外部應用程式偵聽的連接埠。
  4. 在叢集中建立端點。

    oc apply -f myexternalendpoint.yaml
    
  5. 繼續 僅在具有專用雲端服務端點的 VPC 叢集裡公開應用程式在具有公用雲端服務端點的叢集裡公開應用程式 中的第二個步驟。