建立 IngressClass 以設定 Application Load Balancer - Amazon EKS

協助改進此頁面

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

建立 IngressClass 以設定 Application Load Balancer

EKS 自動模式會自動執行負載平衡的常規任務,包括將叢集應用程式公開至網際網路。

AWS 建議使用 Application Load Balancer (ALB) 來處理 HTTP 與 HTTPS 流量。Application Load Balancer 可根據請求的內容路由請求。如需 Application Load Balancer 的詳細資訊,請參閱什麼是 Elastic Load Balancing?

EKS 自動模式會建立與設定 Application Load Balancer (ALB)。例如,當您建立一個 Ingress Kubernetes 物件時,EKS 自動模式會建立一個負載平衡器,並將其設定為將流量路由至叢集工作負載。

概觀

  1. 建立您想要公開到網際網路的工作負載。

  2. 建立 IngressClassParams 資源,指定 AWS 特定的組態值,例如用於 SSL/TLS 的憑證及 VPC 子網路。

  3. 建立 IngressClass 資源,指定 EKS 自動模式將作為該資源的控制器。

  4. 建立 Ingress 資源,將 HTTP 路徑和連接埠與叢集工作負載關聯起來。

EKS 自動模式將建立 Application Load Balancer,指向 Ingress 資源中指定的工作負載,並使用在 IngressClassParams 資源中指定的負載平衡器配置。

先決條件

  • Amazon EKS 叢集上已啟用 EKS 自動模式

  • Kubectl 已設定為連接到您的叢集

    • 您可使用 kubectl apply -f <filename>,將以下範例組態 YAML 檔案套用至您的叢集。

注意

EKS 自動模式需要子網路標籤來識別公有和私有子網路。

若您使用 eksctl 建立叢集,則您已具備這些標籤。

了解如何 標記 EKS 自動模式的子網路

步驟 1:建立工作負載

首先,建立您想要公開到網際網路的工作負載。此工作負載可為任何處理 HTTP 流量的 Kubernetes 資源,例如部署或服務。

此範例使用名為 service-2048 的簡單 HTTP 服務,其接聽連接埠 80。透過套用下列資訊清單 2048-deployment-service.yaml,建立此服務及其部署:

--- apiVersion: apps/v1 kind: Deployment metadata: name: deployment-2048 spec: selector: matchLabels: app.kubernetes.io/name: app-2048 replicas: 2 template: metadata: labels: app.kubernetes.io/name: app-2048 spec: containers: - image: public.ecr.aws/l6m2t8p7/docker-2048:latest imagePullPolicy: Always name: app-2048 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: service-2048 spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app.kubernetes.io/name: app-2048

將組態套用至您的叢集:

kubectl apply -f 2048-deployment-service.yaml

上面列出的資源將在預設命名空間中建立。您可以透過執行以下命令來進行確認:

kubectl get all -n default

步驟 2:建立 IngressClassParams

建立 IngressClassParams 物件來為 Application Load Balancer 指定 AWS 特定的組態選項。在本範例中,我們在名為 alb-ingressclassparams.yaml 的檔案中,建立名為 albIngressClassParams 資源 (您將在下一步中使用),並指定負載平衡器方案為 internet-facing

apiVersion: eks.amazonaws.com/v1 kind: IngressClassParams metadata: name: alb spec: scheme: internet-facing

將組態套用至您的叢集:

kubectl apply -f alb-ingressclassparams.yaml

步驟 3:建立 IngressClass

在名為 alb-ingressclass.yaml 的檔案中,建立參考 IngressClassParams 資源中設定的 AWS 特定組態值的 IngressClass。請記下 IngressClass 的名稱。在此範例中,IngressClassIngressClassParams 都命名為 alb

使用 is-default-class 註釋來控制 Ingress 資源是否預設使用此類別。

apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb annotations: # Use this annotation to set an IngressClass as Default # If an Ingress doesn't specify a class, it will use the Default ingressclass.kubernetes.io/is-default-class: "true" spec: # Configures the IngressClass to use EKS Auto Mode controller: eks.amazonaws.com/alb parameters: apiGroup: eks.amazonaws.com kind: IngressClassParams # Use the name of the IngressClassParams set in the previous step name: alb

關於設定選項的詳細資訊,請參閱 IngressClassParams 參考

將組態套用至您的叢集:

kubectl apply -f alb-ingressclass.yaml

步驟 4:建立傳入

在名為 alb-ingress.yaml 的檔案中建立 Ingress 資源。此資源的用途是將 Application Load Balancer 上的路徑與連接埠,與您叢集中的工作負載相關聯。在此範例中,我們建立名為 Ingress 的資源 2048-ingress,將其流量路由到連接埠 80 上名為 service-2048 的服務。

如需關於設定資源的詳細資訊,請參閱 Kubernetes 文件中的傳入

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: 2048-ingress spec: # this matches the name of IngressClass. # this can be omitted if you have a default ingressClass in cluster: the one with ingressclass.kubernetes.io/is-default-class: "true" annotation ingressClassName: alb rules: - http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: service-2048 port: number: 80

將組態套用至您的叢集:

kubectl apply -f alb-ingress.yaml

步驟 5:檢查狀態

使用 kubectl 尋找 Ingress 的狀態。負載平衡器可能需要幾分鐘才能就緒。

使用您在上一步中設定的 Ingress 資源名稱。例如:

kubectl get ingress 2048-ingress

資源就緒後,擷取負載平衡器的網域名稱。

kubectl get ingress 2048-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'

要在 Web 瀏覽器中檢視服務,請檢閱 Ingress 救援中指定的連接埠與路徑。

步驟 6:清除

要清理負載平衡器,請使用以下命令:

kubectl delete ingress 2048-ingress kubectl delete ingressclass alb kubectl delete ingressclassparams alb

EKS 自動模式將自動刪除您 AWS 帳戶中的關聯負載平衡器。

IngressClassParams 參考

下表屬於常用組態選項的快速參考。

欄位 描述 範例值

scheme

定義 ALB 是內部,還是可面向網際網路

internet-facing

namespaceSelector

限制哪些命名空間可使用此 IngressClass

environment: prod

group.name

將多個傳入分組,以共用單一 ALB

retail-apps

ipAddressType

設定 ALB 的 IP 位址類型

dualstack

subnets.ids

用於 ALB 部署的子網路 ID 清單

subnet-xxxx, subnet-yyyy

subnets.tags

用於選擇 ALB 子網路的標籤篩選器

Environment: prod

certificateARNs

要使用的 SSL 憑證 ARN

arn:aws:acm:region:account:certificate/id

tags

用於 AWS 資源的自訂標籤

Environment: prod, Team: platform

loadBalancerAttributes

負載平衡器特定屬性

idle_timeout.timeout_seconds: 60

考量事項

  • 您無法使用 IngressClass 上的註釋來設定 EKS 自動模式的負載平衡器。

  • 您無法使用 EKS 自動模式來設定 ListenerAttribute

  • 您必須更新叢集 IAM 角色,以啟用從 Kubernetes 到 AWS 負載平衡器資源的標籤傳播。如需詳細資訊,請參閱 用於 EKS Auto 資源的自訂 AWS 標籤

  • 有關將資源與 EKS 自動模式或自我管理的 AWS 負載平衡器控制器關聯的資訊,請參閱 移轉參考

  • 有關修復負載平衡器問題的資訊,請參閱 EKS 自動模式疑難排解

  • 有關使用 EKS 自動模式負載平衡功能的更多考量,請參閱 負載平衡

以下表格詳細比較了 EKS 自動模式中 IngressClassParams、傳入註釋和 TargetGroupBinding 組態的變更。這些資料表突顯了 EKS 自動模式的負載平衡功能與開放原始碼負載平衡器控制器之間的主要差異,包括 API 版本變更、已棄用的功能及更新的參數名稱。

IngressClassParams

先前的 新增 描述

elbv2.k8s.aws/v1beta1

eks.amazonaws.com/v1

API 版本變更

spec.certificateArn

spec.certificateARNs

支援多個憑證 ARN

spec.subnets.tags

spec.subnets.matchTags

變更子網路相符的結構描述

spec.listeners.listenerAttributes

不支援

EKS 自動模式尚不支援

傳入註釋

先前的 新增 描述

kubernetes.io/ingress.class

不支援

在傳入物件上使用 spec.ingressClassName

alb.ingress.kubernetes.io/group.name

不支援

僅在 IngressClass 中指定群組

alb.ingress.kubernetes.io/waf-acl-id

不支援

請改用 WAF v2

alb.ingress.kubernetes.io/web-acl-id

不支援

請改用 WAF v2

alb.ingress.kubernetes.io/shield-advanced-protection

不支援

Shield 整合已停用

alb.ingress.kubernetes.io/auth-type: oidc

不支援

目前不支援 OIDC 驗證類型

TargetGroupBinding

先前的 新增 描述

elbv2.k8s.aws/v1beta1

eks.amazonaws.com/v1

API 版本變更

spec.targetType 選用

spec.targetType 必要

明確的目標類型規格

spec.networking.ingress.from

不支援

不再支援沒有安全群組的 NLB