

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 创建 IngressClass 以配置应用程序负载均衡器
<a name="auto-configure-alb"></a>

EKS 自动模式可自动执行例行负载均衡任务，包括向互联网公开集群应用程序等。

 Amazon 建议使用应用程序负载均衡器（ALB）来处理 HTTP 和 HTTPS 流量。应用程序负载均衡器可以根据请求的内容进行路由。有关应用程序负载均衡器的更多信息，请参阅 [What is Elastic Load Balancing?](https://docs.amazonaws.cn/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)

EKS 自动模式会创建和配置应用程序负载均衡器（ALB）。例如，EKS 自动模式会在您创建 `Ingress` Kubernetes 对象时创建一个负载均衡器，并配置为使用该负载均衡器来路由指向集群工作负载的流量。

 **概述** 

1. 创建您希望向互联网公开的工作负载。

1. 创建一个 `IngressClassParams` 资源并指定 Amazon 特定的配置值，例如用于 SSL/TLS 和 VPC 子网的证书。

1. 创建一个 `IngressClass` 资源并将 EKS 自动模式指定为该资源的控制器。

1. 创建一个 `Ingress` 资源，以将某个 HTTP 路径和端口与集群工作负载关联。

EKS 自动模式将使用 `IngressClassParams` 资源中指定的负载均衡器配置，创建一个指向 `Ingress` 资源中指定工作负载的应用程序负载均衡器。

## 先决条件
<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`、在端口 `80` 上侦听的简单 HTTP 服务。通过应用以下 `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` 对象来指定应用程序负载均衡器的 Amazon 特定配置选项。在本示例中，我们创建了一个名为 `alb` 的 `IngressClassParams` 资源（您将在下一步中使用该资源），该资源在名为 `alb-ingressclassparams.yaml` 的文件中将负载均衡器方案指定为 `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>

在名为 `alb-ingressclass.yaml` 的文件中创建 `IngressClass`，它引用 `IngressClassParams` 资源中设置的 Amazon 特定配置值。记下 `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 步：创建 Ingress
<a name="_step_4_create_ingress"></a>

在名为 `alb-ingress.yaml` 的文件中创建 `Ingress` 资源。此资源的用途是将应用程序负载均衡器上的路径和端口关联到集群中的工作负载。在本示例中，我们创建了一个名为 `2048-ingress` 的 `Ingress` 资源，该资源将流量路由到端口 80 上名为 `service-2048` 的服务。

有关如何配置此资源的更多信息，请参阅 Kubernetes 文档中的 [Ingress](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 自动模式会自动删除您的 Amazon 账户中关联的负载均衡器。

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

下表列举了常用配置选项的快速参考。


| 字段 | 说明 | 示例值 | 
| --- | --- | --- | 
|   `scheme`   |  定义 ALB 是内部专用还是面向互联网  |   `internet-facing`   | 
|   `namespaceSelector`   |  限定可以使用此 IngressClass 的命名空间  |   `environment: prod`   | 
|   `group.name`   |  将多个 Ingress 分组以共享单个 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-cn:acm:region:account:certificate/id`   | 
|   `tags`   |  Amazon 资源的自定义标签  |   `Environment: prod, Team: platform`   | 
|   `loadBalancerAttributes`   |  负载均衡器特定的属性  |   `idle_timeout.timeout_seconds: 60`   | 

## 注意事项
<a name="_considerations"></a>
+ 您不能使用在 IngressClass 上的注释来配置用于 EKS 自动模式的负载均衡器。IngressClass 配置应通过 IngressClassParams 完成。但您可以在单个 Ingress 资源上使用注解来配置负载均衡器的行为（例如 `alb.ingress.kubernetes.io/security-group-prefix-lists` 或 `alb.ingress.kubernetes.io/conditions.*`）。
+ 您无法使用 EKS 自动模式设置 [ListenerAttribute](https://docs.amazonaws.cn/elasticloadbalancing/latest/APIReference/API_ListenerAttribute.html)。
+ 您必须更新集群 IAM 角色才能支持将标签从 Kubernetes 传播到 Amazon 负载均衡器资源。有关更多信息，请参阅 [EKS 自动模式资源的自定义 Amazon 标签](auto-cluster-iam-role.md#tag-prop)。
+ 有关将资源关联到 EKS 自动模式或自主管理型 Amazon 负载均衡器控制器的信息，请参阅[迁移参考](migrate-auto.md#migration-reference)。
+ 有关修复负载均衡器问题的信息，请参阅 [EKS 自动模式故障排除](auto-troubleshoot.md)。
+ 有关使用 EKS 自动模式的负载均衡功能时的其他注意事项，请参阅[负载均衡](auto-networking.md#auto-lb-consider)。

以下表格详细比较了 EKS 自动模式的 IngressClassParams、Ingress 注释和 TargetGroupBinding 配置的更改。这些表格重点介绍了 EKS 自动模式的负载均衡功能与开源负载均衡器控制器之间的主要区别，包括 API 版本更改、已弃用的功能和更新后的参数名称等。

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


| 旧版 | New | 说明 | 
| --- | --- | --- | 
|   `elbv2.k8s.aws/v1beta1`   |   `eks.amazonaws.com/v1`   |  API 版本更改  | 
|   `spec.certificateArn`   |   `spec.certificateARNs`   |  支持多个证书 ARN  | 
|   `spec.subnets.tags`   |   `spec.subnets.matchTags`   |  更改了子网匹配架构  | 
|   `spec.listeners.listenerAttributes`   |  不支持  |  尚未得到 EKS 自动模式的支持  | 

### Ingress 注释
<a name="_ingress_annotations"></a>


| 旧版 | New | 说明 | 
| --- | --- | --- | 
|   `kubernetes.io/ingress.class`   |  不支持  |  在 Ingress 对象上使用 `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>


| 旧版 | New | 说明 | 
| --- | --- | --- | 
|   `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 资源或集群被删除时，控制器将删除目标组。