> ## Documentation Index
> Fetch the complete documentation index at: https://docs.automq.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 部署到AWS EKS

> AutoMQ 支持完整的Kafka兼容性，基于AWS EKS的云原生架构，提供高效和可扩展的消息队列服务。

参考 [概述▸](/zh/automq-cloud/deploy-automq-on-kubernetes/overview)，AutoMQ 支持部署到 Kubernetes 上。本文介绍 AutoMQ 部署到AWS EKS 平台的安装过程。

<Info>
  AutoMQ 将在产品的**完整生命周期** 内，始终保持与 Amazon Elastic Kubernetes Service (EKS) 及 EKS Anywhere (EKS-A) 的深度、持续集成。

  为践行该承诺，我们保证：

  **持续的版本兼容：** 我们确保 AutoMQ 的每一个新版本，都能兼容当前及未来的 EKS 与 EKS-A 版本。同时，我们主动适配 AWS 平台的更新，为用户提供无缝的、前向兼容的流畅体验。

  **及时的响应与修复：** 我们建立了清晰的响应机制，能够快速定位并修复由客户或 AWS 报告的任何配置、安全及非安全问题。
</Info>

## 准备 EKS 集群和计算资源

如果您期望将在 Kubernetes 上运行 AutoMQ 集群，您需要准备一个 EKS 集群以供 AutoMQ 使用。如果期望在 EC2 上部署 AutoMQ 集群，则无需准备 EKS 集群。

### 步骤 1：创建所需的 IAM Role

在创建 EKS 集群和计算资源之前，需要先创建专用的 IAM Role。此 Role 用于 EKS 集群自身的服务授权。

1. 访问 IAM 控制台，点击创建 Role。
2. **Trusted entity type**：选择 **AWS Service**。
3. **Service Use case**：选择 **EKS-Cluster**。
4. 点击下一步，输入自定义的角色名称，并创建 IAM Role。

如果使用 EKS 托管节点组，再按照 AWS 文档[《Amazon EKS 节点 IAM 角色》](https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/create-node-role.html)创建节点组 IAM Role。如果使用 Karpenter，准备 EC2NodeClass 引用的节点 Role。

### 步骤 2：创建 EKS 集群

1. 登录 AWS [EKS 控制台](https://console.aws.amazon.com/eks/home)，点击**创建集群**，选择自定义创建模式。
2. **配置集群基础信息**：
   * 绑定上一步创建的 EKS 集群 IAM Role。
   * 选择 EKS 支持且符合 AutoMQ 版本要求的 Kubernetes 版本。
3. **配置 VPC 网络**：
   * 选择您为 AutoMQ 准备的 VPC，这个 VPC 应该与应用所在的 VPC 保持一致。
   * 选择用于部署集群的私网子网。
   * 安全组建议选择 VPC 的默认安全组。
4. 保持其他默认配置，创建 EKS 集群。
5. **授权控制台访问**。
   为了让 AutoMQ 控制台能够管理 EKS 集群，需要为控制台使用的 IAM Role 授权。
   1. 前往 EKS 集群的 **Access** 菜单，点击 **Create Access Entry**。
   2. 选择 AutoMQ 控制台使用的 IAM Role（通常在安装控制台时创建）。
   3. **Type** 设置为 **Standard**。
   4. 点击下一步，在 **Add access policy** 页面，选择 **AmazonEKSClusterAdminPolicy** 策略。
   5. **Scope** 选择 **Cluster**，点击添加。
   6. 完成创建。
6. **设置安全组规则，允许 EKS 集群外访问 Pod 以及 EKS API Server 服务。**。

   <Info>
     AutoMQ 控制台需要调用 EKS 集群的 API Server，因此需要确保控制台所在网络可以访问 API Server 的 443 端口。此外，AutoMQ Broker 需要对外暴露服务端口。如果集群外的组件（包括 AutoMQ 控制台和 Producer/Consumer 应用）需要访问 AutoMQ，需要为 EKS 集群安全组添加入站规则。

     * **端口**: `443`, `9090`, `9092`, `9102`, `9122`, `9112`, `8083`。
     * **来源**：根据 AutoMQ 控制台和应用所在位置设置对应的 CIDR 或安全组。
   </Info>

### 步骤 3：准备 EKS 计算资源

为 Kubernetes 系统组件准备稳定计算资源，并为 AutoMQ 工作负载准备专属计算资源。AutoMQ 专属计算资源可以使用 EKS 托管节点组或 Karpenter。

#### 1. 创建系统节点组

1. 进入 EKS 集群详情页，点击 **计算** 菜单，选择 **创建节点组**。
2. **IAM Role**：选择在 **步骤 1** 中创建的节点组 IAM Role。
3. **机型配置**：选择 `t3.medium` 或同等规格的机型，数量建议为 2-3 台。
4. **子网**：选择 EKS 部署所需的所有私网子网。
5. 完成节点组创建。

#### 2. 准备 AutoMQ 专属计算资源

选择以下任一种计算资源形态。

**EKS 托管节点组**

1. 进入 **计算** 菜单，选择 **创建节点组**。
2. **IAM Role**：选择在 **步骤 1** 中创建的节点组 IAM Role。
3. **自定义标签**：添加 `node-type=automq`。
4. **污点**：添加键 `dedicated`、值 `automq`、效果 `NO_SCHEDULE`。
5. **机型配置**：选择 AutoMQ 控制台支持的实例机型。
6. **子网**：根据 AutoMQ 实例规划，选择一个或三个可用区的私网子网。
7. **扩缩容配置**：设置能够满足规划节点数的最大节点数，建议期望节点数从 3 个节点起步。
8. 完成节点组创建。

**Karpenter NodePool**

1. 在 `spec.template` 中添加自定义标签 `node-type=automq` 和污点 `dedicated=automq:NoSchedule`。
2. 确保 `spec.template.spec.requirements` 允许 AutoMQ 控制台中选择的实例机型和可用区。
3. 配置能够满足 AutoMQ 规划节点数的 CPU 和内存上限。

Karpenter 的安装和 EC2NodeClass 配置参考 [Karpenter 入门文档](https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/)。托管节点组和 Karpenter NodePool 使用相同的 [SchedulingSpec](/zh/automq-cloud/deploy-automq-on-kubernetes/overview#schedulingspec)。

#### 3. 准备 Kafka Connector 计算资源（可选）

如果期望使用 AutoMQ 提供的托管 Kafka Connect 服务，还需要为 Connector 准备节点资源。可以参考系统节点组的操作方法创建独立节点池，或者扩容系统节点组，确保拥有充足的计算资源。

### 步骤 4：初始化本地工具并配置 EKS 插件

新创建的 EKS 集群需要安装一些必要的系统插件才能配合 AutoMQ 工作。

#### 1. 初始化本地工具

1. 在您的本地环境安装并配置 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)、[kubectl](https://kubernetes.io/docs/tasks/tools/) 和 [Helm](https://helm.sh/docs/intro/install/)。
2. 执行以下命令，生成 KubeConfig 配置文件，以便 `kubectl` 可以连接到您的 EKS 集群。
   ```bash theme={null}
   # 将 <region> 和 <cluster-name> 替换为您的实际值
   aws eks update-kubeconfig --region <region> --name <cluster-name>
   ```

#### 2. 为托管节点组配置 Cluster Autoscaler（可选）

EKS 托管节点组需要按需扩缩容时，配置 Cluster Autoscaler。使用 Karpenter 时跳过此步骤，Karpenter 通过自身控制器创建节点。

1. 从[下载链接](https://download.automq.com/eks-config/cluster-autoscaler-autodiscover.yaml)下载 AutoScaler 的配置文件。
2. 修改配置文件，将其中的 `<YOUR CLUSTER NAME>` 替换为您的 EKS 集群名称。
3. 执行安装命令：
   ```bash theme={null}
   kubectl apply -f cluster-autoscaler-autodiscover.yaml
   ```

#### 3. 准备 EKS 插件所需的 IAM 授权

Amazon EBS CSI Driver 和 AWS Load Balancer Controller 需要 IAM 权限来操作 AWS 资源。下方示例命令使用 IRSA 和 `eksctl`，因此需要先为 EKS 集群创建 IAM OIDC Provider。详细操作请参考 AWS 官方文档[《为您的集群创建 IAM OIDC 提供商》](https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

这里的 OIDC Provider 用于后续 EKS 插件安装。AutoMQ 工作负载 Pod 可以使用 EKS Pod Identity 或 IRSA 获取 IAM Role 权限，请在[步骤 5](#步骤-5准备-automq-工作负载的-iam-role-和-serviceaccount)中准备对应的 IAM Role 和 ServiceAccount。

#### 4. 配置 Amazon EBS CSI Driver

EKS 集群需要此插件来管理存储卷。

1. 参考 AWS 官方文档[《Amazon EBS CSI driver》](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)的步骤，在上述创建 OIDC Provider 后，创建一个专用于 CSI Driver 的 IAM Role。
2. 完成 IAM Role 和 Trust Policy 的配置后，进入 EKS 集群控制台的 **Add-ons** 标签页，添加 **Amazon EBS CSI Driver**，并选择上一步创建的 IAM Role。

#### 5. 安装 AWS Load Balancer Controller

此插件用于管理 Load Balancer，为 AutoMQ 提供 EKS 集群外部访问入口。安装 Load Balancer Controller 可以参考[官方文档](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/deploy/installation/#option-b-attach-iam-policies-to-nodes)。

1. 执行以下命令，生成 IAM Policy。
   ```bash theme={null}
   curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.10.0/docs/install/iam_policy.json
   aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam-policy.json
   ```
2. 创建一个 IAM Role，并将上一步创建的 Policy 附加到该 Role。
   ```bash theme={null}
   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 <region-code> \
     --approve
   ```
3. 添加 Helm 仓库并安装 CRD：
   ```bash theme={null}
   helm repo add eks https://aws.github.io/eks-charts
   kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
   ```
4. 执行安装命令，注意将 `<eks-cluster-id>` 替换为您的集群名称，将 `<Your RegionID>` 替换为您的区域 ID，将 `<Your VPCID>` 替换为您的 VPC ID：
   ```bash theme={null}
   helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=<eks-cluster-id> --set region=<Your RegionID> --set vpcId=<Your VPCID>
   ```

### 步骤 5：准备 AutoMQ 工作负载的 IAM Role 和 ServiceAccount

AutoMQ 数据面 Pod 需要访问 S3 等云资源。创建 AutoMQ 实例前，您需要为 AutoMQ 工作负载准备一个 IAM Role 和一个 Kubernetes ServiceAccount。

ServiceAccount 与 IAM Role 的绑定可以使用以下任一方式：

| 方式               | 适用场景                                                     | Trust Policy 差异                                                                     | ServiceAccount 绑定方式                                                         |
| ---------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| EKS Pod Identity | 新建 EKS 集群时推荐使用，由 EKS 管理 IAM Role 与 ServiceAccount 的关联关系。 | Role 信任 AWS 服务主体 `pods.eks.amazonaws.com`，并允许 `sts:AssumeRole` 和 `sts:TagSession`。  | 创建 EKS Pod Identity Association，关联集群、命名空间、ServiceAccount 和 IAM Role。        |
| IRSA             | 适用于已有 IRSA/OIDC 自动化、需要兼容现有流程，或 Pod Identity 不支持的工作负载类型。  | Role 信任集群 OIDC Provider 作为 Federated Principal，并允许 `sts:AssumeRoleWithWebIdentity`。 | 在 Kubernetes ServiceAccount 上添加 `eks.amazonaws.com/role-arn=<role-arn>` 注解。 |

<Tip>
  两种方式下，IAM Role 挂载的权限策略可以相同。关键差异在 IAM Role 的 Trust Policy，以及 ServiceAccount 与 IAM Role 的关联方式。详细步骤请参考[附录：为 AutoMQ 工作负载配置 EKS Pod Identity](#附录为-automq-工作负载配置-eks-pod-identity)和[附录：为 AutoMQ 工作负载配置 IRSA](#附录为-automq-工作负载配置-irsa)。
</Tip>

## 安装环境控制台

完成 EKS 集群和计算资源准备后，根据运维需求选择[在 EC2 上部署 AutoMQ 控制台▸](/zh/automq-cloud/getting-started/install-byoc-environment/aws/install-automq-on-aws#在-ec2-上部署-automq-控制台)或[在 EKS 上部署 AutoMQ 控制台▸](/zh/automq-cloud/getting-started/install-byoc-environment/aws/install-automq-on-aws#在-eks-上部署-automq-控制台)。控制台的部署方式不限制 AutoMQ 数据面在 EKS 上运行。

## 创建 Kubernetes 形态的 AutoMQ 实例

登录 AutoMQ 控制台并创建实例，配置以下字段：

1. **部署类型**：选择 **Kubernetes**。
2. **VPC 和可用区**：选择 EKS 使用的 VPC，并选择一个或三个工作负载可用区。
3. **Kubernetes 集群**：选择目标 EKS 集群。
4. **负载均衡子网**：选择覆盖工作负载可用区的 NLB 子网。
5. **实例机型**：选择托管节点组或 Karpenter NodePool 允许的机型。
6. **调度配置 YAML**：如果专属计算资源池配置了标签或污点，填写对应的 [SchedulingSpec](/zh/automq-cloud/deploy-automq-on-kubernetes/overview#schedulingspec)。
7. 预览配置并创建实例。

AutoMQ 会将选择的实例机型和可用区添加到最终 Kubernetes 调度条件中，不要在调度配置 YAML 中重复填写这两个条件。

## 附录：为 AutoMQ 工作负载配置 EKS Pod Identity

完整操作请参考 AWS 官方文档[《了解 EKS Pod Identity 如何向 Pod 授予 AWS 服务访问权限》](https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/pod-identities.html)。

开始前，请确认集群已安装 EKS Pod Identity Agent。如果集群已启用 EKS Auto Mode，则无需执行该步骤。用于直接创建 Pod Identity Association 的 IAM Role 必须与 EKS 集群属于同一个 AWS 账号。同时，创建 Association 的 AWS 主体需要拥有该 IAM Role 的 `iam:PassRole` 权限。

1. 创建 IAM Role，并挂载 AutoMQ 所需的 IAM 权限策略。

2. 为 EKS Pod Identity 配置 Role Trust Policy：

   ```json theme={null}
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
         "Effect": "Allow",
         "Principal": {
           "Service": "pods.eks.amazonaws.com"
         },
         "Action": [
           "sts:AssumeRole",
           "sts:TagSession"
         ],
         "Condition": {
           "StringEquals": {
             "aws:RequestTag/kubernetes-namespace": "<automq-namespace>",
             "aws:RequestTag/kubernetes-service-account": "<automq-service-account>"
           }
         }
       }
     ]
   }
   ```

3. 创建命名空间和 ServiceAccount：

   ```bash theme={null}
   kubectl create namespace <automq-namespace>
   kubectl create serviceaccount <automq-service-account> -n <automq-namespace>
   ```

4. 创建 Pod Identity Association：

   ```bash theme={null}
   aws eks create-pod-identity-association \
     --cluster-name <cluster-name> \
     --namespace <automq-namespace> \
     --service-account <automq-service-account> \
     --role-arn arn:aws:iam::<aws-account-id>:role/<automq-role-name> \
     --region <region-code>
   ```

5. 创建 AutoMQ 实例前，确认关联状态正常，并且 ServiceAccount 已存在于目标命名空间。

## 附录：为 AutoMQ 工作负载配置 IRSA

完整操作请参考 AWS 官方文档[《适用于服务账户的 IAM 角色》](https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/iam-roles-for-service-accounts.html)。

1. 为 EKS 集群创建 IAM OIDC Provider。每个集群只需要执行一次。

   ```bash theme={null}
   eksctl utils associate-iam-oidc-provider \
     --cluster <cluster-name> \
     --region <region-code> \
     --approve
   ```

2. 创建 IAM Role，并挂载 AutoMQ 所需的 IAM 权限策略。

3. 为 IRSA 配置 Role Trust Policy：

   ```json theme={null}
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::<aws-account-id>:oidc-provider/oidc.eks.<region-code>.amazonaws.com/id/<oidc-provider-id>"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "oidc.eks.<region-code>.amazonaws.com/id/<oidc-provider-id>:aud": "sts.amazonaws.com",
             "oidc.eks.<region-code>.amazonaws.com/id/<oidc-provider-id>:sub": "system:serviceaccount:<automq-namespace>:<automq-service-account>"
           }
         }
       }
     ]
   }
   ```

4. 创建命名空间和 ServiceAccount，并为 ServiceAccount 添加 IAM Role ARN 注解：

   ```bash theme={null}
   kubectl create namespace <automq-namespace>
   kubectl create serviceaccount <automq-service-account> -n <automq-namespace>
   kubectl annotate serviceaccount <automq-service-account> \
     -n <automq-namespace> \
     eks.amazonaws.com/role-arn=arn:aws:iam::<aws-account-id>:role/<automq-role-name>
   ```

5. 创建 AutoMQ 实例前，确认带有注解的 ServiceAccount 已存在于目标命名空间。
