透過 Application Load Balancer 路由應用程式與 HTTP 流量 - Amazon EKS

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

透過 Application Load Balancer 路由應用程式與 HTTP 流量

注意

新功能:Amazon EKS 自動模式現可自動執行負載平衡的常規任務。如需詳細資訊,請參閱:

建立 Kubernetes ingress 時,已佈建 AWS Application Load Balancer (ALB),會負載平衡應用程式流量。如需進一步了解,請參閱《Application Load Balancer 使用者指南》中的什麼是 Application Load Balancer?和 Kubernetes 文件中的傳入。ALB 可與部署至節點或 AWS Fargate 的 Pod 搭配使用。您可以將 ALB 部署到公有或私有子網路。

應用程式流量會在 OSI 模型的 L7 平衡。若要負載平衡 L4 的網路流量,您可以部署 LoadBalancer 類型的 Kubernetes service。此類型會佈建 AWS Network Load Balancer。如需詳細資訊,請參閱 透過 Network Load Balancer 路由 TCP 與 UDP 流量。若要進一步了解兩種負載平衡之間的差異,請參閱 AWS 網站上的 Elastic Load Balancing 功能

先決條件

在將應用程式流量負載平衡到應用程式之前,您必須符合以下要求。

  • 擁有現有的叢集。如果沒有現有叢集,請參閱 開始使用 Amazon EKS。如果您需要更新現有叢集的版本,請參閱 將現有叢集更新至全新 Kubernetes 版本

  • 在叢集上部署 AWS Load Balancer 控制器。如需詳細資訊,請參閱 透過 AWS Load Balancer 控制器路由網際網路流量。我們建議使用 2.7.2 版或更新版本。

  • 至少兩個子網路位於不同的可用區域。AWS Load Balancer 控制器會從每個可用區域選擇一個子網路。當在可用區域中找到多個標記的子網路時,控制器會根據其子網路 ID 依詞典編纂順序來選擇子網路。每個子網路必須至少有 8 個可用的 IP 地址。

    如果使用連接至工作節點的多個安全群組,則必須依如下方式標記一個安全群組。使用您的叢集名稱取代 my-cluster

    • 索引鍵kubernetes.io/cluster/<my-cluster>

    • sharedowned

  • 如果正在使用 AWS Load Balancer 控制器版本 2.1.1 或更早版本,則子網路必須依以下格式加上標籤。如果使用版本 2.1.2 或更新版本,則不一定要加上標籤。不過,如果出現下列任何情況,我們建議您標記子網路。您有多個叢集在同一個 VPC 中執行,或有多個 AWS 服務共享一個 VPC 中的子網路。或者,您希望更好地控制為每個叢集佈建負載平衡器的位置。使用您的叢集名稱取代 my-cluster

    • 索引鍵kubernetes.io/cluster/<my-cluster>

    • sharedowned

  • 您的公有和私有子網路必須符合下列要求,除非明確指定子網路 ID 作為服務或傳入物件上的註釋。假設您透過明確指定子網路 ID 作為服務或傳入物件上的註釋來佈建負載平衡器。在這種情況下,Kubernetes 和 AWS Load Balancer 控制器會直接使用這些子網路來建立負載平衡器,而且不需要下列標記。

    • 私有子網路:必須使用下列格式進行標記。這是為了讓 Kubernetes 和 AWS Load Balancer 控制器了解子網路可用於內部負載平衡器。如果使用 eksctl 或 Amazon EKS AWS CloudFormation 範本在 2020 年 3 月 26 日之後建立 VPC,子網路會在建立時適當加上標籤。如需 Amazon EKS AWS CloudFormation VPC 範本的詳細資訊,請參閱 為您的 Amazon EKS 叢集建立 Amazon VPC

      • 索引鍵kubernetes.io/role/internal-elb

      • 1

    • 公有子網路:必須使用下列格式進行標記。這是為了讓 Kubernetes 知道只使用為外部負載平衡器指定的子網路。如此一來,Kubernetes 不會在每個可用區域中選擇公有子網路 (根據其子網路 ID 依詞典編纂順序)。如果使用 eksctl 或 Amazon EKS AWS CloudFormation 範本在 2020 年 3 月 26 日之後建立 VPC,子網路會在建立時適當加上標籤。如需 Amazon EKS AWS CloudFormation VPC 範本的詳細資訊,請參閱 為您的 Amazon EKS 叢集建立 Amazon VPC

      • 索引鍵kubernetes.io/role/elb

      • 1

    如果沒有明確新增子網路角色標籤,則 Kubernetes 服務控制器會檢查叢集 VPC 子網路的路由表。這是為了判斷子網路是私有還是公有。建議您不要依賴此行為。而是明確地新增私有或公有角色標籤。AWS Load Balancer 控制器不會檢查路由表。其還需要存在私有和公有標籤才能成功自動探索。

  • 每當 Kubernetes 傳入資源使用 kubernetes.io/ingress.class: alb 註釋建立於叢集上,AWS Load Balancer 控制器 便會建立 ALB 和必要的支援 AWS 資源。傳入資源設定 ALB 在叢集內透過 HTTP 或 HTTPS 路由到不同的 Pod。為了確保您的傳入物件使用 AWS Load Balancer 控制器,請新增以下註釋到您的 Kubernetes 傳入規格。如需詳細資訊,請參閱 GitHub 上的傳入規格

    annotations: kubernetes.io/ingress.class: alb
    注意

    如果您正在負載平衡至 IPv6 Pod,請新增以下註釋到您的傳入規格。您只能在 IPv6 上負載平衡至 IP 目標,而不能負載平衡執行個體目標。如果沒有此註釋,負載平衡將在 IPv4 上執行。

    alb.ingress.kubernetes.io/ip-address-type: dualstack
  • AWS Load Balancer 控制器支援下列流量模式:

    • 執行個體 – 將叢集中的節點註冊作為 ALB 的目標。到達 ALB 的流量被路由到服務的 NodePort,然後代理到您的 Pod。這是預設的流量模式。您也可以使用 alb.ingress.kubernetes.io/target-type: instance 註釋明確指定它。

      注意

      您的 Kubernetes 服務必須指定要使用此流量模式的 NodePortLoadBalancer 類型。

    • IP:註冊 Pod 作為 ALB 的目標。到達 ALB 的流量會直接路由到服務的 Pod。您必須指定 alb.ingress.kubernetes.io/target-type: ip 註釋才能使用此流量模式。當目標 Pod 在 Fargate 或 Amazon EKS 混合節點上執行時,必須使用 IP 目標類型。

  • 要標記由控制器建立的 ALB,請新增以下註釋至控制器:alb.ingress.kubernetes.io/tags。如需由 AWS Load Balancer 控制器支援的所有可用注釋,請參閱 GitHub 上的傳入注釋

  • 升級或降級 ALB 控制器版本可能會導致依賴控制器的功能發生重大變化。如需有關每個版本中引入的重大變更的詳細資訊,請參閱 GitHub 上的 ALB 控制器版本備註

透過輸入群組重複使用 ALB

您可使用 IngressGroups 跨多個服務資源共用 Application Load Balancer。

若要將傳入加入群組,請將下列註解新增至 Kubernetes 傳入資源規格。

alb.ingress.kubernetes.io/group.name: my-group

群組名稱必須:

  • 是 63 個字元或以下的長度。

  • 由小寫字母、數字、-. 組成

  • 開頭和結尾為字母或數字。

控制器會自動合併相同傳入群組中所有傳入的傳入規則。控制器透過單個 ALB 提供支援。在傳入中定義的大多數註解僅適用於該傳入定義的路徑。根據預設,傳入資源不屬於任何傳入群組。

警告

潛在的安全風險

僅當所有具有建立或修改傳入資源之 RBAC 許可的 Kubernetes 使用者都在相同的信任界限內時,才為傳入指定傳入群組。如果您使用群組名稱新增註釋,其他 Kubernetes 使用者可以建立或修改其傳入,使其屬於同一傳入群組。這樣做可能會產生不良行為,例如以較高優先順序規則覆寫現有規則。

您可以新增傳入資源的訂單編號。

alb.ingress.kubernetes.io/group.order: '10'

該編號可以是 1 到 1000 之間的數字。系統會先評估相同傳入群組中所有傳入數量的最低數量。系統會使用 0 值評估沒有此注釋的所有傳入。具有較高數量的重複規則可以覆寫具有較低數量的規則。根據預設,相同傳入群組中傳入之間的規則順序是由命名空間和名稱依詞典編纂順序決定。

重要

確定相同傳入群組中的每個傳入都有唯一的優先順序編號。您不能在整個傳入中有重複的訂單編號。

(選用) 部署範例應用程式

您可以在具有 Amazon EC2 節點、Fargate Pod 或兩者兼有的叢集上執行範例應用程式。

  1. 如果您沒有部署到 Fargate,請略過此步驟。如果您要部署到 Fargate,請建立 Fargate 描述檔。您可以透過執行下列命令來建立描述檔,也可以使用命令中 namenamespace 相同的值藉由 AWS 管理主控台 進行。使用自己的取代範例值

    eksctl create fargateprofile \ --cluster my-cluster \ --region region-code \ --name alb-sample-app \ --namespace game-2048
  2. 部署遊戲 2048 作為範例應用程式,來驗證 AWS Load Balancer 控制器建立 AWS ALB 作為傳入物件的結果。針對您正在部署的子網路類型,完成相關的步驟。

    1. 如果要部署到使用 IPv6 系列建立的叢集中的 Pod,請跳到下一步。

      • 公有::

      kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.3/docs/examples/2048/2048_full.yaml
      • 私有::

        1. 下載清單檔案。

          curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.3/docs/examples/2048/2048_full.yaml
        2. 編輯檔案並尋找顯示 alb.ingress.kubernetes.io/scheme: internet-facing 的行。

        3. 面向網際網路變更為 internal 並儲存檔案。

        4. 將清單檔案套用至叢集。

          kubectl apply -f 2048_full.yaml
    2. 如果要部署到使用 IPv6 系列建立的叢集中的 Pod,請完成下列步驟。

      1. 下載清單檔案。

        curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.3/docs/examples/2048/2048_full.yaml
      2. 在編輯器中開啟檔案,然後在傳入規格中新增以下一行註釋。

        alb.ingress.kubernetes.io/ip-address-type: dualstack
      3. 如果您正在負載平衡至內部 Pod,而不是面向網際網路的 Pod,請變更該行,即將 alb.ingress.kubernetes.io/scheme: internet-facing 變更為 alb.ingress.kubernetes.io/scheme: internal

      4. 儲存檔案。

      5. 將清單檔案套用至叢集。

        kubectl apply -f 2048_full.yaml
  3. 幾分鐘後,使用下列指令來驗證傳入資源已建立。

    kubectl get ingress/ingress-2048 -n game-2048

    範例輸出如下。

    NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 <none> * k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.region-code.elb.amazonaws.com 80 2m32s
    注意

    若在私有子網路中建立負載平衡器,則先前輸出中位於 ADDRESS 下的值前面會加上 internal-

如果幾分鐘後尚未成功建立傳入,請執行下列命令以檢視 AWS Load Balancer 控制器日誌。這些日誌可能包含錯誤訊息,您可用於診斷部署的相關問題。

kubectl logs -f -n kube-system -l app.kubernetes.io/instance=aws-load-balancer-controller
  1. 如果您部署公有子網路,請開啟瀏覽器,再導覽至先前指令輸出中的 ADDRESS URL 查看範例應用程式。如果沒有看到任何內容,請重新整理瀏覽器,然後再試一次。如果您部署至私有子網路,則需要從 VPC 內的裝置 (例如堡壘主機) 檢視頁面。如需詳細資訊,請參閱 AWS 上的 Linux 堡壘主機

    2048 範例應用程式
  2. 完成對範例應用程式的實驗後,請透過執行下列命令之一將其刪除。

    • 如果您應用了清單檔案,而不是應用下載的複本,請使用以下命令。

      kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.3/docs/examples/2048/2048_full.yaml
    • 如果您下載並編輯清單檔案,請使用下列命令。

      kubectl delete -f 2048_full.yaml