設定 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 的輸出結果進行比對。 如果您正在遵循本文件,則預期您會執行基於 Traefik 的 Ingress;若需關於 Ingress- NGINX 的具體指引,請參閱 對應的文件

  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 跨接。 當啟用 VRF 或 VLAN 跨域功能時,ALB 即可將封包路由至該帳戶中的各個子網。
  3. 對於 VPC 叢集,請確保您的 VPC 安全群組允許節點埠接收由 Ingress 路由的流量請求。 如需更多資訊,請參閱《 了解「預設安全」叢集 VPC 網路架構 》。

  4. 請注意,若您在 7 天內創建並刪除 5 次或更多次名稱相同或相似的叢集(例如出於自動化或測試目的),可能會觸發「Let's Encrypt 重複憑證的速率限制」限制。 為確保 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 機密,且須位於您的應用程式所在的每個命名空間中。

步驟 3:建立 Ingress 資源

建立 Ingress 資源,以定義 Ingress 控制器用於將流量路由至您的應用程式服務的路由規則。

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

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress-resource
    spec:
      ingressClassName: public-iks-traefik
      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-traefik (適用於公有 ALB)以及 private-iks-traefik (適用於私有 ALB)。
tls.hosts
若要使用 TLS,請將 <domain> 替換為 IBM 提供的 Ingress 子網域或您的自訂網域。
tls.secretName
請將「<tls_secret_name>」替換為儲存您的 TLS 憑證 的「Kubernetes」機密名稱。
host
請將 替換為 IBM 所提供的 Ingress 子網域,或您自訂的網域。
path
請將 <app_path> 替換為斜線或您的應用程式正在監聽的路徑。 該路徑將附加至指定的 Ingress 網域,以建立通往您應用程式的專屬路由。 當您在 Web 瀏覽器中輸入此路徑時,網路資料流量就會遞送至 ALB。 ALB 會查閱相關聯的服務,將網路資料流量傳送至服務。 接著,該服務會將流量轉發至應用程式所執行的 Pod。
pathType
URL 的路徑匹配方法。 支援的值為 ImplementationSpecificExactPrefix。 有關各路徑類型的更多資訊及範例,請參閱 社群的 Kubernetes 文件
service.name
請將 app1_serviceapp2_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)。 在輸出結果中,請選擇一個 ALB,其「Build」欄位的格式為 <community_version>_<ibm_build>_iks

    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 元件的健康狀態與運作狀況。

Traefik CRD

以及 Kubernetes 上的《Ingress》相關資源。 基於 Traefik 的 Ingress 控制器允許使用由 Traefik 的自訂資源定義 (CRD) 所定義的資源。 當啟用基於 Traefik 的 ALB 時,所需的 CRD 會自動部署至叢集上。 已部署的 CRD 版本始終與已部署的 Traefik ALB 的最高版本相對應。 有關自訂資源的更多資訊,請參閱 Traefik 的文件

有時,視設定而定,Traefik 的 CR 可能會要求您指定入口點名稱。 在 IBM Cloud Kubernetes Service 中,入口點的預設名稱分別為:web (用於明文 HTTP 流量,預設綁定至 80 埠),以及 websecure (用於 TLS 加密 HTTPS 流量,預設綁定至 443 埠)。 若您的應用程式有此需求,您可以 設定端口或建立額外的入口點

Ingress — Traefik 支援 NGINX 註解

Traefik 內建了一個相容性層,用於處理 Ingress 專屬的 NGINX 註解。 此功能在 IBM Cloud Kubernetes Service 上預設為停用狀態。 啟用此功能將停用對 Traefik 特定註解的處理,因此 ALB 僅會處理 Ingress( NGINX )特定的註解。 ingressProvider 位於 ibm-ingress-deploy-config ConfigMap 中的「xml-ph-0000@deepl.internal」選項,可用於啟用或停用此功能。

有關註解的支援狀態的更多資訊,請參閱 Traefik 的文件

使用 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,才能讓自動狀態檢查將任何狀態異常的 IP 位址從 DNS 回應中移除,並確保在您新增或移除 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