

 **帮助改进此页面** 

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

# 使用 AWS 负载均衡器控制器路由互联网流量
<a name="aws-load-balancer-controller"></a>

**提示**  
 [注册参加](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即将举办的 Amazon EKS 讲习会。

AWS负载均衡器控制器管理适用于 Kubernetes 集群的 AWS Elastic Load Balancer。您可以使用控制器将您的集群应用程序公开到互联网。控制器预调配指向集群服务或入口资源的 AWS 负载均衡器。换句话说，控制器创建一个指向集群中多个容器组（pod）的 IP 地址或 DNS 名称。

![\[架构示意图。互联网用户流量流向 Amazon 负载均衡器的示意图。Amazon 负载均衡器将流量分配到集群中的容器组。\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/images/lbc-overview.png)


控制器会监控 Kubernetes 入口或服务资源。作为响应，它会创建相应的 AWS 弹性负载均衡资源。您可以通过对 Kubernetes 资源应用注释来配置负载均衡器的特定行为。例如，您可以使用注释将 AWS 安全组附加到负载均衡器。

此控制器预置以下资源：

 **Kubernetes `Ingress`**   
LBC 会在您创建 Kubernetes `Ingress` 时创建 [AWS 应用程序负载均衡器（ALB）](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)。[查看可以应用于入口资源的注释。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)

 **`LoadBalancer` 类型的 Kubernetes 服务**   
LBC 将在您创建 `LoadBalancer` 类型的 Kubernetes 服务时创建 [AWS 网络负载均衡器（NLB）](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html)。[查看可以应用于服务资源的注释。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/)  
在过去，*实例*目标使用 Kubernetes 网络负载均衡器，而 *IP* 目标使用 LBC。现在，有了 AWS 负载均衡器控制器版本 `2.3.0` 或更高版本，您可以使用任一目标类型创建 NLB。有关 NLB 目标类型的更多信息，请参阅 Network Load Balancer 用户指南中的[目标类型](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#target-type)。

控制器是托管在 GitHub 上的[开源项目](https://github.com/kubernetes-sigs/aws-load-balancer-controller)。

在部署控制器之前，我们建议您查看[使用应用程序负载均衡器路由应用程序和 HTTP 流量](alb-ingress.md)和[使用网络负载均衡器路由 TCP 和 UDP 流量](network-load-balancing.md)中的先决条件和注意事项。在这些主题中，您将部署包含 AWS 负载均衡器的示例应用程序。

 **Kubernetes `Gateway` API**   
对于 AWS 负载均衡器控制器 `2.14.0` 版本或更高版本，LBC 会在您创建 Kubernetes `Gateway` 时创建 [AWS 应用程序负载均衡器（ALB）](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)。与 Ingress 相比，Kubernetes 网关标准化的配置更多，前者需要为许多常用选项自定义注释。[查看可以应用于网关资源的配置。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/gateway/gateway/)有关 `Gateway` API 的更多信息，请参阅 Kubernetes 文档中的 [Gateway API](https://kubernetes.io/docs/concepts/services-networking/gateway/)。

## 安装控制器
<a name="lbc-overview"></a>

可以按照以下过程之一安装 AWS 负载均衡器控制器：
+ 如果您不熟悉 Amazon EKS，我们建议您使用 Helm 进行安装，因为它可以简化 AWS 负载均衡器控制器安装。有关更多信息，请参阅 [使用 Helm 安装 AWS 负载均衡器控制器](lbc-helm.md)。
+ 对于高级配置，例如对公有容器注册表具有有限网络访问权限的集群，请使用 Kubernetes 清单。有关更多信息，请参阅 [使用清单安装 AWS 负载均衡器控制器](lbc-manifest.md)。

## 从已弃用的控制器版本迁移
<a name="lbc-deprecated"></a>
+ 如果您安装了已弃用的 AWS 负载均衡器控制器版本，请参阅[从已弃用的 ALB 入口控制器迁移应用程序](lbc-remove.md)。
+ 已弃用的版本无法升级。必须将其移除并安装最新版本的 AWS 负载均衡器控制器。
+ 已弃用的版本包括：
  +  适用于 Kubernetes 的 AWS ALB 入口控制器（简称“入口控制器”），是 AWS 负载均衡器控制器的前身。
  + 任何 `0.1.x ` 版本的 AWS 负载均衡器控制器

## 旧版云提供商
<a name="lbc-legacy"></a>

Kubernetes 包括 AWS 的旧版云提供商。旧版云提供商能够预置 AWS 负载均衡器，这与 AWS 负载均衡器控制器类似。传统云提供商创建经典负载均衡器。如果不安装 AWS 负载均衡器控制器，则 Kubernetes 将默认设置为使用旧版云提供商。您应该安装 AWS 负载均衡器控制器，避免使用旧版云提供商。

**重要**  
在版本 2.5 及更高版本中，AWS 负载均衡器控制器成为 Kubernetes *服务*资源的默认控制器（包含 `type: LoadBalancer`），并为每个服务创建了 AWS 网络负载均衡器（NLB）。为此它将为服务创建一个变异的 Webhook，对于新的 `type: LoadBalancer` 服务，后者会将 `spec.loadBalancerClass` 字段设置为 `service.k8s.aws/nlb`。您可以关闭此功能，然后将 Helm 图表值 `enableServiceMutatorWebhook` 设置为 `false`，从而恢复将 [传统云提供商](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/#legacy-cloud-provider) 作为默认控制器。除非您关闭此功能，否则集群不会为您的服务预置新的经典负载均衡器。现有的经典负载均衡器将继续运行。

# 使用 Helm 安装 AWS 负载均衡器控制器
<a name="lbc-helm"></a>

**提示**  
 [注册参加](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即将举办的 Amazon EKS 讲习会。

**提示**  
使用 Amazon EKS 自动模式时，您无需安装或升级联网附加组件。自动模式包含容器组联网和负载均衡功能。  
有关更多信息，请参阅 [使用 EKS 自动模式实现集群基础设施自动化](automode.md)。

本主题介绍如何使用 Helm（Kubernetes 的程序包管理器）和 `eksctl` 安装 AWS 负载均衡器控制器。控制器安装了默认的选项。有关控制器的更多信息，包括使用注释对其进行配置的详细信息，请参阅 GitHub 上的 [AWS Load Balancer Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/) 文档。

在以下步骤中，将 example values 替换为您自己的值。

## 先决条件
<a name="lbc-prereqs"></a>

在开始本教程之前，请完成以下步骤：
+ 创建一个 Amazon EKS 集群。要创建该文件，请参阅 [开始使用 Amazon EKS](getting-started.md)。
+ 在本地计算机上安装 [Helm](https://helm.sh/docs/helm/helm_install/)。
+ 确保适用于 Kubernetes 的 Amazon VPC CNI 插件、`kube-proxy` 和 CoreDNS 附加组件为[服务账户令牌](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)中列出的最低版本。
+ 了解 AWS Elastic Load Balancing 概念。有关更多信息，请参阅 [Elastic Load Balancing 用户指南](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/)。
+ 了解 Kubernetes [服务](https://kubernetes.io/docs/concepts/services-networking/service/)和[入口](https://kubernetes.io/docs/concepts/services-networking/ingress/)资源。

### 注意事项
<a name="lbc-considerations"></a>

在继续执行本页面的配置步骤之前，请注意以下事项：
+ IAM 策略和角色 (`AmazonEKSLoadBalancerControllerRole`) 可以在同一 AWS 账户中的多个 EKS 集群中重复使用。
+ 如果要在最初创建角色 (`AmazonEKSLoadBalancerControllerRole`) 的同一集群上安装控制器，请先确认角色存在，然后转到[步骤 2：安装负载均衡器控制器](#lbc-helm-install)。
+ 如果使用的是服务账户的 IAM 角色（IRSA），则必须为每个集群设置 IRSA，并且角色信任策略中的 OpenID Connect（OIDC）提供者 ARN 应特定于每个 EKS 集群。此外，如果要在具有现有 `AmazonEKSLoadBalancerControllerRole` 的新集群上安装控制器，请更新该角色的信任策略以包含新集群的 OIDC 提供者，并通过适当的角色注释创建一个新的服务账户。要确定是否已经拥有 OIDC 提供者或者要创建一个 OIDC 提供者，请参阅[为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。

## 步骤 1：使用 `eksctl` 创建 IAM 角色
<a name="lbc-helm-iam"></a>

以下步骤参考 AWS 负载均衡器控制器 **v2.14.1** 发行版。有关所有发行版的更多信息，请参阅 GitHub 上的 [AWS Load Balancer Controller Release](https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/) 页面。

1. 下载AWS负载均衡器控制器的 IAM 策略，该策略允许负载均衡器代表您调用 AWS API。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
   ```
   + 对于政府区域或中国区域等非标准 AWS 分区，[请查看 GitHub 上的政策](https://github.com/kubernetes-sigs/aws-load-balancer-controller/tree/main/docs/install)并下载适用于您所在区域的相应政策。

1. 使用上一步中下载的策略创建一个 IAM 策略。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```
**注意**  
如果您在AWS 管理控制台中查看策略，则控制台会显示有关 **ELB** 服务的警告，但不会显示有关 **ELB v2** 服务的警告。之所以发生这种情况，是因为策略中的某些操作适用于 **ELB v2**，但不适用于 **ELB**。您可以忽略有关 **ELB** 的警告。

1. 替换集群名称、区域代码和账户 ID 的值。

   ```
   eksctl create iamserviceaccount \
       --cluster=<cluster-name> \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region <aws-region-code> \
       --approve
   ```

## 步骤 2：安装 AWS 负载均衡器控制器
<a name="lbc-helm-install"></a>

1. 添加 `eks-charts` Helm 图表存储库。AWS 在 GitHub 上维护[此存储库](https://github.com/aws/eks-charts)。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. 更新您的本地存储库，以确保您拥有最新的图表。

   ```
   helm repo update eks
   ```

1. 安装AWS负载均衡器控制器。

   如果要将控制器部署到[限制访问 Amazon EC2 实例元数据服务（IMDS）](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 的 Amazon EC2 节点，或者部署到 Fargate 节点或 Amazon EKS 混合节点功能，则需要在以下 `helm` 命令中添加以下标志：
   +  `--set region=region-code ` 
   +  `--set vpcId=vpc-xxxxxxxx ` 

     将 *my-cluster* 替换为您的集群的名称。在以下命令中，`aws-load-balancer-controller` 是您在上一步中创建的 Kubernetes 服务账户。

     有关配置 Helm 图表的更多信息，请参阅 GitHub 上的 [values.yaml](https://github.com/aws/eks-charts/blob/master/stable/aws-load-balancer-controller/values.yaml)。

     ```
     helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
       -n kube-system \
       --set clusterName=my-cluster \
       --set serviceAccount.create=false \
       --set serviceAccount.name=aws-load-balancer-controller \
       --version 1.14.0
     ```

**重要**  
已部署的图表不会自动接收安全更新。当新图表可用时，您需要手动升级到新图表。升级时，在上一个命令中将 *install* 更改为 `upgrade`。

`helm install` 命令会自动安装控制器的自定义资源定义（CRD）。`helm upgrade` 命令不会。如果您使用 `helm upgrade,`，则必须手动安装 CRD。运行以下命令来安装 CRD：

```
wget https://raw.githubusercontent.com/aws/eks-charts/master/stable/aws-load-balancer-controller/crds/crds.yaml
kubectl apply -f crds.yaml
```

## 步骤 3：验证控制器是否已安装
<a name="lbc-helm-verify"></a>

1. 验证控制器是否已安装。

   ```
   kubectl get deployment -n kube-system aws-load-balancer-controller
   ```

   示例输出如下。

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

   如果使用 Helm 进行部署，则会收到之前的输出结果。如果您使用 Kubernetes 清单进行部署，则只有一个副本。

1. 在使用控制器预置AWS资源前，您的集群必须满足特定要求。有关更多信息，请参阅[使用应用程序负载均衡器路由应用程序和 HTTP 流量](alb-ingress.md)和[使用网络负载均衡器路由 TCP 和 UDP 流量](network-load-balancing.md)。

# 使用清单安装 AWS 负载均衡器控制器
<a name="lbc-manifest"></a>

**提示**  
使用 Amazon EKS 自动模式时，您无需安装或升级联网附加组件。自动模式包含容器组联网和负载均衡功能。  
有关更多信息，请参阅 [使用 EKS 自动模式实现集群基础设施自动化](automode.md)。

本主题介绍如何通过下载和应用 Kubernetes 清单来安装控制器。您可以在 GitHub 上查看关于该控制器的完整[文档](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/)。

在以下步骤中，将 example values 替换为您自己的值。

## 先决条件
<a name="lbc-manifest-prereqs"></a>

在开始本教程之前，请完成以下步骤：
+ 创建一个 Amazon EKS 集群。要创建该文件，请参阅 [开始使用 Amazon EKS](getting-started.md)。
+ 在本地计算机上安装 [Helm](https://helm.sh/docs/helm/helm_install/)。
+ 确保适用于 Kubernetes 的 Amazon VPC CNI 插件、`kube-proxy` 和 CoreDNS 附加组件为[服务账户令牌](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)中列出的最低版本。
+ 了解 AWS Elastic Load Balancing 概念。有关更多信息，请参阅 [Elastic Load Balancing 用户指南](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/)。
+ 了解 Kubernetes [服务](https://kubernetes.io/docs/concepts/services-networking/service/)和[入口](https://kubernetes.io/docs/concepts/services-networking/ingress/)资源。

### 注意事项
<a name="lbc-manifest-considerations"></a>

在继续执行本页面的配置步骤之前，请注意以下事项：
+ IAM 策略和角色 (`AmazonEKSLoadBalancerControllerRole`) 可以在同一 AWS 账户中的多个 EKS 集群中重复使用。
+ 如果要在最初创建角色 (`AmazonEKSLoadBalancerControllerRole`) 的同一集群上安装控制器，请先确认角色存在，然后转到[步骤 2：安装 cert-manager](#lbc-cert)。
+ 如果使用的是服务账户的 IAM 角色（IRSA），则必须为每个集群设置 IRSA，并且角色信任策略中的 OpenID Connect（OIDC）提供者 ARN 应特定于每个 EKS 集群。此外，如果要在具有现有 `AmazonEKSLoadBalancerControllerRole` 的新集群上安装控制器，请更新该角色的信任策略以包含新集群的 OIDC 提供者，并通过适当的角色注释创建一个新的服务账户。要确定是否已经拥有 OIDC 提供者或者要创建一个 OIDC 提供者，请参阅[为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。

## 步骤 1：配置 IAM
<a name="lbc-iam"></a>

以下步骤参考 AWS 负载均衡器控制器 **v2.14.1** 发行版。有关所有发行版的更多信息，请参阅 GitHub 上的 [AWS Load Balancer Controller Release](https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/) 页面。

1. 下载AWS负载均衡器控制器的 IAM 策略，该策略允许负载均衡器代表您调用 AWS API。  
**Example**  

------
#### [  AWS  ]

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
   ```

------
#### [  AWS GovCloud (US) ]

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy_us-gov.json
   ```

   ```
   mv iam_policy_us-gov.json iam_policy.json
   ```

------

1. 使用上一步中下载的策略创建一个 IAM 策略。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```
**注意**  
如果您在AWS 管理控制台中查看策略，则控制台会显示有关 **ELB** 服务的警告，但不会显示有关 **ELB v2** 服务的警告。之所以发生这种情况，是因为策略中的某些操作适用于 **ELB v2**，但不适用于 **ELB**。您可以忽略有关 **ELB** 的警告。

**Example**  

1. 请将 *my-cluster* 替换为您的集群的名称，将 *111122223333* 替换为您的账户 ID，然后运行命令。

   ```
   eksctl create iamserviceaccount \
     --cluster=my-cluster \
     --namespace=kube-system \
     --name=aws-load-balancer-controller \
     --role-name AmazonEKSLoadBalancerControllerRole \
     --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
     --approve
   ```

1. 检索集群的 OIDC 提供者 ID 并将其存储在变量中。

   ```
   oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
   ```

1. 确定账户中是否已存在具有集群 ID 的 IAM OIDC 提供者。您需要为集群和 IAM 配置 OIDC。

   ```
   aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
   ```

   如果返回输出，则表示集群已有 IAM OIDC 提供者。如果没有返回输出，则您必须为集群创建 IAM OIDC 提供者。有关更多信息，请参阅 [为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。

1. 将以下内容复制到您的设备。请将 *111122223333* 替换为您的账户 ID。将 *region-code* 替换为您的集群所在的 AWS 区域。将 *EXAMPLED539D4633E53DE1B71EXAMPLE* 替换为上一步中返回的输出。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
               },
               "Action": "sts:AssumeRoleWithWebIdentity",
               "Condition": {
                   "StringEquals": {
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
                   }
               }
           }
       ]
   }
   ```

1. 创建 IAM 角色。

   ```
   aws iam create-role \
     --role-name AmazonEKSLoadBalancerControllerRole \
     --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
   ```

1. 将所需的 Amazon EKS 托管 IAM policy 附加到 IAM 角色。请将 *111122223333* 替换为您的账户 ID。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
     --role-name AmazonEKSLoadBalancerControllerRole
   ```

1. 将以下内容复制到您的设备。请将 *111122223333* 替换为您的账户 ID。替换文本后，运行修改后的命令可创建 `aws-load-balancer-controller-service-account.yaml` 文件。

   ```
   cat >aws-load-balancer-controller-service-account.yaml <<EOF
   apiVersion: v1
   kind: ServiceAccount
   metadata:
     labels:
       app.kubernetes.io/component: controller
       app.kubernetes.io/name: aws-load-balancer-controller
     name: aws-load-balancer-controller
     namespace: kube-system
     annotations:
       eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole
   EOF
   ```

1. 在集群上创建 Kubernetes 服务账户。使用您创建的名为 *AmazonEKSLoadBalancerControllerRole* 的 IAM 角色注释名为 `aws-load-balancer-controller` 的 Kubernetes 服务账户。

   ```
   kubectl apply -f aws-load-balancer-controller-service-account.yaml
   ```

## 步骤 2：安装 `cert-manager`
<a name="lbc-cert"></a>

使用以下方法之一安装 `cert-manager` 以将证书配置注入 Webhook。有关更多信息，请参阅 *cert-manager 文档*中的 [Getting Started](https://cert-manager.io/docs/installation/#getting-started)。

我们建议使用 `quay.io` 容器注册表安装 `cert-manager`。如果您的节点无权访问 `quay.io` 容器注册表，则请使用 Amazon ECR 安装 `cert-manager`（见下文）。

**Example**  

1. 如果您的节点有权访问 `quay.io` 容器注册表，请安装 `cert-manager` 以将证书配置注入 Webhook。

   ```
   kubectl apply \
       --validate=false \
       -f https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
   ```

1. 使用以下方法之一安装 `cert-manager` 以将证书配置注入 Webhook。有关更多信息，请参阅 *cert-manager 文档*中的 [Getting Started](https://cert-manager.io/docs/installation/#getting-started)。

1. 下载清单。

   ```
   curl -Lo cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
   ```

1. 请提取以下镜像并将其推送到节点有权访问的存储库。有关如何提取、标记和推送镜像到您自己的存储库的更多信息，请参阅 [将容器镜像从一个存储库复制到另一个存储库](copy-image-to-repository.md)。

   ```
   quay.io/jetstack/cert-manager-cainjector:v1.13.5
   quay.io/jetstack/cert-manager-controller:v1.13.5
   quay.io/jetstack/cert-manager-webhook:v1.13.5
   ```

1. 请将三个镜像的清单中的 `quay.io` 替换为您自己的注册表名称。以下命令假定您的私有存储库名称与源存储库的名称相同。请将 *111122223333.dkr.ecr.region-code.amazonaws.com* 替换为您的私有注册表。

   ```
   sed -i.bak -e 's|quay.io|111122223333.dkr.ecr.region-code.amazonaws.com|' ./cert-manager.yaml
   ```

1. 运用该清单。

   ```
   kubectl apply \
       --validate=false \
       -f ./cert-manager.yaml
   ```

## 步骤 3：安装 AWS 负载均衡器控制器
<a name="lbc-install"></a>

1. 下载控制器规范。有关控制器的更多信息，请参阅 GitHub 上的[文档](https://kubernetes-sigs.github.io/aws-load-balancer-controller/)。

   ```
   curl -Lo v2_14_1_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_full.yaml
   ```

1. 对文件进行以下编辑。

   1. 如果您已下载 `v2_14_1_full.yaml` 文件，请运行以下命令以删除清单中的 `ServiceAccount` 部分。如果您不删除此部分，系统将覆盖您在上一步中对服务账户所做的必需注释。如果删除此部分，若您删除了控制器，系统还会保留您在上一步中创建的服务账户。

      ```
      sed -i.bak -e '764,772d' ./v2_14_1_full.yaml
      ```

      如果您已下载其他文件版本，请在编辑器中打开此文件，然后删除以下行。

      ```
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        labels:
          app.kubernetes.io/component: controller
          app.kubernetes.io/name: aws-load-balancer-controller
        name: aws-load-balancer-controller
        namespace: kube-system
      ---
      ```

   1. 请将 *my-cluster* 替换为您的集群名称，将文件的 `Deployment` `spec` 部分中的 `your-cluster-name` 替换为您的集群名称。

      ```
      sed -i.bak -e 's|your-cluster-name|my-cluster|' ./v2_14_1_full.yaml
      ```

   1. 如果您的节点无权访问 Amazon EKS Amazon ECR 镜像存储库，则需要提取以下镜像并将其推送到节点有权访问的存储库。有关如何提取、标记和推送镜像到您自己的存储库的更多信息，请参阅 [将容器镜像从一个存储库复制到另一个存储库](copy-image-to-repository.md)。

      ```
      public.ecr.aws/eks/aws-load-balancer-controller:v2.14.1
      ```

      请为清单添加注册表的名称。以下命令假定您的私有存储库名称与源存储库的名称相同，并将您的私有注册表名称添加到文件中。请将 *111122223333.dkr.ecr.region-code.amazonaws.com* 替换为您的注册表。此行假定您的私有存储库名称与源存储库的名称相同。如果不相同，请将私有注册表名称后面的 `eks/aws-load-balancer-controller` 文本给更改为您的存储库名称。

      ```
      sed -i.bak -e 's|public.ecr.aws/eks/aws-load-balancer-controller|111122223333.dkr.ecr.region-code.amazonaws.com/eks/aws-load-balancer-controller|' ./v2_14_1_full.yaml
      ```

   1. （只有 Fargate 或受限的 IMDS 才需要此选项）

      如果要将控制器部署到[限制访问 Amazon EC2 实例元数据服务（IMDS）](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)的 Amazon EC2 节点，或者部署到 Fargate 节点或 Amazon EKS 混合节点功能，则需要在 `- args:` 下添加 `following parameters`。

      ```
      [...]
      spec:
            containers:
              - args:
                  - --cluster-name=your-cluster-name
                  - --ingress-class=alb
                  - --aws-vpc-id=vpc-xxxxxxxx
                  - --aws-region=region-code
      
      
      [...]
      ```

1. 应用文件。

   ```
   kubectl apply -f v2_14_1_full.yaml
   ```

1. 将 `IngressClass` 和 `IngressClassParams` 清单下载到您的集群。

   ```
   curl -Lo v2.14.1_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_ingclass.yaml
   ```

1. 将清单应用于集群。

   ```
   kubectl apply -f v2_14_1_ingclass.yaml
   ```

## 步骤 4：验证控制器是否已安装
<a name="lbc-verify"></a>

1. 验证控制器是否已安装。

   ```
   kubectl get deployment -n kube-system aws-load-balancer-controller
   ```

   示例输出如下。

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

   如果使用 Helm 进行部署，则会收到之前的输出结果。如果您使用 Kubernetes 清单进行部署，则只有一个副本。

1. 在使用控制器预置AWS资源前，您的集群必须满足特定要求。有关更多信息，请参阅[使用应用程序负载均衡器路由应用程序和 HTTP 流量](alb-ingress.md)和[使用网络负载均衡器路由 TCP 和 UDP 流量](network-load-balancing.md)。

# 从已弃用的 ALB 入口控制器迁移应用程序
<a name="lbc-remove"></a>

本主题介绍如何从已弃用的控制器版本迁移。更具体地说，是介绍如何移除 AWS 负载均衡器控制器的已弃用版本。
+ 已弃用的版本无法升级。必须先将其移除，然后再安装当前版本。
+ 已弃用的版本包括：
  +  适用于 Kubernetes 的 AWS ALB 入口控制器（简称“入口控制器”），是 AWS 负载均衡器控制器的前身。
  + 任何 `0.1.x ` 版本的 AWS 负载均衡器控制器

## 移除已弃用的控制器版本
<a name="lbc-remove-desc"></a>

**注意**  
您可能已经使用 Helm 安装了已弃用的版本，或者使用 Kubernetes 清单手动安装了该版本。使用原来安装它的工具完成该过程。

1. 如果您安装了 `incubator/aws-alb-ingress-controller` Helm 图表，请将其卸载。

   ```
   helm delete aws-alb-ingress-controller -n kube-system
   ```

1. 如果安装了 `eks-charts/aws-load-balancer-controller` 图表的 `0.1.x ` 版本，请将其卸载。由于与 Webhook API 版本不兼容，从 `0.1.x ` 升级到版本 `1.0.0` 不起作用。

   ```
   helm delete aws-load-balancer-controller -n kube-system
   ```

1. 检查当前是否安装了该控制器。

   ```
   kubectl get deployment -n kube-system alb-ingress-controller
   ```

   这是未安装控制器情况下的输出。

   ```
   Error from server (NotFound): deployments.apps "alb-ingress-controller" not found
   ```

   这是安装了控制器情况下的输出。

   ```
   NAME                   READY UP-TO-DATE AVAILABLE AGE
   alb-ingress-controller 1/1   1          1         122d
   ```

1. 输入以下命令以删除控制器。

   ```
   kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml
   kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
   ```

## 迁移到 AWS 负载均衡器控制器
<a name="lbc-migrate"></a>

要从适用于 Kubernetes 的 ALB 入口控制器迁移到 AWS 负载均衡器控制器，您需要：

1. 移除 ALB 入口控制器（请参阅上述内容）。

1.  [安装AWS负载均衡器控制器。](aws-load-balancer-controller.md#lbc-overview)

1. 向 AWS 负载均衡器控制器使用的 IAM 角色添加其他策略。此策略允许 LBC 管理由适用于 Kubernetes 的 ALB 入口控制器创建的资源。

1. 下载该 IAM 策略。此策略允许 AWS 负载均衡器控制器管理由适用于 Kubernetes 的 ALB 入口控制器创建的资源。您还可以[查看策略](https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_v1_to_v2_additional.json)。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy_v1_to_v2_additional.json
   ```

1. 如果您的集群位于 AWS GovCloud（美国东部）或 AWS GovCloud（美国西部）AWS 区域，则将 ` arn:aws: ` 替换为 `arn:aws-us-gov:`。

   ```
   sed -i.bak -e 's|arn:aws:|arn:aws-us-gov:|' iam_policy_v1_to_v2_additional.json
   ```

1. 创建 IAM 策略并记下返回的 ARN。

   ```
   aws iam create-policy \
     --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy \
     --policy-document file://iam_policy_v1_to_v2_additional.json
   ```

1. 将 IAM 策略附加到 AWS 负载均衡器控制器使用的 IAM 角色。将 *your-role-name* 替换为角色的名称，例如 `AmazonEKSLoadBalancerControllerRole`。

   如果您使用 `eksctl` 创建该角色，请找到已创建的角色名称，打开 [AWS CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)并选择 **eksctl-*my-cluster*-addon-iamserviceaccount-kube-system-aws-load-balancer-controller** 堆栈。选择**资源**选项卡。角色名称位于 **Physical ID（物理 ID）**列。

   ```
   aws iam attach-role-policy \
     --role-name your-role-name \
     --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
   ```