設定 Ingress

建立 Ingress 資源以配置 Ingress 元件、定義遞送要求的規則,以及指定應用程式服務的路徑。 包含您要公開之應用程式或服務的每一個名稱空間都需要個別 Ingress 資源。

開始之前

開始之前,請遵循下列準備步驟。

  1. 請確定您具有正確的許可權來設定 Ingress。 需要下列 IBM Cloud IAM 角色:

    • 叢集的管理員平台存取角色
    • 所有命名空間中的「管理員」服務存取角色
  2. 判斷您是否要使用 IBM提供的 Ingress 子網域。 如果您不想要使用提供的子網域,則必須建立並登錄您自己的 自訂網域。

    自訂網域,或 手動設定 IBM 所提供的網域,以便透過私有 ALB 公開應用程式。

  3. 請確保您即將使用的 ALB 版本與預期版本一致。 執行 ibmcloud ks ingress alb versions 指令以列出目前受支援的版本,並將其與 ibmcloud ks ingress alb ls --cluster CLUSTER 的輸出結果進行比對。 如果您正在遵循本文件,則預期您會執行基於 Ingress- NGINX 的 Ingress;若需 Traefik 的具體指引,請參閱 相應的文件。

  4. 如果您透過專用 ALB 公開應用程式,則必須在 CLI 中啟用每一個專用 ALB。 若要取得 ALB ID,請執行 ibmcloud ks ingress alb ls --cluster CLUSTER。

標準叢集 如需相關資訊及指令選項,請參閱CLI 參考資料。 sh {: pre} ibmcloud ks ingress alb enable classic --alb ALB_ID --cluster CLUSTER_NAME VPC 叢集 如需相關資訊及指令選項,請參閱CLI 參考資料。 sh {: pre} ibmcloud ks ingress alb enable vpc-gen2 --alb ALB_ID --cluster CLUSTER_NAME

  1. 確保叢集每個區域至少包含兩個工作者節點,以確保高可用性及套用定期更新。 如果一個區域只有一個工作節點,ALB 就無法接收自動更新。 如需相關資訊,請參閱 ALB 的工作者節點需求。

  2. 如果您使用傳統群集,請啟用 IBM Cloud 基礎結構帳戶的 虛擬路由器功能(VRF)。

    • 若要啟用 VRF,請參閱 啟用 VRF。
    • 若要檢查是否已啟用 VRF,請使用 ibmcloud account show 指令。
    • 如果您無法或不想啟用 VRF,請啟用 VLAN spanning。 當啟用 VRF 或 VLAN 跨域功能時,ALB 即可將封包路由至該帳戶中的各個子網。
  3. 對於 VPC 叢集,請確保您的 VPC 安全群組允許節點埠接收由 Ingress 路由的流量請求。 如需詳細資訊,請參閱 瞭解 Secure by Default 群集 VPC 網路。

  4. 請注意,如果您在 7 天內建立並刪除具有相同或相似名稱的叢集 5 次以上,例如基於自動化或測試目的,則可能會達到 Let 's Encrypt Duplict Certificate rate limit。 為了確保正確登錄 Ingress 子網域和憑證,叢集名稱的前 24 個字元必須不同。

  5. 如果您將網路資料流量限制為邊緣工作者節點,請確定在每個區域中至少啟用兩個邊緣工作者節點,以統一部署 ALB。

如果發生區域故障,您可能會在該區域內 Ingress ALB 的要求中看到間歇性失敗。

設定步驟

請遵循步驟來設定 Ingress。

步驟 1: 建立 ClusterIP 服務

針對您要公開的每一個應用程式部署,建立 Kubernetes ClusterIP 服務。 您的應用程式必須透過 Kubernetes 服務對外公開,才能納入 Ingress 負載平衡機制中。

kubectl expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>

步驟 2:使用 TLS 憑證和 Kubernetes 秘密設定 TLS 終止

您的 TLS 憑證必須以 Kubernetes secret 的形式儲存在您的應用程式所在的每個命名空間中。

步驟 3:建立 Ingress 資源

建立 Ingress 資源,以定義 Ingress 控制器用來將資料流量遞送至應用程式服務的遞送規則。

  1. 在 YAML 檔中建立 Ingress 資源。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress-resource
    spec:
      ingressClassName: public-iks-k8s-nginx
      tls:
      - hosts:
        - <domain_name>
        secretName: <tls_secret_name>
      rules:
      - host: HOSTNAME
        http:
          paths:
          - path: <app_path_1>
            pathType: Prefix
            backend:
              service:
                name: <app_service_1>
                port:
                  number: 80
          - path: <app_path_2>
            pathType: Prefix
            backend:
              service:
                name: <app_service_2>
                port:
                  number: 80
    

資源欄位

ingressClassName
Ingress 類別名稱。 IBM提供的 Ingress 類別是 public-iks-k8s-nginx (針對公用 ALB) 及 private-iks-k8s-nginx (針對專用 ALB)。
tls.hosts
若要使用 TLS,請將 <domain> 替換為 IBM 提供的 Ingress 子網域或您的自訂網域。
tls.secretName
將 <tls_secret_name> 改為存放 TLS 憑證 的 Kubernetes secret 的名稱。
host
請將 替換為 IBM 所提供的 Ingress 子網域,或您自訂的網域。
path
請將 <app_path> 替換為斜線或您的應用程式正在監聽的路徑。 該路徑將附加至指定的 Ingress 網域,以建立通往您應用程式的專屬路由。 當您在 Web 瀏覽器中輸入此路徑時,網路資料流量就會遞送至 ALB。 ALB 會查閱相關聯的服務,將網路資料流量傳送至服務。 接著,該服務會將流量轉發至應用程式所執行的 Pod。
pathType
URL 路徑比對方法。 支援的值為 ImplementationSpecific、Exact 或 Prefix。 如需各路徑類型的詳細資訊及範例,請參閱 社群 Kubernetes 文件。
service.name
請將 app1_service 和 app2_service 等網址,替換為您為公開應用程式所建立的服務名稱。 請確定您指定的應用程式位於相同的名稱空間中。
service.name
請將 <app1_service> 和 <app2_service> 等網址,替換為您為公開應用程式所建立的服務名稱。 請確定您指定的應用程式位於相同的名稱空間中。
service.port.number
您的服務所接聽的埠。 請使用您為應用程式建立 Kubernetes 服務時所定義的相同埠。
  1. 將 Ingress 資源套用至叢集。 請確保資源會部署至與您已在資源中指定之應用程式服務相同的名稱空間。
    kubectl apply -f community-ingress-resource.yaml -n <namespace>
    

步驟 4: 驗證 Ingress 設定

  1. 列出 ALB 並複製一個執行 Kubernetes Ingress 映像檔之 ALB 的 IP 位址 (典型) 或主機名稱 (VPC)。 在輸出中,選擇具有 <community_version>_<ibm_build>_iks 格式的 建置 的 ALB。

    ibmcloud ks ingress alb ls -c CLUSTER
    
  2. 使用 ALB 的 IP 位址 (標準) 或主機名稱 (VPC)、應用程式路徑及網域,以驗證您可以透過此 ALB 順利將資料流量傳送至應用程式。

    curl http://<ALB_IP>/<app_path> -H "Host: <ingress_subdomain>"
    

    例如,若要使用預設 Ingress 子網域將要求傳送至稱為 myapp 的應用程式,請執行下列指令。

    curl http://169.X.X.X/myapp -H "Host: mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud"
    

透過 Ingress 連接至應用程式時發生困難嗎? 請嘗試 疑難排解 Ingress。 您可以執行 ibmcloud ks ingress status-report get -c CLUSTER_NAME_OR_ID 來檢查 Ingress 元件的性能及狀態。

具有 Ingress 的自訂網域

若您不想使用 IBM 所提供的 Ingress 子網域,您可以使用自己在 Ingress 資源中指定的自訂網域。 請注意,透過 Ingress 並在私有 ALB 上公開的應用程式,必須使用自訂網域,或 手動設定 IBM 所提供的網域。

建立公用 ALB 的自訂網域

遵循步驟以建立公用 ALB 的自訂網域。

  1. 建立自訂網域。 若要登錄自訂網域,請使用「網域名稱服務 (DNS)」提供者或 IBM Cloud DNS。 如果您要 Ingress 公開的應用程式位於某叢集內不同的名稱空間中,請將自訂網域登錄為萬用字元網域,例如 *.custom_domain.net。 請注意,在 Kubernetes 1.20 版或更新版本中,網域限制為 130 個字元或更少。

  2. 透過將 IBM 提供的子網域設定為規範名稱記錄 (CNAME),為您的自訂網域定義一個別名。 若要找出由 IBM 提供的 Ingress 網域,請執行 ibmcloud ks cluster get --cluster CLUSTER_NAME,並查找「Ingress 子網域」欄位。

    將 IBM 提供的子網域指定為 CNAME 是自動健康檢查所必需的,以便從 DNS 回應中移除任何失敗的 IP,並確保在新增或移除 ALB 時,您的自訂網域會更新。

建立專用 ALB 的自訂網域

遵循步驟以建立專用 ALB 的自訂網域。 請注意,需要自訂網域才能將 Ingress 與專用 ALB 搭配使用。

如果您的標準叢集只有專用 VLAN,則必須先配置您自己的 專用網路上可用的 DNS 服務。

  1. 請透過您的 DNS 服務供應商建立自訂網域。 請注意,Ingress URL 必須是 130 個字元或更少。

  2. 將自訂網域對映至專用 ALB,方法是將其 IP 位址新增為 A 記錄 (標準叢集),或將其 VPC 主機名稱新增為 CNAME (VPC 叢集)。 若要尋找 ALB IP 位址 (標準) 或主機名稱 (VPC),請執行 ibmcloud ks ingress alb ls -c CLUSTER_NAME_OR_ID。