参考 概述▸,AutoMQ 支持部署到 Kubernetes 上。本文介绍 AutoMQ 部署到AWS EKS 平台的安装过程。
AutoMQ 将在产品的完整生命周期 内,始终保持与 Amazon Elastic Kubernetes Service (EKS) 及 EKS Anywhere (EKS-A) 的深度、持续集成。为践行该承诺,我们保证:持续的版本兼容: 我们确保 AutoMQ 的每一个新版本,都能兼容当前及未来的 EKS 与 EKS-A 版本。同时,我们主动适配 AWS 平台的更新,为用户提供无缝的、前向兼容的流畅体验。及时的响应与修复: 我们建立了清晰的响应机制,能够快速定位并修复由客户或 AWS 报告的任何配置、安全及非安全问题。

操作流程

步骤 1:安装环境控制台

参考概述▸,AutoMQ 支持部署到 EKS 集群。在 EKS 部署模式下,首先仍然需要安装 AutoMQ 控制台,再通过控制台界面操作 EKS,将集群部署到 EKS。 在 AWS 上,同时支持基于 Marketplace 和 Terraform 安装环境控制台。
注意:在上述安装环境控制台时,从 AWS Marketplace 安装环境▸ 集群部署类型必须设置为 Kubernetes 。这样才能支持后续的步骤 2-4,将 AutoMQ 集群安装到 EKS 上。
AutoMQ 控制台安装完成后,需要从控制台界面或者 Terraform output 输出菜单获取环境控制台地址、初始用户名、密码。

步骤 2:创建 EKS 集群 IAM Role 和 AutoMQ 节点池 IAM Role

AWS 每个 EKS 集群需要绑定 IAM Role,以实现被授权访问用户的 AWS 云资源。因此,创建 EKS 集群前需要先创建 EKS 集群专用的 IAM Role。
  1. 访问 IAM 控制台。点击创建 Role。选择如下参数:
  • Trusted entity type:选择 AWS Service。
  • Service Use case:选择 EKS和 EKS-Cluster。
  1. 点击下一步,输入自定义的角色名称,并创建 IAM Role, 该 Role 用于创建 EKS 集群。
同理,AutoMQ 数据面集群需要独立的节点池,该节点池需要绑定独立的 IAM 角色用于访问云资源的权限验证。因此,在创建 EKS 节点池之前,需要前往 IAM 控制台创建自定义角色。操作步骤如下:
  1. 访问 IAM 控制台。点击创建 Role。选择如下参数:
  • Trusted entity type:选择 AWS Service。
  • Service Use case:选择 EC2。
  1. 点击下一步,添加 EKS 节点池所需的系统权限。
    1. AmazonEC2ContainerRegistryReadOnly
    2. AmazonEKS_CNI_Policy
    3. AmazonEKSWorkerNodePolicy
  2. 点击下一步,输入自定义的角色名称,并创建 IAM Role

步骤 3:创建 EKS 集群

参考概述▸,用户需要提前创建独立的 EKS 集群分配给 AutoMQ 使用。用户可访问AWS EKS 产品控制台按下方步骤操作。
  1. 登录AWS EKS 控制台。点击创建集群
  1. 配置集群基础信息 ,需要关注的配置项,其他配置项保持默认即可。
    1. 选择自定义配置模式。
    2. 关闭 EKS Auto Mode。
    3. 绑定步骤 1 创建的 EKS 集群 IAM Role。
  1. 配置 VPC 网络。 选择目标VPC 和子网。
安全组建议选择 VPC 默认安全组,子网选择所有需要部署集群的私网子网。
  1. 保持其他默认配置,创建 EKS 集群。
  1. EKS 集群创建完成后,需要将 AutoMQ 控制台所在的安全组加入 EKS 集群安全组入站规则。以便 AutoMQ 控制台调用访问 EKS 集群。
编辑入站规则,将 AutoMQ 控制台所在的安全组加入入站规则中,协议选全部流量。

步骤 4:创建 EKS 公共节点组

参考概述▸,用户需要为 EKS 集群创建一个公共节点组,用于部署 EKS 系统组件。参考以下步骤创建符合要求的节点组。
  1. 进入步骤 3 创建的 EKS 集群详情,点击计算菜单创建节点组
  1. 选选择节点组 IAM Role, 参考下方截图,选择 IAM Role(可以复用 AutoMQ 控制台创建的IAMRoleforAutoMQDedicatedNodeGroup, 也可以按照 EKS 推荐创建 Role)。
  1. 选择默认节点组的机型、数量和可用区子网。完成节点组创建。
    1. 机型:建议选择 2C4G 的默认机型即可。
    2. AMI Type:修改为 Amazon Linux 2(AL2_x86_64)。
    3. 数量:建议 2-3 台。满足 EKS 系统组件消耗即可。
    4. 子网:建议填写 EKS 部署需要的子网。
注意:AMI Type 务必选择Amazon Linux 2,默认的 Amazon Linux 2023 暂不支持。

步骤 5:创建 AutoMQ 专用 EKS 节点组

参考概述▸,用户需要为 AutoMQ 创建符合要求的专用节点组,以便后续部署实例申请机器。参考以下步骤创建符合要求的节点组,并完成 IAM 授权。
  1. 进入步骤 3 创建的 EKS 集群详情,点击计算菜单创建节点组
  1. 选择节点组 IAM Role, 参考下方截图,选择步骤 2 创建的节点组 IAM Role**,** 并配置污点。污点的键是dedicated ,值是 automq ,效果是 NO_SCHEDULE
  1. 选择 AutoMQ 专享节点组的机型、数量和可用区子网。完成节点组创建
创建节点组时,只支持单可用区 或者三可用区 ,如果选择了其他数量的可用区,后期无法创建实例。
设置参数
取值说明
机型配置
  • 说明:指定节点组的机型,请参考文档概述▸。填写机型。

注意:AutoMQ 必须运行在指定机型的 VM 中,创建节点组如果选择了非预设的机型,后续无法使用该节点组。

AMI Type

注意:AMI Type 务必选择Amazon Linux 2,默认的 Amazon Linux 2023 暂不支持。

子网
  • 说明:根据实际 AutoMQ 集群的需求,选择一个三个可用区子网

注意:
AutoMQ 要求后续创建集群的可用区和节点组必须完全一致。因此,如果需要创建单可用区的 AutoMQ 集群,则此处创建单可用区节点组;如果需要创建三可用区 AutoMQ 集群,则此处同样创建三可用区节点组,两者不可混用。

数量
  • 说明:建议起步 3 节点,最小节点数设置为 3,最大节点数需要根据 AutoMQ 集群规模合理评估。
AutoMQ 的技术架构具备存算分离和无状态特点。因此,在部分业务场景下节点池可以开启使用 Spot EC2 实例 特性,以进一步降低 AutoMQ 的计算成本。
  1. 为 AutoMQ 使用的节点组创建 Placeholder Deployment 用于加速节点故障场景的 Failover 速度。
工作原理:Placeholder Deployment 的作用是在 Kubernetes 集群的节点上部署一个低优先级的“占位符”应用,预先占用若干节点。当 AutoMQ 集群的 Pod 所在节点出现故障时,可以快速抢占该 Placeholder 的节点,实现快速恢复。
部署 Placeholder Deployment 可以通过 kubectl 命令或者 Kubernetes 控制台进行操作。 首先点击链接,下载名为 automq-low-priority.yaml 的优先级申明文件,执行以下命令,创建优先级申明。

kubectl apply -f automq-low-priority.yaml

然后点击链接,下载 automq-eks-placeholder.yaml 文件。需要根据实际部署的节点池,修改其中的参数:
  • metadata.name : 建议修改成具有意义的 Placeholder 名称,例如 placeholder-for-nodegroup-A
  • replicas : Placeholder pod 预留数量,默认为 1,如果是多可用区部署,建议每个可用区保留 1 台机器,即数量设置为可用区的数量。
  • affinity.nodeAffinity : 用于选择 Placeholder 部署的节点,需要修改 matchExpressions 中的 keyvalues 来精确匹配 AutoMQ 的节点池。在示例的 yaml 文件中提供 2 个选项筛选节点。
    • eks.amazonaws.com/nodegroup :在 EKS 上使用 eks.amazonaws.com/nodegroup 标签筛选指定的节点池。
    • node.kubernetes.io/instance-type :在 EKS 上使用 node.kubernetes.io/instance-type 标签筛选指定的节点机型。
  • resources :
    • limits 的 cpu/memory 与 Node Group 具体的规格保持一致,比如2C16G 。
    • requests 的 cpu/memory 略小于 Node Group 具体的规格,比如实际占用 3/4 比例,确保 Placeholder Pod 能调度到额外 Node 并保证独占效果,避免集群其他 Pod 非预期占用导致实际 Failover 时因资源不足调度失败。
需要修改的参数片段,参考以下 yaml 文件:

metadata:
  # TODO: Replace with your custom name
  name: {Replace with your custom placeholder deployment name}
spec:
  # TODO: Replace with your custom node nums
  replicas: 1
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: eks.amazonaws.com/nodegroup
                  operator: In
                  values:
                  # TODO: Replace with your custom Node Pool Name
                  - "Replace with your custom Node Pool Name"
                - key: node.kubernetes.io/instance-type
                  operator: In
                  values:
                  # TODO: Replace with your custom Node Pool VM Size
                  - "Replace with your custom Node Pool VM Size"
      containers:
        - name: placeholder
          resources:
          # TODO: Replace with your custom Memory and CPU size
            limits:
              cpu: 2000m
              memory: 16Gi
            requests:
              cpu: 1000m
              memory: 12Gi               

修改完成后,执行以下命令,安装 Placeholder。

kubectl apply -f automq-eks-placeholder.yaml

执行完成后,调用以下命令检查 Placeholder Pod 的状态,确保 Placeholder Pod 状态为 Running ,并观察它是否被调度到了期望的节点上。

kubectl get pods -l app=low-priority-placeholder -o wide

步骤 6:初始化本地 Kubectl 和 AWS CLI 工具

AWS EKS 集群创建完成后,一些系统插件例如 CSI、NetworkPolicy 组件默认并不安装,需要手工配置,按照 EKS 插件之前。需要在本地安装 AWS CLI 和 Kubectl 工具。
  1. 安装 AWS CLI 和 Kubectl 工具。参考文档如下:
    1. 安装 AWS CLI 工具
    2. 安装 Kubectl 工具
    3. 安装 Helm 工具。
  2. 输入下方命令生成 KubeConfig 配置文件,这会生成配置文件到默认路径( ~/.kube/config )。用户也可以指定生成的配置文件路径,但需要注意配置环境变量 KUBECONFIG。

// replace the region and cluster-name param
aws eks update-kubeconfig --region <region> --name <cluster-name>

步骤 7:配置 EKS AutoScaler

在创建 AutoMQ 实例以及扩缩容场景下自动扩展 EKS Node,需要配置 EKS AutoScaler 实现节点按需扩展。配置方式如下:
  1. 下载链接 下载 AutoScaler 的配置文件。
  2. 修改配置文件中的,EKS 集群名称参数,保存并执行安装命令。
  1. 执行安装命令,安装 AutoScaler。

// Check the config yaml path
kubectl apply -f cluster-autoscaler-autodiscover.yaml

安装完成后,可以检查 EKS AutoScaler 组件的运行状态,如果找到对应的 Running Deployment 则说明安装成功。

步骤 8:配置 EKS CSI 存储插件

创建 EKS 集群时默认不创建 EKS CSI 存储插件,需要用户手工配置。配置文档参考链接
  1. 参考 EKS 文档,复制 EKS 集群的 OIDC Connect Provider URL。
  1. 前往 IAM 控制台创建 OIDC Provider,用于 EKS 获取 IAM 身份。填写配置信息如下:
    1. Provider Type:选择 OpenID Connect。
    2. Provider URL:填写上一步复制的 URL。
    3. Audience:填写 sts.amazonaws.com
  1. 基于该Web Identity 创建 CSI 专用的 IAM Role。填写配置项如下:
    1. Trusted entity type: 选择 Web identity。
    2. Identity Provider:选择上一步创建的 Identity Provider。
    3. Audience:填写 sts.amazonaws.com
    4. Policy:选择 AmazonEBSCSIDriverPolicy
  2. 创建 IAM Role 后,进入该 Role 详情页,点击 Edit trust policy,在原有的 json 文件中添加如下一行。
需要注意修改其中的 RegionCode 和 ProviderID,ProviderID 类似EXAMPLED539D4633E53DE1B7XXXXAMPLE。

"oidc.eks.{RegionCode}.amazonaws.com/id/{ProviderID}:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"

  1. 进入 EKS 集群,选择 AddOn Tab,添加 Amazon EBS CSI Driver。注意 IAM Role 选择上一步创建的 IAM Role。

步骤 9: 开启 EKS NetworkPolicy

AutoMQ 支持集群访问来源控制,即限定特定 IP 来源的客户端访问集群,该功能基于 NetworkPolicy 实现,因此需要开启 EKS NetworkPolicy。
  1. 在 EKS 控制台 Add-on 标签内选择 AWS VPC CNI 并点击编辑
  1. 展开 Optional configuration settings,在 Configuration values 中添加如下 JSON,选择 Override 模式并保存。

{
    "enableNetworkPolicy": "true"
}

步骤 10:安装 AWS Load Balancer Controller

AWS 默认不提供 Load Balancer Controller 的安装,需要用户手动安装插件。安装步骤如下:
  1. 添加 Helm 仓库,并安装 AWS Load Balancer CRD。

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" 

  1. 修改下方命令中的 eks-cluster-id,设置为实际的集群 ID,并执行。

helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=<eks-cluster-id>

  1. 验证安装效果。

步骤 11: 授权 AutoMQ 控制台管理 EKS 集群

首次进入 AutoMQ BYOC 控制台,需要创建部署配置,设置 Kubernetes 集群信息和授权才可正常使用。
  1. 前往 EKS 集群,点击 Access 菜单,创建 Access Entry。
  1. 选择步骤 1 安装环境控制台生成的 AutoMQ 专用的 IAM Role,类型设置为 Standard。
选择授权的 Policy 为 AmazonEKSClusterAdminPolicy ,范围为 Cluster ,创建。

步骤 12:进入环境控制台,创建部署配置

登录控制台,录入集群名称等配置,点击下一步。
  1. 部署类型:选择 Kubernetes。
  2. Kubernetes 集群:填写 EKS 集群的集群名称。
  3. DNS ZoneId:填写用于部署 AutoMQ 的 Route53 PrivateZone 的 ZoneId。
  4. Bucket 名称:填写用于部署 AutoMQ 存储消息的数据 Bucket,支持添加多个 S3 Bucket。
  1. 填写云资源信息后,生成数据面 GKE 节点池需要授权的权限。参考控制台指引,创建自定义授权策略 。然后将授权策略绑定到步骤 2 创建的 AutoMQ IAM 委托,并录入该节点池委托名称点击下一步预览
  1. 预览部署配置信息,完成创建 。即可前往实例管理页面创建实例。