View a markdown version of this page

建立 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)。例如,EKS Auto Mode 會在您建立 Ingress Kubernetes 物件時建立負載平衡器,並將其設定為將流量路由至叢集工作負載。

概觀

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

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

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

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

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 的檔案中,建立名為 alb 的 IngressClassParams 資源 (您將在下一步中使用),並指定負載平衡器方案為 internet-facing。

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

將組態套用至您的叢集:

kubectl apply -f alb-ingressclassparams.yaml

步驟 3:建立 IngressClass

建立 IngressClass,參考名為 的檔案中IngressClassParams資源中設定 AWS 的特定組態值alb-ingressclass.yaml。請記下 IngressClass 的名稱。在此範例中,IngressClass 和 IngressClassParams 都命名為 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 Auto Mode 會自動刪除您 AWS 帳戶中相關聯的負載平衡器。

IngressClassParams 參考

下表列出您可以在 IngressClassParams 資源中設定的欄位。這些設定適用於使用 IngressClass 的所有輸入。

欄位 說明 範例值

scheme

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

internet-facing

loadBalancerName

設定 ALB 的名稱。名稱最多可達 32 個字元。覆寫alb.ingress.kubernetes.io/load-balancer-name註釋。

my-alb

namespaceSelector

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

environment: prod

group.name

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

retail-apps

ipAddressType

設定 ALB 的 IP 地址類型。有效值為 ipv4、dualstack 和 dualstack-without-public-ipv4。

dualstack

subnets.ids

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

subnet-xxxx, subnet-yyyy

subnets.matchTags

標記篩選條件以選取 ALB 的子網路。每個篩選條件都有 key和 清單values。

key: Environment, values: [prod]

certificateARNs

要使用的 SSL 憑證 ARN

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

sslPolicy

設定 HTTPS 接聽程式的安全政策。覆寫alb.ingress.kubernetes.io/ssl-policy註釋。

ELBSecurityPolicy-TLS13-1-2-2021-06

inboundCIDRs

允許存取 ALB 的 CIDR 區塊。覆寫alb.ingress.kubernetes.io/inbound-cidrs註釋。

10.0.0.0/16, 192.168.0.0/24

prefixListsIDs

允許存取 ALB 的受管字首清單 IDs。覆寫alb.ingress.kubernetes.io/security-group-prefix-lists註釋。

pl-00000000, pl-11111111

targetType

設定目標群組的目標類型。有效值為 instance 和 ip。預設值為 ip。

instance

tags

AWS 資源的自訂標籤

Environment: prod, Team: platform

loadBalancerAttributes

負載平衡器特定屬性

idle_timeout.timeout_seconds: 60

listeners

在傳入定義的接聽程式上設定接聽程式屬性。每個項目都符合 port和 protocol(HTTP 或 HTTPS) 的接聽程式,並列出attributes為 key和 value對。此欄位不會建立接聽程式。覆寫相同屬性索引鍵的alb.ingress.kubernetes.io/listener-attributes.${Protocol}-${Port}註釋。

port: 443, protocol: HTTPS, attributes: routing.http.response.server.enabled: "false"

minimumLoadBalancerCapacity.capacityUnits

以負載平衡器容量單位 (LCUs) 保留 ALB 的最小容量。設定為 0以移除保留。覆寫alb.ingress.kubernetes.io/minimum-load-balancer-capacity註釋。

1000

ipamConfiguration.ipv4IPAMPoolId

面向網際網路的 ALB 用於其公有 IPv4 地址的 Amazon VPC IP Address Manager (IPAM) 集區的 ID。覆寫alb.ingress.kubernetes.io/ipam-ipv4-pool-id註釋。

ipam-pool-0123456789abcdef0

考量事項

  • 您無法使用 IngressClass 上的註釋來設定 EKS 自動模式的負載平衡器。IngressClass 組態應該透過 IngressClassParams 完成。不過,您可以在個別輸入資源上使用註釋來設定負載平衡器行為 (例如 alb.ingress.kubernetes.io/security-group-prefix-lists或 alb.ingress.kubernetes.io/conditions.*)。

  • 若要為 IngressClass 中的所有輸入設定 ListenerAttribute 值,請使用 IngressClassParams 中的 listeners 欄位。如需詳細資訊,請參閱IngressClassParams 參考。

  • 您必須更新叢集 IAM 角色,才能啟用從 Kubernetes 到 AWS Load Balancer資源的標籤傳播。如需詳細資訊,請參閱EKS Auto 資源的自訂 AWS 標籤。

  • 如需將資源與 EKS Auto Mode 或 self-managed AWS Load Balancer Controller 建立關聯的資訊,請參閱 移轉參考。

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

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

以下表格詳細比較了 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

spec.listeners.attributes

已重新命名接聽程式屬性的欄位

spec.PrefixListsIDs

spec.prefixListsIDs

僅支援拼prefixListsIDs寫

spec.sslRedirectPort

不支援

在輸入物件上使用alb.ingress.kubernetes.io/ssl-redirect註釋

spec.wafv2AclArn

不支援

在輸入物件上使用alb.ingress.kubernetes.io/wafv2-acl-arn註釋

spec.wafv2AclName

不支援

在輸入物件上使用alb.ingress.kubernetes.io/wafv2-acl-name註釋

傳入註釋

先前的 新增 說明

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/dry-run-plan

不支援

目前不支援乾執行計劃

alb.ingress.kubernetes.io/create-acm-cert

不支援

目前不支援建立 ACM 憑證

alb.ingress.kubernetes.io/acm-pca-arn

不支援

目前不支援 ACM PCA ARN

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

支援其他 RBAC

授予負載平衡器控制器對 OIDC 的get存取權Secret。如需詳細資訊,請參閱授予 EKS Auto Mode 負載平衡器控制器對特定 Secret 的存取權。

TargetGroupBinding

先前的 新增 說明

elbv2.k8s.aws/v1beta1

eks.amazonaws.com/v1

API 版本變更

spec.targetType 選用

spec.targetType 必要

明確的目標類型規格

spec.networking.ingress.from

不支援

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

若要使用自訂 TargetGroupBinding 功能,您必須使用叢集名稱的 eks:eks-cluster-name 標籤來標記目標群組,以授予控制器必要的 IAM 許可。請注意,刪除 TargetGroupBinding 資源或叢集時,控制器會刪除目標群組。