> ## 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.

# 概述

> 在托管 Kubernetes 上部署 AutoMQ BYOC 的要求、支持平台和机型。

AutoMQ BYOC（Bring Your Own Cloud）环境支持部署到 AWS、Google Cloud、Azure、阿里云、华为云和腾讯云提供的托管 Kubernetes 平台。本文介绍 AutoMQ 部署到 Kubernetes 平台的基本概念和约束。

<Info>
  本文中提及 AutoMQ 产品服务方、AutoMQ 服务方、AutoMQ，均特指 AutoMQ HK Limited 及其附属公司。
</Info>

## 约束和限制

将 AutoMQ 部署到 Kubernetes 上，用户需要遵循如下约束和限制，因用户操作不当，会导致集群部署和变更失败。

### 约束 1： 用户需提供符合要求的独占 Kubernetes 集群

AutoMQ 要求独占的 Kubernetes 集群，不得和其他应用系统共享 Kubernetes 集群，原因如下：

* **Kubernetes 的网络隔离风险：** AutoMQ 面向高吞吐数据传输场景，集群对网络吞吐要求高。Kubernetes 集群内不同 Pod 间网络隔离并不彻底。AutoMQ 需要独立的 Kubernetes 集群，以避免和用户的其他业务系统相互影响。

* **运维授权隔离：** AutoMQ 所在的 Kubernetes 集群需要提供代运维授权（授权 AutoMQ 服务方访问该集群）。AutoMQ 需要独立的 Kubernetes 集群，以避免应用系统越权。

<Tip>
  一个 Kubernetes 集群可以部署多个 AutoMQ 实例。仅建议同一业务域且位于同一云网络的工作负载共享 Kubernetes 集群。
</Tip>

### 约束 2：用户需提供符合要求的专属计算资源

AutoMQ 要求使用专属计算资源。您可以通过托管节点池或 Karpenter 等自动扩缩容组件提供计算资源。计算资源池必须允许创建 AutoMQ 实例时选择的机型和可用区。

<Tip>
  AutoMQ 需要专属计算资源，因此还需要为 Kubernetes 系统组件准备独立、稳定的计算资源池。
</Tip>

* **添加专属标签和污点：** 为防止 Kubernetes 集群内其他工作负载占用 AutoMQ 节点资源，可以为计算资源池添加自定义标签（例如 `node-type=automq`）和污点 `dedicated=automq:NoSchedule`，并通过 [SchedulingSpec](#schedulingspec) 配置对应的节点亲和性和污点容忍。

* **机型符合要求：** 计算资源池必须允许 AutoMQ 在所选云厂商上支持的机型。截至 2026 年 8 月，支持的机型如下：

| **云厂商**<br /> | **允许的机型列表**<br />                                                                                        |
| ------------- | -------------------------------------------------------------------------------------------------------- |
| AWS           | `r6in.large`、`r6i.large`、`m7g.xlarge`、`m7g.2xlarge`、`c6g.2xlarge`、`m7g.4xlarge`、`m6g.medium`             |
| Google Cloud  | `n4d-standard-2`、`n4d-highmem-2`、`n4a-highmem-1`、`n4a-standard-2`、`n4d-standard-4`                       |
| Azure         | `Standard_D4as_v5`、`Standard_D4s_v4`、`Standard_E2as_v5`                                                  |
| 阿里云           | `ecs.r7.large`、`ecs.r6.large`、`ecs.u1-c1m8.large`、`ecs.u1-c1m2.2xlarge`、`ecs.g8y.xlarge`、`ecs.r8y.large` |
| 华为云           | `c6ne.xlarge.4`、`m7.large.8`、`m7n.large.8`                                                               |
| 腾讯云           | `SA5.2XLARGE16`、`SA5.4XLARGE32`、`SA5.LARGE16`、`S6.LARGE16`、`S6.2XLARGE16`、`SA4.2XLARGE16`                |

* **工作负载身份授权要求：** AutoMQ 集群在运行时需要访问对象存储、云盘等服务。为 AutoMQ 工作负载 ServiceAccount 关联的云身份或角色授予所需权限，并确保不会修改或取消授权。

* **可用区（子网要求）：** AutoMQ 同时支持单可用区实例和三可用区实例。托管节点池或 Karpenter NodePool 必须允许实例选择的可用区。

<Tip>
  举例：用户需要创建三个 AutoMQ 实例，分别是实例 1（可用区 A），实例 2（可用区 B），实例 3（可用区 A、B、C）。计算资源池需要分别允许可用区 A、可用区 B 和可用区 A+B+C。
</Tip>

## SchedulingSpec

创建实例时的 **调度配置 YAML** 为可选字段。当 AutoMQ Pod 需要调度到专属 Kubernetes 节点，或需要容忍专属节点的污点时，填写该字段。

### 支持的字段

YAML 支持以下根级字段：

| 字段            | 支持的配置                                                                                                |
| ------------- | ---------------------------------------------------------------------------------------------------- |
| `affinity`    | `nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[]` |
| `tolerations` | 标准 Kubernetes toleration 对象列表                                                                        |

节点亲和性存在以下限制：

* 最多配置一个 `nodeSelectorTerm`。
* `nodeSelectorTerm` 只能包含非空的 `matchExpressions`。
* 每个表达式必须使用 `In` 操作符，并包含 key 和至少一个 value。

调度配置 YAML 不支持 `nodeSelector`、`topologySpreadConstraints`、`matchFields`、Pod affinity 和 Pod anti-affinity。

### 配置专属节点

以下样例同时适用于托管节点池和 Karpenter NodePool。为计算资源池配置：

* 自定义标签：`node-type=automq`
* 污点：`dedicated=automq:NoSchedule`

创建 AutoMQ 实例时填写以下调度配置 YAML：

```yaml theme={null}
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: node-type
              operator: In
              values:
                - automq
tolerations:
  - key: dedicated
    operator: Equal
    value: automq
    effect: NoSchedule
```

使用 Karpenter NodePool 时，在 `spec.template` 中添加该标签和污点，并确保 `spec.template.spec.requirements` 允许 AutoMQ 控制台中选择的实例机型和可用区。

也可以不添加自定义标签，直接匹配云厂商托管 Kubernetes 服务或节点池实现提供的节点池标签。不同云厂商和节点池实现使用的标签不同，请根据目标节点上的实际标签，将上述 `matchExpressions` 中的 key 和 value 替换为对应的节点池标签。

### 系统管理的调度条件

不要在 `matchExpressions` 中填写以下 key：

* `node.kubernetes.io/instance-type`
* `topology.kubernetes.io/zone`

AutoMQ 根据创建表单中的 **实例机型** 和 **可用区** 自动生成这两个条件。如果调度配置 YAML 包含其中任意 key，请求会被拒绝。

负载均衡子网也通过创建表单单独选择。选择覆盖工作负载可用区的子网，不要在调度配置 YAML 中填写子网 ID。

### 排查 Pod Pending

如果 AutoMQ Pod 长时间处于 Pending，检查以下配置：

* 目标节点包含 node affinity 使用的标签。
* 目标节点的每个 `NoSchedule` 污点都有匹配的 toleration。
* 托管节点池或 Karpenter NodePool 允许选择的实例机型和可用区。
* 计算资源池未达到资源上限，并且云厂商在目标可用区有可用容量。

使用以下命令检查调度状态：

```bash theme={null}
kubectl get nodes \
  -L node-type,node.kubernetes.io/instance-type,topology.kubernetes.io/zone
kubectl describe pod <pod-name> --namespace <automq-namespace>
```

使用 Karpenter 时，继续检查 NodePool 和 NodeClaim 状态：

```bash theme={null}
kubectl get nodepools,nodeclaims
```
