Amazon EKS 上的應用程式負載平衡 - Amazon EKS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon EKS 上的應用程式負載平衡

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

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

必要條件

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

  • 擁有現有的叢集。如果沒有現有叢集,請參閱 Amazon EKS 入門。如果您需要更新現有叢集的版本,請參閱 更新 Amazon EKS 叢集 Kubernetes 版本

  • 將 AWS Load Balancer Controller 部署在您的叢集上。如需詳細資訊,請參閱 什麼是 AWS Load Balancer Controller?。我們建議使用 2.7.1 版或更新版本。

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

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

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

    • sharedowned

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

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

    • sharedowned

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

    • 私有子網路:必須使用下列格式進行標記。這Kubernetes樣, AWS 負載平衡器控制器就知道子網路可用於內部負載平衡器。如果您在 2020 年 3 月 26 日之後使用eksctl或 Amazon EKS AWS CloudFormation 範本建立 VPC,則子網路在建立時會正確標記。如需 Amazon EKS AWS CloudFormation VPC 範本的詳細資訊,請參閱。為 Amazon EKS 叢集建立 VPC

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

      • 1

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

      • 索引鍵kubernetes.io/role/elb

      • 1

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

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

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

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

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

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

      注意

      您的Kubernetes服務必須指定NodePort或 "LoadBalancer" 類型才能使用此流量模式。

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

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

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

若要跨多個服務資源共用 Application Load Balancer,則請使用 IngressGroups

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

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

群組名稱必須:

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

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

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

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

警告

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

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

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

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

重要

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

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

必要條件
  • 叢集 VPC 中必須至少有一個公有或私有子網路。

  • 將 AWS Load Balancer Controller 部署在您的叢集上。如需詳細資訊,請參閱 什麼是 AWS Load Balancer Controller?。我們建議使用 2.7.1 版或更新版本。

部署範例應用程式

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

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

    eksctl create fargateprofile \ --cluster my-cluster \ --region region-code \ --name alb-sample-app \ --namespace game-2048
  2. 將遊戲 2048 部署為範例應用程式,以確認是否因為輸入物件而AWS Load Balancer Controller建立 AWS ALB。針對您正在部署的子網路類型,完成相關的步驟。

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

      • 公有

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

        1. 下載清單檔案。

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

        3. internet-facing 變更為 internal,並儲存檔案。

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

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

      1. 下載清單檔案。

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

        alb.ingress.kubernetes.io/ip-address-type: dualstack
      3. 如果您正在負載平衡至內部 Pods,而不是面向網際網路的 Pods,請變更該行,即將 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 Controller 日誌。這些日誌可能包含錯誤訊息,您可用於診斷部署的相關問題。

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

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

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

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

      kubectl delete -f 2048_full.yaml