

 **協助改進此頁面** 

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

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

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

# 建立 IngressClass 以設定 Application Load Balancer
<a name="auto-configure-alb"></a>

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

 AWS 建議使用 Application Load Balancer (ALB) 來提供 HTTP 和 HTTPS 流量。Application Load Balancer 可根據請求的內容路由請求。如需 Application Load Balancer 的詳細資訊，請參閱[什麼是 Elastic Load Balancing？](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 

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

 **概觀** 

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

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

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

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

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

## 先決條件
<a name="_prerequisites"></a>
+ Amazon EKS 叢集上已啟用 EKS 自動模式
+ Kubectl 已設定為連接到您的叢集
  + 您可使用 `kubectl apply -f <filename>`，將以下範例組態 YAML 檔案套用至您的叢集。

**注意**  
EKS 自動模式需要子網路標籤來識別公有和私有子網路。  
若您使用 `eksctl` 建立叢集，則您已具備這些標籤。  
了解如何 [標記 EKS 自動模式的子網路](tag-subnets-auto.md)。

## 步驟 1：建立工作負載
<a name="_step_1_create_a_workload"></a>

首先，建立您想要公開到網際網路的工作負載。此工作負載可為任何處理 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
<a name="_step_2_create_ingressclassparams"></a>

建立 `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
<a name="_step_3_create_ingressclass"></a>

建立 `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 參考](#ingress-reference)。

將組態套用至您的叢集：

```
kubectl apply -f alb-ingressclass.yaml
```

## 步驟 4：建立傳入
<a name="_step_4_create_ingress"></a>

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

如需關於設定資源的詳細資訊，請參閱 Kubernetes 文件中的[傳入](https://kubernetes.io/docs/concepts/services-networking/ingress/)。

```
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：檢查狀態
<a name="_step_5_check_status"></a>

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

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

```
kubectl get ingress 2048-ingress
```

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

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

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

## 步驟 6：清除
<a name="_step_6_cleanup"></a>

要清理負載平衡器，請使用以下命令：

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

EKS Auto Mode 會自動刪除您 AWS 帳戶中相關聯的負載平衡器。

## IngressClassParams 參考
<a name="ingress-reference"></a>

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


| 欄位 | Description | 範例值 | 
| --- | --- | --- | 
|   `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`   | 

## 考量事項
<a name="_considerations"></a>
+ 您無法使用 IngressClass 上的註釋來設定 EKS 自動模式的負載平衡器。IngressClass 組態應該透過 IngressClassParams 完成。不過，您可以在個別輸入資源上使用註釋來設定負載平衡器行為 （例如 `alb.ingress.kubernetes.io/security-group-prefix-lists`或 `alb.ingress.kubernetes.io/conditions.*`)。
+ 您無法使用 EKS 自動模式來設定 [ListenerAttribute](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_ListenerAttribute.html)。
+ 您必須更新叢集 IAM 角色，才能啟用從 Kubernetes 到 AWS Load Balancer資源的標籤傳播。如需詳細資訊，請參閱[EKS Auto 資源的自訂 AWS 標籤](auto-learn-iam.md#tag-prop)。
+ 如需將資源與 EKS Auto Mode 或 self-managed AWS Load Balancer Controller 建立關聯的資訊，請參閱 [移轉參考](migrate-auto.md#migration-reference)。
+ 有關修復負載平衡器問題的資訊，請參閱 [EKS 自動模式疑難排解](auto-troubleshoot.md)。
+ 有關使用 EKS 自動模式負載平衡功能的更多考量，請參閱 [Load balancing](auto-networking.md#auto-lb-consider)。

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

### IngressClassParams
<a name="_ingressclassparams"></a>


| 先前的 | 新增 | Description | 
| --- | --- | --- | 
|   `elbv2.k8s.aws/v1beta1`   |   `eks.amazonaws.com/v1`   |  API 版本變更  | 
|   `spec.certificateArn`   |   `spec.certificateARNs`   |  支援多個憑證 ARN  | 
|   `spec.subnets.tags`   |   `spec.subnets.matchTags`   |  變更子網路相符的結構描述  | 
|   `spec.listeners.listenerAttributes`   |  不支援  |  EKS 自動模式尚不支援  | 

### 傳入註釋
<a name="_ingress_annotations"></a>


| 先前的 | 新增 | Description | 
| --- | --- | --- | 
|   `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
<a name="_targetgroupbinding"></a>


| 先前的 | 新增 | Description | 
| --- | --- | --- | 
|   `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 資源或叢集時，控制器會刪除目標群組。